【问题标题】:JMS Message Listner is not consuming message for some timeJMS 消息侦听器有一段时间没有使用消息
【发布时间】:2011-08-10 14:33:57
【问题描述】:

我的 JMS 消息侦听器有问题,它不消耗队列中的消息,一旦我重新启动服务器然后它的发送消息表单队列,没有异常或错误抛出。

消息侦听器中的 onMessage() 并不总是触发..如何解决问题。

服务器日志中甚至没有显示异常。我正在使用 sun java server8.2

然后我尝试在 Connection 上实现异常侦听器,但它引发了一些其他错误

com.sun.messaging.jms.JMSException: MQRA:CA:Unsupported-setClientID() 异常

这里有两个问题1如何解决Onmessage()问题来消费消息

第二个如何实现异常监听器。 这里我在 GatewayServlet init() 方法中创建一次队列连接和会话

流程是GatewayServlet init()--> 在GatewayServlet 加载到sun java applicaiton server 或部署到sun java app server 时调用-->GatewayMessageReceiver init() 方法。

然后GatewayMessageReceiver类中的init()方法创建jms会话和队列连接。

这里GatewayMessageReceiver实现了Message监听类...

这里的问题是 onMessage() 有时没有调用,当我重新启动服务器时,它调用 onMessage()。但它应该在消息到达队列时调用,它没有发生并且没有抛出错误或异常。

我想实现异常侦听器,但它会抛出错误

Ciaran McHale 在这种情况下你能帮我吗

请在下面找到代码

import java.util.*;
import java.io.*;
import java.sql.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class GatewayServlet extends HttpServlet {

    private GatewayMessageReceiver receiver = null;


    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        receiver = new GatewayMessageReceiver();  //here iam calling my GatewayMessageReceiver for JMS connection creations
        info(""+receiver);
    }

    /** Destroys the servlet
     */
    public void destroy() {
        if (receiver != null) {
            receiver.destroy();
        }
    }


    protected void processGatewayRequest(ServletRequest request, ServletResponse response)
    throws ServletException, java.io.IOException {
        //doing some business logic



    }

    protected void processRequest(ServletRequest request, ServletResponse response)
    throws ServletException, java.io.IOException {
        CCMLogger.getGatewayLogger(GeneralConfigurator.getInstance().getUtility()).debug("Host sending request is:"+request.getRemoteHost());
        //check whether it's a push request
        processGatewayRequest(request, response);
    }
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    public void service(ServletRequest request, ServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }

    public void doGet(ServletRequest request, ServletResponse response)
    throws ServletException, java.io.IOException {
        service(request, response);
    }

    public void doPost(ServletRequest request, ServletResponse response)
    throws ServletException, java.io.IOException {
        service(request, response);
    }


}

我的 JMS MESSAGE LISTNER 是

import javax.jms.*;
import java.util.logging.*;
import com.carrier.ccm.business.*;
import com.carrier.ccm.gateway.service.*;
import com.carrier.ccm.gateway.config.*;
import com.carrier.ccm.service.*;
import com.carrier.ccm.logging.*;
import com.carrier.ccm.util.*;
import com.carrier.ccm.exception.*;
/**
 *
 * @author  Administrator
 */
public class GatewayMessageReceiver implements MessageListener {

    private QueueConnection connection = null;

    /** Creates a new instance of GatewayMessageReceiver */
    public GatewayMessageReceiver() {
        super();

        init();
    }

    private void init() {
      QueueSession  session     = null;
      QueueReceiver queueReceiver   = null;

      try{
        String queueName = "infoQueue";//its sun java app sever  queue name
        String qcfName = "infoQueueCF";//connectionfactory created in sun java app sever

        Logger.log.log(Level.INFO, "Queue name: "+queueName);            
        Logger.log.log(Level.INFO, "Queue CF name: "+qcfName);

        QueueConnectionFactory qcf = 
                (QueueConnectionFactory)JndiUtilities.get(qcfName);
        Logger.log.log(Level.INFO, "Queue CF: "+qcf);
        Queue queue = 
                (Queue)JndiUtilities.get(queueName);
        Logger.log.log(Level.INFO, "Queue: "+queue);
        // Creating a QueueConnection to the Message service");
        connection = qcf.createQueueConnection();
        // Creating a session within the connection
        session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
        // Creating a QueueReceiver
        queueReceiver = session.createReceiver(queue);
        // setting up a message listener
        queueReceiver.setMessageListener(this);
        //Starting the Connection
        connection.start();
      } catch (Throwable t) {
           Logger.log(Level.SEVERE, "Failed to start queue listener for business messages", t);
      }
    }

    public void destroy() {
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (Throwable t) {
            Logger.log(Level.SEVERE, "Failed to close queue connection", t);
        }
    }

    public void onMessage(javax.jms.Message message) {
        String ut = null;
        try {
            String utm  = message.getStringProperty(IConstants.UTILITY_TAG);
            int bcDelay = message.getIntProperty(IConstants.BC_DELAY);

            //it must be an ObjectMessage!
            ObjectMessage omsg = (ObjectMessage)message;

           //Here iam doing business logic

        } catch (Throwable t) {            
          Logger.log(Level.SEVERE, "Failed to process business message", t);
        }
    }

}

JNDI 实用程序类

import javax.naming.*;
import javax.sql.*;

/**
 *
 * @author  Administrator
 */
public class JndiUtilities {
    private static Context context = null;

    static {
        setJndiContext();
    }

    /** Creates a new instance of JndiUtilities */
    private JndiUtilities() {
        super();
    }

    private static void setJndiContext() {
        try {
            context = new InitialContext();
        } catch (Exception e) {
            System.err.println("ERROR getting JNDI context: "+e);
        }    
    }

    public static Object get(String name) {
        if (context == null) {
            setJndiContext();
            if (context == null) return null;
        }

        Object obj;

        try {
            obj = context.lookup(name);
        } catch (Exception e) {
            obj = null;
            System.err.println("ERROR getting JNDI resource named \""+name+"\": "+e);
        }
        return obj;
    }

}

【问题讨论】:

    标签: jms


    【解决方案1】:

    您没有提供任何代码供这里的人检查,因此您不太可能得到有用的详细答案。

    我的猜测是您的 JMS 客户端在其初始化的某个地方失败了,可能是在调用 setClientID() 时,但您的代码(错误)使用了 try-catch 子句来捕获并忽略异常.如果没有与 JMS 代理的正确连接,您的应用程序将不会收到任何消息。

    您使用的 JMS 产品可能有一些演示应用程序。如果是这样,那么我建议您检查它们以查看可用于初始化应用程序并正确处理可能引发的任何异常的编码步骤。演示应用程序还可能展示如何实现ExceptionListener

    顺便说一句,使用ExceptionListener 确实意味着所有异常都会报告给它。您的应用程序代码仍然需要使用try-catch 子句来确定方法调用何时立即/同步失败。 ExceptionListener 函数有不同的用途,即当问题发生时通知您的应用程序异步

    【讨论】:

    • 大家好,你能回答这个问题吗
    • 即使使用ExceptionListener(如果您的设置成功完成并且您使用MessageListener 总是希望消息被推送,从不被拉取)您仍然可以看到客户端仍然认为的静默连接失败已连接,但服务器没有。我相信这通常是由于 JMS 系统配置不当造成的。您可能需要考虑配置 keepaliveping 超时等内容,看看是否能找到原因。
    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 2012-07-21
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    相关资源
    最近更新 更多