让ActiveMQ应用程序静默退出的可能原因是什么?

时间:2013-06-17 10:48:45

标签: java activemq

我制作了一个简单的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();

    }

}

它运作良好并完成了它要完成的任务。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

您可以在main中添加一些轮询代码,以便从控制台读取内容或不确保客户端保持运行状态,直到您确定要将其关闭为止。