下面列出了javax.jms.Message#setJMSDeliveryMode ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Test that the <code>JMSDeliveryMode</code> header field value is ignored
* when the message is sent and that it holds the value specified by the sending
* method (i.e. <code>Message.DEFAULT_ROUTING_TYPE</code> in this test when the message is received.
*/
@Test
public void testJMSDeliveryMode() {
try {
// sender has been created with the DEFAULT_ROUTING_TYPE which is PERSISTENT
Assert.assertEquals(DeliveryMode.PERSISTENT, sender.getDeliveryMode());
Message message = senderSession.createMessage();
// send a message specfiying NON_PERSISTENT for the JMSDeliveryMode header field
message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
sender.send(message);
Assert.assertTrue("sec. 3.4.2 When a message is sent this value is ignored", message.getJMSDeliveryMode() != DeliveryMode.NON_PERSISTENT);
Assert.assertEquals("sec. 3.4.2 After completion of the send it holds the delivery mode specified " + "by the sending method (persistent by default).\n", Message.DEFAULT_DELIVERY_MODE, message.getJMSDeliveryMode());
receiver.receive(TestConfig.TIMEOUT);
} catch (JMSException e) {
fail(e);
}
}
@Test(timeout = 20000)
public void testProducerOverridesMessageDeliveryMode() throws Exception {
try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
Connection connection = testFixture.establishConnecton(testPeer);
testPeer.expectBegin();
testPeer.expectSenderAttach();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("myQueue");
MessageProducer producer = session.createProducer(queue);
// Create and transfer a new message, explicitly setting the deliveryMode on the
// message (which applications shouldn't) to NON_PERSISTENT and sending it to check
// that the producer ignores this value and sends the message as PERSISTENT(/durable)
MessageHeaderSectionMatcher headersMatcher = new MessageHeaderSectionMatcher(true).withDurable(equalTo(true));
MessageAnnotationsSectionMatcher msgAnnotationsMatcher = new MessageAnnotationsSectionMatcher(true);
TransferPayloadCompositeMatcher messageMatcher = new TransferPayloadCompositeMatcher();
messageMatcher.setHeadersMatcher(headersMatcher);
messageMatcher.setMessageAnnotationsMatcher(msgAnnotationsMatcher);
testPeer.expectTransfer(messageMatcher);
testPeer.expectClose();
Message message = session.createTextMessage();
message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
assertEquals(DeliveryMode.NON_PERSISTENT, message.getJMSDeliveryMode());
producer.send(message);
assertEquals(DeliveryMode.PERSISTENT, message.getJMSDeliveryMode());
connection.close();
testPeer.waitForAllHandlersToComplete(1000);
}
}
void send(MockJMSMessageProducer producer, Destination destination, Message message, int deliveryMode, int priority, long timeToLive, boolean disableMessageId, boolean disableTimestamp, long deliveryDelay, CompletionListener completionListener) throws JMSException {
sendLock.lock();
try {
message.setJMSDeliveryMode(deliveryMode);
message.setJMSPriority(priority);
message.setJMSRedelivered(false);
message.setJMSDestination(destination);
long timeStamp = System.currentTimeMillis();
boolean hasTTL = timeToLive > Message.DEFAULT_TIME_TO_LIVE;
boolean hasDelay = deliveryDelay > Message.DEFAULT_DELIVERY_DELAY;
if (!(message instanceof MockJMSMessage)) {
throw new IllegalStateException("Mock JMS client cannot handle foreign messages");
}
if (!disableTimestamp) {
message.setJMSTimestamp(timeStamp);
} else {
message.setJMSTimestamp(0);
}
if (hasTTL) {
message.setJMSExpiration(timeStamp + timeToLive);
} else {
message.setJMSExpiration(0);
}
long messageSequence = producer.getNextMessageSequence();
String messageId = null;
if (!disableMessageId) {
messageId = producer.getProducerId() + ":"+ messageSequence;
}
// Set the delivery time. Purposefully avoided doing this earlier so
// that we use the 'outbound' JmsMessage object reference when
// updating our own message instances, avoids using the interface
// in case the JMS 1.1 Message API is actually being used due to
// being on the classpath too.
long deliveryTime = timeStamp;
if (hasDelay) {
deliveryTime = timeStamp + deliveryDelay;
}
message.setJMSDeliveryTime(deliveryTime);
// Set the message ID
message.setJMSMessageID(messageId);
try {
connection.onMessageSend(this, message);
} catch (JMSException jmsEx) {
// If the synchronous portion of the send fails the completion be
// notified but might depending on the circumstances of the failures,
// remove it from the queue and check if is is already completed
// once we decide to add completion support to the mock
throw jmsEx;
}
} finally {
sendLock.unlock();
}
}
private static void setJmsHeader(final MessageDescription messageDescription,
final Message message)
throws JMSException
{
final HashMap<MessageDescription.MessageHeader, Serializable> header =
messageDescription.getHeaders();
if (header == null)
{
return;
}
for (Map.Entry<MessageDescription.MessageHeader, Serializable> entry : header.entrySet())
{
try
{
switch (entry.getKey())
{
case DESTINATION:
message.setJMSDestination((Destination) entry.getValue());
break;
case DELIVERY_MODE:
message.setJMSDeliveryMode((Integer) entry.getValue());
break;
case MESSAGE_ID:
message.setJMSMessageID((String) entry.getValue());
break;
case TIMESTAMP:
message.setJMSTimestamp((Long) entry.getValue());
break;
case CORRELATION_ID:
if (entry.getValue() instanceof byte[])
{
message.setJMSCorrelationIDAsBytes((byte[]) entry.getValue());
}
else
{
message.setJMSCorrelationID((String) entry.getValue());
}
break;
case REPLY_TO:
throw new RuntimeException("The Test should not set the replyTo header."
+ " It should rather use the dedicated method");
case REDELIVERED:
message.setJMSRedelivered((Boolean) entry.getValue());
break;
case TYPE:
message.setJMSType((String) entry.getValue());
break;
case EXPIRATION:
message.setJMSExpiration((Long) entry.getValue());
break;
case PRIORITY:
message.setJMSPriority((Integer) entry.getValue());
break;
default:
throw new RuntimeException(String.format("unexpected message header '%s'", entry.getKey()));
}
}
catch (ClassCastException e)
{
throw new RuntimeException(String.format("Could not set message header '%s' to this value: %s",
entry.getKey(),
entry.getValue()), e);
}
}
}
/**
* @param testcase
* @param session
* @param rtd
* @return
* @throws JMSException
*/
public static Message buildJMSMessageFromTestCase(TestCaseType testcase, Session session,
Destination rtd) throws JMSException {
MessagePropertiesType messageProperties = testcase.getRequestMessage();
Message jmsMessage = null;
String messageType = messageProperties.getMessageType();
if ("text".equals(messageType)) {
jmsMessage = session.createTextMessage();
((TextMessage)jmsMessage).setText("test");
} else if ("byte".equals(messageType)) {
jmsMessage = session.createBytesMessage();
} else if ("stream".equals(messageType)) {
jmsMessage = session.createStreamMessage();
((StreamMessage)jmsMessage).writeString("test");
} else {
jmsMessage = session.createBytesMessage();
}
jmsMessage.setJMSReplyTo(rtd);
if (messageProperties.isSetDeliveryMode()) {
jmsMessage.setJMSDeliveryMode(messageProperties.getDeliveryMode());
}
if (messageProperties.isSetExpiration()) {
jmsMessage.setJMSExpiration(messageProperties.getExpiration());
}
if (messageProperties.isSetPriority()) {
jmsMessage.setJMSPriority(messageProperties.getPriority());
}
if (messageProperties.isSetExpiration()) {
jmsMessage.setJMSPriority(messageProperties.getExpiration());
}
if (messageProperties.isSetCorrelationID()) {
jmsMessage.setJMSCorrelationID(messageProperties.getCorrelationID());
}
if (messageProperties.isSetTargetService()
&& !"".equals(messageProperties.getTargetService().trim())) {
jmsMessage.setStringProperty(JMSSpecConstants.TARGETSERVICE_FIELD, messageProperties
.getTargetService().trim());
}
if (messageProperties.isSetBindingVersion()
&& !"".equals(messageProperties.getBindingVersion().trim())) {
jmsMessage.setStringProperty(JMSSpecConstants.BINDINGVERSION_FIELD, messageProperties
.getBindingVersion().trim());
}
if (messageProperties.isSetContentType()
&& !"".equals(messageProperties.getContentType().trim())) {
jmsMessage.setStringProperty(JMSSpecConstants.CONTENTTYPE_FIELD, messageProperties
.getContentType().trim());
}
if (messageProperties.isSetSoapAction()
&& !"".equals(messageProperties.getSoapAction().trim())) {
jmsMessage.setStringProperty(JMSSpecConstants.SOAPACTION_FIELD, messageProperties
.getSoapAction().trim());
}
if (messageProperties.isSetRequestURI()
&& !"".equals(messageProperties.getRequestURI().trim())) {
jmsMessage.setStringProperty(JMSSpecConstants.REQUESTURI_FIELD, messageProperties
.getRequestURI().trim());
}
return jmsMessage;
}