Reputation: 1
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
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