Skip to content

Instantly share code, notes, and snippets.

@PavithMadusara
Last active August 16, 2021 06:31
Show Gist options
  • Save PavithMadusara/0b3fece80938b7aa3fc84452c92c4481 to your computer and use it in GitHub Desktop.
Save PavithMadusara/0b3fece80938b7aa3fc84452c92c4481 to your computer and use it in GitHub Desktop.
JMS-WS-JAXRS
  • JMSConnector.java
import javax.jms.Connection;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnectionFactory;
import javax.naming.Context;
import javax.naming.InitialContext;

/**
 *
 * @author pavit
 */
public class JMSConnector implements Runnable {

    public void run() {
        try {
            Context context = new InitialContext();
            TopicConnectionFactory factory = (TopicConnectionFactory) context.lookup("jmstopicFactory");
            Connection connection = factory.createConnection();
            Topic topic = (javax.jms.Topic) context.lookup("jmstopic");
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            MessageConsumer consumer = session.createConsumer(topic);

            MessageListenerImpl messageListener = new MessageListenerImpl();
            consumer.setMessageListener(messageListener);
            connection.start();

            connection.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • JMSContextListener.java
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 *
 * @author pavit
 */
@WebListener
public class JMSContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        Thread thread = new Thread(new JMSConnector());
        thread.start();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

}
  • MessageListenerImpl.java
package lk.java;

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/**
 *
 * @author pavith
 */
@ServerEndpoint("/endpoint")
public class MessageListenerImpl implements MessageListener {

    private static Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>());

    @OnMessage
    public String onMessage(String message) {
        System.out.println(message);
        return null;
    }

    @OnOpen
    public void onOpen(Session peer) throws IOException {
        peers.add(peer);
//        broadcast("Socket Connection is Open for Session " + peer.getId());
    }

    @OnClose
    public void onClose(Session peer) {
        peers.remove(peer);
    }

    private static void broadcast(String message) throws IOException {
        peers.forEach((t) -> {
            try {
                t.getBasicRemote().sendText(message);
            } catch (IOException ex) {
                Logger.getLogger(MessageListenerImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
    }

    /**
     * On JMS Message
     *
     * @param message
     */
    @Override
    public void onMessage(Message message) {
        try {
            TextMessage msg = (TextMessage) message;
            System.out.println("Servlet Context Thread : " + msg.getText());
            MessageListenerImpl.broadcast(msg.getText());
        } catch (JMSException | IOException ex) {
            Logger.getLogger(MessageListenerImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
  • SendMessages.java
package lk.java;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.jms.Connection;
import javax.jms.JMSConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnectionFactory;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author pavit
 */
@WebServlet(name = "SendMessages", urlPatterns = {"/SendMessages"})
public class SendMessages extends HttpServlet {

//    @Resource(mappedName = "jmstopic")
//    private Topic topic;
//
//    @Inject
//    @JMSConnectionFactory("jmstopicFactory")
//    private JMSContext context;
    @Resource(mappedName = "jmstopic")
    private Topic topic;

    @Resource(mappedName = "jmstopicFactory")
    private TopicConnectionFactory topicFactory;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String user = request.getParameter("user");
        String parameter = request.getParameter("message");
        System.out.println(user + ":" + parameter);
        try {
            this.sendJMSMessageToJmstopic(user + ":" + parameter);
        } catch (JMSException ex) {
            Logger.getLogger(SendMessages.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    private Message createJMSMessageForjmstopic(Session session, Object messageData) throws JMSException {
        // TODO create and populate message to send
        TextMessage tm = session.createTextMessage();
        tm.setText(messageData.toString());
        return tm;
    }

    private void sendJMSMessageToJmstopic(Object messageData) throws JMSException {
        Connection connection = null;
        Session session = null;
        try {
            connection = topicFactory.createConnection();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer messageProducer = session.createProducer(topic);
            messageProducer.send(createJMSMessageForjmstopic(session, messageData));
        } finally {
            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Cannot close session", e);
                }
            }
            if (connection != null) {
                connection.close();
            }
        }
    }

}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment