From 082815b1634d67ae0bbf356025b9e451da0dbdcc Mon Sep 17 00:00:00 2001
From: Arnaud Simon A session is associated with a connection.
* When created a Session is not attached with an underlying channel.
* Session is single threaded This is a convinience method for providing a complete message
* using a single method which internaly is mapped to messageTransfer(), headers() followed
- * by data() and an endData().
+ * by data() and an endData().
* This method should only be used by small messages This is a convinience method for streaming a message using pull semantics
* using a single method as opposed to doing a push using messageTransfer(), headers() followed
- * by a series of data() and an endData().command1 will be synchronously invoked using the following sequence:
+ *
+ *
*/
public interface Session
{
- public static final short ACQUIRE_ANY_AVAILABLE_MESSAGE = 0;
- public static final short ACQUIRE_MESSAGES_IF_ALL_ARE_AVAILABLE = 0;
public static final short TRANSFER_ACQUIRE_MODE_NO_ACQUIRE = 0;
public static final short TRANSFER_ACQUIRE_MODE_PRE_ACQUIRE = 1;
public static final short TRANSFER_CONFIRM_MODE_REQUIRED = 1;
@@ -44,17 +49,21 @@ public interface Session
public static final short MESSAGE_FLOW_MODE_WINDOW = 1;
public static final short MESSAGE_FLOW_UNIT_MESSAGE = 0;
public static final short MESSAGE_FLOW_UNIT_BYTE = 1;
+ public static final short MESSAGE_REJECT_CODE_GENERIC = 0;
+ public static final short MESSAGE_REJECT_CODE_IMMEDIATE_DELIVERY_FAILED = 1;
+ public static final short MESSAGE_ACQUIRE_ANY_AVAILABLE_MESSAGE = 0;
+ public static final short MESSAGE_ACQUIRE_MESSAGES_IF_ALL_ARE_AVAILABLE = 1;
//------------------------------------------------------
// Session housekeeping methods
//------------------------------------------------------
-
+
/**
* Sync method will block until all outstanding commands
* are executed.
*/
public void sync();
-
+
/**
* Close this session and any associated resources.
*/
@@ -73,93 +82,109 @@ public interface Session
//------------------------------------------------------
/**
* Transfer the given message to a specified exchange.
- *
+ *
* session.command1()
+ * session.sync()
+ * off (0): confirmation is not required, once a message has been transferred in pre-acquire
+ * @param confirmMode
off ({@link Session#TRANSFER_CONFIRM_MODE_NOT_REQUIRED}): confirmation
+ * is not required, once a message has been transferred in pre-acquire
* mode (or once acquire has been sent in no-acquire mode) the message is considered
* transferred
*
- *
- * @param acquireMode
- *
+ * @param acquireMode
+ *
+ * @throws java.io.IOException If transferring a message fails due to some internal communication error.
*/
- public void messageTransfer(String destination, Message msg, short confirmMode, short acquireMode)throws IOException;
-
+ public void messageTransfer(String destination, Message msg, short confirmMode, short acquireMode)
+ throws IOException;
+
/**
*
Internally data will be pulled from Message object(which wrap's a data stream) using it's read()
* and pushed using messageTransfer(), headers() followed by a series of data() and an endData().
*
This method should only be used by large messages
* There are two convinience Message classes provided to facilitate this.
*
FileMessage
- * StreamingMessage
+ * {@link org.apache.qpidity.client.util.FileMessage}
+ * {@link org.apache.qpidity.client.util.StreamingMessage}
* Message interface to and wrap any
* data stream you want.
*
- *
+ *
* @param destination The exchange the message is being sent.
- * @param msg The Message to be sent
- * @param confirmMode This way of transferring messages is useful when streaming large messages *
In the interval [messageTransfer endData] any attempt to call a method other than - * {@link Session#addMessageHeaders}, {@link Session#endData} ore {@link Session#close} + * {@link Session#headers}, {@link Session#endData} ore {@link Session#sessionClose} * will result in an exception being thrown. * - * @param confirmMode
DeliveryProperties or ApplicationProperties
+ * @param headers Are either {@link org.apache.qpidity.DeliveryProperties}
+ * or {@link org.apache.qpidity.MessageProperties}
* @see org.apache.qpidity.DeliveryProperties
+ * @see org.apache.qpidity.MessageProperties
*/
public void headers(Struct... headers);
@@ -169,21 +194,24 @@ public interface Session
* @param data Data to be added.
*/
public void data(byte[] data);
-
+
/**
* Add the following ByteBuffer to the content of the message being sent.
+ * Note that only the data between the buffer current position and the + * buffer limit is added. + * It is therefore recommended to flip the buffer before adding it to the message, * - * @param data Data to be added. - */ + * @param buf Data to be added. + */ public void data(ByteBuffer buf); /** * Add the following String to the content of the message being sent. * - * @param data Data to be added. - */ + * @param str String to be added. + */ public void data(String str); - + /** * Signals the end of data for the message. */ @@ -198,35 +226,38 @@ public interface Session * Associate a message listener with a destination. *
The destination is bound to a queue and messages are filtered based * on the provider filter map (message filtering is specific to the provider and may not be handled). - *
- *Following are the valid options + *
Following are valid options: *
In the absence of a particular option, defaul values are: - *
If the no-local field is set the server will not send + * messages to the connection that + * published them. + *
Request exclusive subscription access, meaning only this + * ubscription can access the queue. + *
Has no effect as it represents an “empty” option. *
Only one listerner per destination is allowed. This means * that the previous message listener is replaced. This is done gracefully i.e. the message * listener is replaced once it return from the processing of a message. * - * // todo when a listener is null then received messages must be released - * * @param destination The destination the listener is associated with. * @param listener The new listener for this destination. */ @@ -258,20 +287,18 @@ public interface Session /** * Sets the mode of flow control used for a given destination. - *
- * With credit based flow control, the broker continually maintains its current + *With credit based flow control, the broker continually maintains its current * credit balance with the recipient. The credit balance consists of two values, a message * count, and a byte count. Whenever message data is sent, both counts must be decremented. * If either value reaches zero, the flow of message data must stop. Additional credit is * received via the {@link Session#messageFlow} method. - *
- * Window based flow control is identical to credit based flow control, however message + *Window based flow control is identical to credit based flow control, however message * acknowledgment implicitly grants a single unit of message credit, and the size of the * message in byte credits for each acknowledged message. * * @param destination The destination to set the flow mode on. - * @param mode
The broker's credit will always be zero when * this method completes. This method does not complete until all the message transfers occur. - *
This method returns the number of flushed messages. + *
This method returns the number of flushed messages. * * @param destination The destination to call flush on. */ @@ -327,17 +354,31 @@ public interface Session /** * Reject ranges of acquired messages. - *
A rejected message will not be delivered to any receiver - * and may be either discarded or moved to the broker dead letter queue. + *
The broker MUST deliver rejected messages to the + * alternate-exchange on the queue from which it was delivered. If no alternate-exchange is + * defined for that queue the broker MAY discard the message. * * @param ranges Range of rejected messages. - * @param code TODO - * @param text TODO + * @param code The reject code must be one of {@link Session#MESSAGE_REJECT_CODE_GENERIC} or + * {@link Session#MESSAGE_REJECT_CODE_IMMEDIATE_DELIVERY_FAILED} (immediate delivery was attempted but + * failed). + * @param text String describing the reason for a message transfer rejection. */ public void messageReject(RangeSet ranges, int code, String text); - - /** - * @return the rejected message ranges + + /** + * As it is possible that the broker does not manage to reject some messages, after completion of + * {@link Session#messageReject} this method will return the ranges of rejected messages. + *
Note that {@link Session#messageReject} and this methods are asynchronous therefore for accessing to the + * previously rejected messages this method must be invoked in conjunction with {@link Session#sync()}. + *
A recommended invocation sequence would be: + *
This method should only be called on non-acquired messages. - * @param mode TODO - * @param range Ranges of messages to be acquired. + * + * @param mode One of:
Note that {@link Session#messageAcquire} and this methods are asynchronous therefore for accessing to the + * previously acquired messages this method must be invoked in conjunction with {@link Session#sync()}. + *
A recommended invocation sequence would be: + *
Released messages are re-enqueued. * - * @param range Ranges of messages to be released. + * @param ranges Ranges of messages to be released. */ public void messageRelease(RangeSet ranges); @@ -376,12 +434,14 @@ public interface Session /** * Commit the receipt and the delivery of all messages exchanged by this session resources. + * * @throws IllegalStateException If this session is not transacted. */ public void txCommit() throws IllegalStateException; /** * Rollback the receipt and the delivery of all messages exchanged by this session resources. + * * @throws IllegalStateException If this session is not transacted. */ public void txRollback() throws IllegalStateException; @@ -392,26 +452,36 @@ public interface Session /** * Declare a queue with the given queueName - *
Following are the valid options for declareQueue + *
Following are the valid options: *
If this field is set and the exclusive field is also set, + * then the queue is deleted when the connection closes. + * If this field is set and the exclusive field is not set the queue is deleted when all + * the consumers have finished using it. + *
If set when creating a new queue, + * the queue will be marked as durable. Durable queues + * remain active when a server restarts. Non-durable queues (transient queues) are purged + * if/when a server restarts. Note that durable queues do not necessarily hold persistent + * messages, although it does not make sense to send persistent messages to a transient + * queue. + *
Exclusive queues can only be used from one connection at a time. + * Once a connection declares an exclusive queue, that queue cannot be used by any other connections until the + * declaring connection closes. + *
If set, the server will not create the queue. + * This field allows the client to assert the presence of a queue without modifying the server state. + *
Has no effect as it represents an “empty” option. *
In the absence of a particular option, the defaul value is false for each option * * @param queueName The name of the delcared queue. * @param alternateExchange If a message is rejected by a queue, then it is sent to the alternate-exchange. A message * may be rejected by a queue for the following reasons: *
Following are the valid options for createReceive + * This method deletes a queue. When a queue is deleted any pending messages are sent to a + * dead-letter queue if this is defined in the server configuration, and all consumers on the + * queue are cancelled. + *
Following are the valid options: *
If set, the server will only delete the queue if it has no messages. + *
If set, the server will only delete the queue if it has no consumers. + * If the queue has consumers the server does does not delete it but raises a channel exception instead. + *
Has no effect as it represents an “empty” option. *
In the absence of a particular option, the defaul value is false for each option
* - * @param queueName The name of the queue to be deleted - * @param options Set of options + * @param queueName Specifies the name of the queue to delete. If the queue name is empty, refers to the + * current queue for the session, which is the last declared queue. + * @param options Set of options (Valid options are: {@link Option#IF_EMPTY}, {@link Option#IF_UNUSED} + * and {@link Option#NO_OPTION}) * @see Option - * - * Following are the valid options */ public void queueDelete(String queueName, Option... options); @@ -468,48 +550,53 @@ public interface Session // -------------------------------------- /** - * Declare an exchange. - *Following are the valid options for createReceive + * This method creates an exchange if it does not already exist, and if the exchange exists, + * verifies that it is of the correct and expected class. + *
Following are the valid options: *
If set, the exchange is deleted when all queues have finished using it. + *
If set when creating a new exchange, the exchange will + * be marked as durable. Durable exchanges remain active when a server restarts. Non-durable exchanges (transient + * exchanges) are purged if/when a server restarts. + *
If set, the server will not create the exchange. + * The client can use this to check whether an exchange exists without modifying the server state. + *
Has no effect as it represents an “empty” option. *
In the absence of a particular option, the defaul value is false for each option
* + *In the absence of a particular option, the defaul value is false for each option
* * @param exchangeName The exchange name. - * @param exchangeClass The fully qualified name of the exchange class. + * @param type Each exchange belongs to one of a set of exchange types implemented by the server. The + * exchange types define the functionality of the exchange - i.e. how messages are routed + * through it. It is not valid or meaningful to attempt to change the type of an existing + * exchange. * @param alternateExchange In the event that a message cannot be routed, this is the name of the exchange to which * the message will be sent. - * @param options Set of options. + * @param options Set of options (valid options are: {@link Option#AUTO_DELETE}, {@link Option#DURABLE}, + * {@link Option#PASSIVE}, {@link Option#NO_OPTION}) * @param arguments Used for backward compatibility * @see Option */ - public void exchangeDeclare(String exchangeName, String exchangeClass, String alternateExchange, - MapFollowing are the valid options for createReceive + * This method deletes an exchange. When an exchange is deleted all queue bindings on the + * exchange are cancelled. + *
Following are the valid options: *
If set, the server will only delete the exchange if it has no queue bindings. If the + * exchange has queue bindings the server does not delete it but raises a channel exception + * instead. + *
Has no effect as it represents an “empty” option. *
In the absence of a particular option, the defaul value is false for each option - * Immediately deleted even if it is used by another resources.
* * @param exchangeName The name of exchange to be deleted. - * @param options Set of options. + * @param options Set of options (valid options are: {@link Option#IF_UNUSED}, {@link Option#NO_OPTION}) * @see Option */ public void exchangeDelete(String exchangeName, Option... options); - + /** * If the session receives a sessionClosed with an error code it * informs the session's ExceptionListener -- cgit v1.2.1