2

我做了一个简单的ActiveMQ应用程序。

它听一个队列。如果有消息,打印出dataId

这是代码:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;

public class MQ implements MessageListener {
    private Connection connection = null;
    private Session session = null;
    private Destination destination = null;

    private void errorOnConnection(JMSException e) {
        System.out.println("MQ is having problems. Exception::"+ e);
    }

    private void init() throws JMSException {
        String BROKER_URL = "failover:(tcp://myQueue001:61616,tcp://myQueue002:61616)?randomize=false";  
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);

        connection = connectionFactory.createConnection("user", "password");

        connection.setExceptionListener(
                    new ExceptionListener() { 
                        @Override public void onException(JMSException e) { 
                            errorOnConnection(e);
                        } 
                    });

        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

        destination = session.createQueue("myQueue");


        MessageConsumer consumer = session.createConsumer(destination);
        consumer.setMessageListener(this);
    }

    public boolean start() {
        try {
            if(connection==null )
                init();
            connection.start();
        } catch (Exception e) {
            System.out.println("MQListener cannot be started, exception: " + e);
        }
        return true;

    }

    @Override
    public void onMessage(Message msg) {
        try {
            if(msg instanceof MapMessage){
                MapMessage m = (MapMessage)msg;
                int dataId = m.getIntProperty("dataId");
                System.out.println(dataId);
            }
        } catch (JMSException e) {
            System.out.println("Got an exception: " + e);
        }


    }

    public static void main(String[] args) {
        MQ mq = new MQ();
        mq.start();

    }

}

它工作正常,并完成了它想要完成的任务。

但是,问题是它只能运行几天。几天后,它只是静默退出,没有任何异常或错误。

我正在收听的队列来自第 3 方。从那里的一个人那里,队列有时会被关闭或重新启动或中断。

但我认为即使发生这种情况,默认的 ActiveMQ 设置也会通过始终重新连接来处理它,对吧?(根据http://activemq.apache.org/cms/configuring.html

那么导致我的代码静默退出的任何其他可能原因?

4

1 回答 1

1

取决于您的版本。由于您自己并没有做任何事情来保持应用程序运行,而是依靠 ActiveMQ 代码来保持至少一个非守护线程运行。在某些 ActiveMQ 版本中,客户端并不总是这样做,因此您的应用程序可以在发生故障转移的同时进行。最好的选择是切换到 v5.8.0,我相信它对此有一些修复。

您可以在 main 中添加一些轮询代码以从控制台读取某些内容,或者不确保客户端保持正常运行,直到您确定希望它关闭。

于 2013-06-17T14:31:23.793 回答