TheGood
TheGood

Reputation: 1

JMS Queue client onMessage() not receiving message from sender

I am new to JMS and working with Jdeveloper and Weblogic 12c, My code is running well but the Consumer onMessage() method is not receiving any message from Producer. Though I can get a message when I didn't use the onMessage(). Do I have to configure any file before it work?

Here is the message consumer code

package com.soap_jms;



import javax.jms.ExceptionListener;
import java.util.*;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.Context;

import utils.system;


public class QueueConsume  implements MessageListener, ExceptionListener{

        private final static String JMS_FACTORY="jms/ThesisConnectionFactory";
        private final static String QUEUE="jms/ThesisJMSQueue"; 
        private static Connection mConnection;
        private static ConnectionFactory mConnectionFactory;
        private static Queue mQueue;
        private static MessageConsumer mConsumer;
        private static Session mSession;


       public static void main (String [] args) throws JMSException, NamingException {
       mConnection=null;
       MessageListener listener = null;
       System.out.println("Entering into JMS Queue Consumer........");
       Context ctx = QueueConsume.getInitialContext();
       mConnectionFactory=(javax.jms.ConnectionFactory)ctx.lookup(JMS_FACTORY);
       mQueue=(javax.jms.Queue)ctx.lookup(QUEUE);
       mConnection=mConnectionFactory.createConnection();
       mSession=mConnection.createSession(false,Session.AUTO_ACKNOWLEDGE);
       mConsumer=mSession.createConsumer(mQueue);
       QueueConsume mConsume = new QueueConsume();
       mConsumer.setMessageListener(mConsume);
       mConnection.setExceptionListener(mConsume);
       mConnection.start();

       System.out.println("JMS is set to accept sent message.....");
       System.out.println("Exiting from JMS Queue Consumer ........"); 
       close();
       } // closes main method


    @SuppressWarnings("oracle.jdeveloper.java.insufficient-catch-block")
    public void onMessage(Message message) {
        try {
            System.out.println("Message is " + ((TextMessage) message).getText());
        } catch (JMSException e) {
        }
    }
      @SuppressWarnings("oracle.jdeveloper.java.unchecked-conversion-or-cast")
    public static Context getInitialContext() throws JMSException, NamingException {
            Hashtable htb = new Hashtable();
            htb.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
            htb.put(Context.PROVIDER_URL,"t3://localhost:7101");
            Context ctx= new InitialContext(htb);
        return ctx;   
        }       


    public static void close() throws JMSException {
        mSession.close();
        mConnection.close();
        mConsumer.close();
    }



    public void onException(JMSException exception)
        {
          System.err.println("an error occurred: " + exception);
        } 

}

Upvotes: 0

Views: 2461

Answers (1)

Shashi
Shashi

Reputation: 15263

I suspect the problem is because the main thread is ending before the onMessage method is called. After Connection.start() method is called you are calling close. Typically the setMessageListener is an asynchronous operation, so the call returns immediately but actual starting of onMessage thread happens in parallel. Suggest you to put some sleep or some other way to make the main thread to wait while onMessage thread receives messages.

Upvotes: 1

Related Questions