/*
* 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.activemq.artemis.tests.integration.openwire.amq;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TemporaryQueue;
import javax.jms.TemporaryTopic;
import javax.jms.TextMessage;
import java.util.List;
import java.util.Vector;
import org.apache.activemq.artemis.tests.integration.openwire.BasicOpenWireTest;
import org.apache.activemq.command.ActiveMQDestination;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* adapted from: org.apache.activemq.JmsTopicRequestReplyTest
*/
public class JmsTopicRequestReplyTest extends BasicOpenWireTest implements MessageListener {
protected boolean useAsyncConsume;
private Connection serverConnection;
private Connection clientConnection;
private MessageProducer replyProducer;
private Session serverSession;
private Destination requestDestination;
private List<JMSException> failures = new Vector<>();
private boolean dynamicallyCreateProducer;
private String clientSideClientID;
@Test
public void testSendAndReceive() throws Exception {
clientConnection = createConnection();
clientConnection.setClientID("ClientConnection:" + name.getMethodName());
System.out.println("Creating session.");
Session session = clientConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
clientConnection.start();
Destination replyDestination = createTemporaryDestination(session);
System.out.println("Created temporary topic " + replyDestination);
System.out.println("Creating consumer on: " + replyDestination);
MessageConsumer replyConsumer = session.createConsumer(replyDestination);
// lets test the destination
clientSideClientID = clientConnection.getClientID();
// TODO
// String value = ActiveMQDestination.getClientId((ActiveMQDestination)
// replyDestination);
// assertEquals("clientID from the temporary destination must be the
// same", clientSideClientID, value);
System.out.println("Both the clientID and destination clientID match properly: " + clientSideClientID);
/* build queues */
/* build requestmessage */
TextMessage requestMessage = session.createTextMessage("Olivier");
requestMessage.setJMSReplyTo(replyDestination);
System.out.println("Creating producer on " + requestDestination);
MessageProducer requestProducer = session.createProducer(requestDestination);
System.out.println("Sending message to " + requestDestination);
requestProducer.send(requestMessage);
System.out.println("Sent request.");
System.out.println(requestMessage.toString());
Message msg = replyConsumer.receive(5000);
if (msg instanceof TextMessage) {
TextMessage replyMessage = (TextMessage) msg;
System.out.println("Received reply.");
System.out.println(replyMessage.toString());
assertEquals("Wrong message content", "Hello: Olivier", replyMessage.getText());
} else {
fail("Should have received a reply by now");
}
replyConsumer.close();
deleteTemporaryDestination(replyDestination);
assertEquals("Should not have had any failures: " + failures, 0, failures.size());
}
@Test
public void testSendAndReceiveWithDynamicallyCreatedProducer() throws Exception {
dynamicallyCreateProducer = true;
testSendAndReceive();
}
/**
* Use the asynchronous subscription mechanism
*/
@Override
public void onMessage(Message message) {
try {
TextMessage requestMessage = (TextMessage) message;
System.out.println("Received request from " + requestDestination);
System.out.println(requestMessage.toString());
Destination replyDestination = requestMessage.getJMSReplyTo();
// TODO
// String value =
// ActiveMQDestination.getClientId((ActiveMQDestination)
// replyDestination);
// assertEquals("clientID from the temporary destination must be the
// same", clientSideClientID, value);
TextMessage replyMessage = serverSession.createTextMessage("Hello: " + requestMessage.getText());
replyMessage.setJMSCorrelationID(requestMessage.getJMSMessageID());
if (dynamicallyCreateProducer) {
replyProducer = serverSession.createProducer(replyDestination);
replyProducer.send(replyMessage);
} else {
replyProducer.send(replyDestination, replyMessage);
}
System.out.println("Sent reply to " + replyDestination);
System.out.println(replyMessage.toString());
} catch (JMSException e) {
onException(e);
}
}
/**
* Use the synchronous subscription mechanism
*/
protected void syncConsumeLoop(MessageConsumer requestConsumer) {
try {
Message message = requestConsumer.receive(5000);
if (message != null) {
onMessage(message);
} else {
System.err.println("No message received");
}
} catch (JMSException e) {
onException(e);
}
}
@Override
@Before
public void setUp() throws Exception {
super.setUp();
serverConnection = createConnection();
serverConnection.setClientID("serverConnection:" + name.getMethodName());
serverSession = serverConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
replyProducer = serverSession.createProducer(null);
requestDestination = createDestination(serverSession);
/* build queues */
System.out.println("Creating consumer on: " + requestDestination);
final MessageConsumer requestConsumer = serverSession.createConsumer(requestDestination);
if (useAsyncConsume) {
requestConsumer.setMessageListener(this);
} else {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
syncConsumeLoop(requestConsumer);
}
});
thread.start();
}
serverConnection.start();
}
@Override
@After
public void tearDown() throws Exception {
serverConnection.close();
clientConnection.stop();
clientConnection.close();
super.tearDown();
}
protected void onException(JMSException e) {
System.out.println("Caught: " + e);
e.printStackTrace();
failures.add(e);
}
protected Destination createDestination(Session session) throws JMSException {
if (topic) {
return this.createDestination(session, ActiveMQDestination.TOPIC_TYPE);
}
return this.createDestination(session, ActiveMQDestination.QUEUE_TYPE);
}
protected Destination createTemporaryDestination(Session session) throws JMSException {
if (topic) {
return session.createTemporaryTopic();
}
return session.createTemporaryQueue();
}
protected void deleteTemporaryDestination(Destination dest) throws JMSException {
if (topic) {
((TemporaryTopic) dest).delete();
} else {
System.out.println("Deleting: " + dest);
((TemporaryQueue) dest).delete();
}
}
}