package infrastructure; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; import javax.naming.Context; import javax.naming.InitialContext; import java.io.UnsupportedEncodingException; import java.util.Properties; public class MockJMSBasedSystemUnderTestWithDynamicQueues implements MessageListener { private String cannedResponse = ""; private String lastRequest = "No requests received yet."; private Destination requestQueue; private Session session; private Connection conn; public MockJMSBasedSystemUnderTestWithDynamicQueues(String cannedResponse) { this.cannedResponse = cannedResponse; } public void startServer() throws Exception { Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); env.put(Context.PROVIDER_URL, "vm://localhost?broker.persistent=false"); InitialContext context = new InitialContext(env); ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory"); conn = connectionFactory.createConnection(); conn.start(); session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); requestQueue = (Destination) context.lookup("dynamicQueues/requestQueue"); MessageConsumer consumer = session.createConsumer(requestQueue); consumer.setMessageListener(this); } public void stopServer() throws JMSException { conn.close(); } @Override public void onMessage(Message message) { BytesMessage requestMessage = (BytesMessage) message; try { byte[] bytes = new byte[(int) requestMessage.getBodyLength()]; requestMessage.readBytes(bytes); lastRequest = new String(bytes, "UTF-8"); MessageProducer producer = session.createProducer(requestMessage.getJMSReplyTo()); producer.send(buildResponseMessage(requestMessage)); } catch (Exception e) { e.printStackTrace(); } } private BytesMessage buildResponseMessage(BytesMessage requestMessage) throws JMSException, UnsupportedEncodingException { BytesMessage responseMessage = session.createBytesMessage(); responseMessage.setJMSCorrelationID(requestMessage.getJMSMessageID()); responseMessage.writeBytes(cannedResponse.getBytes("UTF-8")); return responseMessage; } }