Search code examples
javajspjmsactivemq-classicmessage-listener

Implementing ActiveMQ Message Listener in/using JSP


I have implemented Message Listener in core java using Active MQ/JMS. The purpose of this listener is to subscribe a topic on ActiveMQ and then listen to the messages received from the topic. My code is working fine as a console application. Now I need to extend my application into a web application so that the messages received could be used in the web page i.e JSP. I am confused about how the message listener will work in JSP, how I will receive and process messages from active MQ topic. So far I have following code but doesn't seem to help in current scenario:

<%!
    public void handleReceivedMessages() {
        String url = ActiveMQConnection.DEFAULT_BROKER_URL;
        String subject = "XXXXX";

        try {
            ConnectionFactory connectionFactory
                    = new ActiveMQConnectionFactory(url);
            Connection connection = connectionFactory.createConnection();
            connection.start();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Topic topic = session.createTopic(subject);
            MessageConsumer consumer = session.createConsumer(topic);

            MessageListener listner = new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    try {
                        if (message instanceof TextMessage) {
                            TextMessage textMessage = (TextMessage) message;
                            System.out.println("Received message : "
                                    + textMessage.getText() + "'");
                        }
                    } catch (JMSException e) {
                        System.out.println("Caught:" + e);
                    }
                }
            };
            consumer.setMessageListener(listner);
            try {
                System.in.read();
            } catch (IOException e) {
            }
            connection.close();
        } catch (JMSException ex) {
            // Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);

        }
    }//end method
%>

How I am supposed to use this code so that i can e.g print every message on my web page which is received by the topic?


Solution

  • JSP pages are used the moment the web page is loaded to render the HTML. After that, they have no function.

    Typically, you need to create a Message Driven Bean(MDB) or something similar using Spring. The MDB will receive messages, process the data and store it somewhere (typically a database, but could be also be a global cache, local files or similar). Your JSP then simply uses the data stored by JMS messages.

    If you really want the messages to interact with the user more dynamically - you can connect to ActiveMQ using JavaScript from the client browser. The ActiveMQ distribution have some examples regarding this. Look into examples/mqtt/websocket or examples/stomp/websocket to see some working code.