【问题标题】:JMS Queue client onMessage() not receiving message from senderJMS 队列客户端 onMessage() 未收到来自发件人的消息
【发布时间】:2016-05-03 23:46:30
【问题描述】:

我是 JMS 新手,使用 Jdeveloper 和 Weblogic 12c,我的代码运行良好,但 Consumer onMessage() 方法没有收到来自 Producer 的任何消息。虽然我在不使用onMessage() 时会收到一条消息。是否必须先配置任何文件才能工作?

这是消息消费者代码

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);
        } 

}

【问题讨论】:

  • 您是否将 onMessage 消息监听器附加到消费者?
  • 是的沙市。我附上了它。见上面的代码。谢谢。

标签: jms weblogic


【解决方案1】:

我怀疑问题是因为主线程在调用onMessage 方法之前就结束了。在调用Connection.start() 方法后,您正在调用close。通常 setMessageListener 是一个异步操作,因此调用会立即返回,但onMessage 线程的实际启动是并行发生的。建议您在onMessage 线程接收消息时设置一些睡眠或其他方式让主线程等待。

【讨论】:

    猜你喜欢
    • 2020-10-15
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多