我制作了一个简单的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)
所以导致我的代码静默退出的任何其他可能原因?
答案 0 :(得分:1)
取决于您的版本。由于您自己没有做任何事情来保持应用程序运行,而是依赖于ActiveMQ代码来保持至少一个非deamon线程运行。在某些ActiveMQ版本中,客户端并不总是这样做,因此您的应用程序可能会在发生故障转移时完成。最好的办法是切换到v5.8.0,我相信对此有一些修复。
您可以在main中添加一些轮询代码,以便从控制台读取内容或不确保客户端保持运行状态,直到您确定要将其关闭为止。