JMS Message Listner некоторое время не потребляет сообщения - PullRequest
0 голосов
/ 22 апреля 2011

У меня проблема с прослушивателем сообщений JMS, и он не потребляет сообщение из очереди, после перезапуска сервера затем отправляется очередь из формы отправки сообщений, исключений или ошибок нет.

onMessage () в приемнике сообщений не всегда срабатывает .. как решить проблему.

Даже в журналах сервера нет исключений. Я использую Sun Java Server8.2

Затем я попытался реализовать Exception listner в Connection, но он выдал какую-то другую ошибку

com.sun.messaging.jms.JMSException: MQRA: CA: исключение неподдерживаемого setClientID ()

здесь две проблемы 1, как решить проблему Onmessage () для потребления сообщений

секунда, как реализовать Exception listner. здесь я один раз создаю соединение с очередью и сеанс с помощью метода init () GatewayServlet

поток - это метод init GatewayServlet init () -> Calls -> GatewayMessageReceiver init (), когда GatewayServlet загружается на сервер приложений Sun Java или развертывается на сервере приложений Sun Java.

Затем метод init () в классе GatewayMessageReceiver создает сеанс jms и соединение с очередью.

Здесь GatewayMessageReceiver реализует класс списка сообщений ...

Здесь проблема в том, что onMessage () не вызывается несколько раз, когда я перезагружаю сервер, вызывающий onMessage (). но он должен вызывать, когда сообщение приходит в очередь, оно не работает и не выдается ошибка или исключение.

Я хочу реализовать Exception listner, но в нем есть ошибки

Не могли бы вы помочь мне в этом случае 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 СООБЩЕНИЕ IS

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

}

1 Ответ

1 голос
/ 22 апреля 2011

Вы не предоставили никакого кода для ознакомления, поэтому вряд ли вы получите полезные подробные ответы.

Я предполагаю, что ваш JMS-клиент терпит неудачу где-то в своей инициализации, вероятно, при вызове setClientID(), но ваш код (неверно) использует предложение try-catch для отлова и игнорирует исключение.Без надлежащего подключения к JMS-брокеру ваше приложение не будет получать никаких сообщений.

Используемый вами продукт JMS может иметь некоторые демонстрационные приложения.Если это так, то я предлагаю вам изучить их, чтобы увидеть шаги кодирования, которые вы могли бы использовать для инициализации вашего приложения и правильно обрабатывать любые исключения, которые могут быть выброшены.Демонстрационные приложения могут также показать, как реализовать ExceptionListener.

. Кстати, использование ExceptionListener означает , а не означает, что все исключения будут сообщаться ему.Код вашего приложения по-прежнему должен использовать предложения try-catch, чтобы определить, когда вызовы методов завершаются немедленно / синхронно.Функция ExceptionListener предназначена для другой цели, которая заключается в уведомлении вашего приложения о возникновении проблемы асинхронно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...