blob: 574af9caf26d6970705caa246753548466cb81d4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.qpid.protonj2.engine;
import java.util.Set;
/**
* AMQP Session interface
*/
public interface Session extends Endpoint<Session> {
/**
* @return the local session state
*/
SessionState getState();
/**
* @return the parent {@link Connection} for this Session.
*/
Connection getConnection();
/**
* @return the parent {@link Connection} of the {@link Link}
*/
@Override
Connection getParent();
/**
* Returns a {@link Set} of all {@link Sender} and {@link Receiver} instances that are being tracked by
* this {@link Session}.
*
* @return a set of Sender and Receiver instances tracked by this session.
*/
Set<Link<?>> links();
/**
* Returns a {@link Set} of {@link Sender} instances that are being tracked by this {@link Session}.
*
* @return a set of Sender instances tracked by this session.
*/
Set<? extends Sender> senders();
/**
* Returns a {@link Set} of {@link Receiver} instances that are being tracked by this {@link Session}.
*
* @return a set of Receiver instances tracked by this session.
*/
Set<? extends Receiver> receivers();
//----- Session sender and receiver factory methods
/**
* Create a new {@link Sender} link using the provided name.
*
* @param name
* The name to assign to the created {@link Sender}
*
* @return a newly created {@link Sender} instance.
*
* @throws IllegalStateException if the {@link Session} has already been closed.
*/
Sender sender(String name) throws IllegalStateException;
/**
* Create a new {@link Receiver} link using the provided name
*
* @param name
* The name to assign to the created {@link Receiver}
*
* @return a newly created {@link Receiver} instance.
*
* @throws IllegalStateException if the {@link Session} has already been closed.
*/
Receiver receiver(String name) throws IllegalStateException;
/**
* Create a new {@link TransactionController} using the provided name.
*
* @param name
* The name to assign to the created {@link TransactionController}
*
* @return a newly created {@link TransactionController} instance.
*
* @throws IllegalStateException if the {@link Session} has already been closed.
*/
TransactionController coordinator(String name) throws IllegalStateException;
//----- Configure the local end of the Session
/**
* Sets the maximum number of bytes this session can be sent from the remote.
*
* @param incomingCapacity
* maximum number of incoming bytes this session will allow
*
* @return this {@link Session} instance.
*
* @throws IllegalStateException if the {@link Session} has already been closed.
*/
Session setIncomingCapacity(int incomingCapacity) throws IllegalStateException;
/**
* @return the current incoming capacity of this session.
*/
int getIncomingCapacity();
/**
* @return the remaining session capacity based on how many bytes are currently pending,
*/
int getRemainingIncomingCapacity();
/**
* Sets the maximum number of bytes this session can be write before blocking additional
* sends until the written bytes are known to have been flushed to the write. This limit
* is intended to deal with issues of memory allocation when the I/O layer allows for
* asynchronous writes and finer grained control over the pending write buffers is needed.
*
* @param outgoingCapacity
* maximum number of outgoing bytes this session will allow before stopping senders from sending.
*
* @return this {@link Session} instance.
*
* @throws IllegalStateException if the {@link Session} has already been closed.
*/
Session setOutgoingCapacity(int outgoingCapacity) throws IllegalStateException;
/**
* @return the current outgoing capacity limit of this session.
*/
int getOutgoingCapacity();
/**
* @return the remaining session outgoing capacity based on how many bytes are currently pending,
*/
int getRemainingOutgoingCapacity();
/**
* Set the handle max value for this Session.
*
* The handle max value can only be modified prior to a call to {@link Session#open()},
* once the session has been opened locally an error will be thrown if this method
* is called.
*
* @param handleMax
* The value to set for handle max when opening the session.
*
* @return this {@link Session} instance.
*
* @throws IllegalStateException if the Session has already been opened.
*/
Session setHandleMax(long handleMax) throws IllegalStateException;
/**
* @return the currently configured handle max for this {@link Session}
*/
long getHandleMax();
//----- View the remote end of the Session configuration
/**
* @return the remote session state (as last communicated)
*/
SessionState getRemoteState();
//----- Remote events for AMQP Session resources
/**
* Sets a {@link EventHandler} for when an AMQP Attach frame is received from the remote peer for a sending link.
*
* Used to process remotely initiated sending link. Locally initiated links have their own EventHandler
* invoked instead. This method is Typically used by servers to listen for remote Receiver creation.
* If an event handler for remote sender open is registered on this Session for a link scoped to it then
* this handler will be invoked instead of the variant in the Connection API.
*
* @param remoteSenderOpenEventHandler
* the EventHandler that will be signaled when a sender link is remotely opened.
*
* @return this session for chaining
*/
Session senderOpenHandler(EventHandler<Sender> remoteSenderOpenEventHandler);
/**
* Sets a {@link EventHandler} for when an AMQP Attach frame is received from the remote peer for a receiving link.
*
* Used to process remotely initiated receiving link. Locally initiated links have their own EventHandler
* invoked instead. This method is Typically used by servers to listen for remote Sender creation.
* If an event handler for remote sender open is registered on this Session for a link scoped to it then
* this handler will be invoked instead of the variant in the Connection API.
*
* @param remoteReceiverOpenEventHandler
* the EventHandler that will be signaled when a receiver link is remotely opened.
*
* @return this session for chaining
*/
Session receiverOpenHandler(EventHandler<Receiver> remoteReceiverOpenEventHandler);
/**
* Sets a {@link EventHandler} for when an AMQP Attach frame is received from the remote peer for a transaction
* coordination link.
*
* Used to process remotely initiated transaction manager link. Locally initiated links have their own EventHandler
* invoked instead. This method is Typically used by servers to listen for remote {@link TransactionController}
* creation. If an event handler for remote {@link TransactionController} open is registered on this Session for a
* {@link TransactionController} scoped to it then this handler will be invoked instead of the variant in the
* {@link Connection} API.
*
* @param remoteTxnManagerOpenEventHandler
* the EventHandler that will be signaled when a {@link TransactionController} link is remotely opened.
*
* @return this session for chaining
*/
Session transactionManagerOpenHandler(EventHandler<TransactionManager> remoteTxnManagerOpenEventHandler);
}