package kr.ac.kaist.resl.lilliput.rest; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import javax.jms.TopicSubscriber; import javax.naming.InitialContext; import javax.naming.NamingException; import org.json.JSONException; import org.json.JSONObject; import org.restlet.ext.json.JsonRepresentation; import org.restlet.resource.Get; import org.restlet.resource.ServerResource; import com.ibm.jms.JMSMessage; import com.ibm.jms.JMSTextMessage; import com.ibm.mq.jms.JMSC; import com.ibm.mq.jms.MQTopic; import com.ibm.mq.jms.MQTopicConnection; import com.ibm.mq.jms.MQTopicConnectionFactory; import com.ibm.mq.jms.MQTopicPublisher; import com.ibm.mq.jms.MQTopicSession; import com.ibm.mq.jms.MQTopicSubscriber; public class PubSubService extends ServerResource { TopicConnection conn = null; TopicSession session = null; Topic topic = null; @Get("json") public JsonRepresentation toJson() throws JSONException, NamingException { try { // System.out.println("Begin TopicSendClient, now=" + System.currentTimeMillis()); // TopicSendClient client = new TopicSendClient(); // client.sendAsync("A text msg, now="+System.currentTimeMillis()); // client.stop(); // // System.out.println("Begin TopicRecvClient, now=" + System.currentTimeMillis()); // TopicRecvClient client2 = new TopicRecvClient(); // client2.recvSync(); // client2.stop(); // System.out.println("End TopicRecvClient"); MQTopicConnectionFactory cf = new MQTopicConnectionFactory(); // Config cf.setHostName("localhost"); cf.setPort(1414); cf.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); cf.setQueueManager("QM_thinkpad"); cf.setChannel("SYSTEM.DEF.SVRCONN"); MQTopicConnection connection = (MQTopicConnection) cf.createTopicConnection(); MQTopicSession session = (MQTopicSession) connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); MQTopic topic = (MQTopic) session.createTopic("topic://foo"); MQTopicPublisher publisher = (MQTopicPublisher) session.createPublisher(topic); MQTopicSubscriber subscriber = (MQTopicSubscriber) session.createSubscriber(topic); long uniqueNumber = System.currentTimeMillis() % 1000; JMSTextMessage message = (JMSTextMessage) session.createTextMessage("SimplePubSub "+ uniqueNumber); // Start the connection connection.start(); publisher.publish(message); System.out.println("Sent message:\\n" + message); JMSMessage receivedMessage = (JMSMessage) subscriber.receive(10000); System.out.println("\\nReceived message:\\n" + receivedMessage); publisher.close(); subscriber.close(); session.close(); connection.close(); System.out.println("\\nSUCCESS\\n"); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } JSONObject returnJson = new JSONObject(); returnJson.put("message", "Service is subscribed"); JsonRepresentation representation = new JsonRepresentation(returnJson); return representation; } } class TopicRecvClient { TopicConnection conn = null; TopicSession session = null; Topic topic = null; public void setupPubSub() throws JMSException, NamingException { InitialContext iniCtx = new InitialContext(); Object tmp = iniCtx.lookup("ConnectionFactory"); TopicConnectionFactory tcf = (TopicConnectionFactory) tmp; conn = tcf.createTopicConnection(); topic = (Topic) iniCtx.lookup("topic/testTopic"); session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); conn.start(); } public void recvSync() throws JMSException, NamingException { System.out.println("Begin recvSync"); // Setup the pub/sub connection, session setupPubSub(); // Wait upto 5 seconds for the message TopicSubscriber recv = session.createSubscriber(topic); Message msg = recv.receive(5000); if (msg == null) { System.out.println("Timed out waiting for msg"); } else { System.out.println("TopicSubscriber.recv, msgt="+msg); } } public void stop() throws JMSException { conn.stop(); session.close(); conn.close(); } } class TopicSendClient { TopicConnection conn = null; TopicSession session = null; Topic topic = null; public void setupPubSub() throws JMSException, NamingException { InitialContext iniCtx = new InitialContext(); Object tmp = iniCtx.lookup("ConnectionFactory"); TopicConnectionFactory tcf = (TopicConnectionFactory) tmp; conn = tcf.createTopicConnection(); topic = (Topic) iniCtx.lookup("topic/testTopic"); session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); conn.start(); } public void sendAsync(String text) throws JMSException, NamingException { System.out.println("Begin sendAsync"); // Setup the pub/sub connection, session setupPubSub(); // Send a text msg TopicPublisher send = session.createPublisher(topic); TextMessage tm = session.createTextMessage(text); send.publish(tm); System.out.println("sendAsync, sent text=" + tm.getText()); send.close(); System.out.println("End sendAsync"); } public void stop() throws JMSException { conn.stop(); session.close(); conn.close(); } public static void main(String args[]) throws Exception { System.out.println("Begin TopicSendClient, now=" + System.currentTimeMillis()); TopicSendClient client = new TopicSendClient(); client.sendAsync("A text msg, now="+System.currentTimeMillis()); client.stop(); System.out.println("End TopicSendClient"); System.exit(0); } }