Java 让ActiveMQ应用程序以静默方式退出的可能原因是什么?
我制作了一个简单的Java 让ActiveMQ应用程序以静默方式退出的可能原因是什么?,java,activemq,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
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设置也会通过一致地重新连接来处理它,对吗?(根据)
那么导致我的代码悄悄退出的任何其他可能原因呢?取决于您的版本。因为您自己并没有做任何事情来保持应用程序运行,而是依赖ActiveMQ代码来保持至少一个非deamon线程运行。在某些ActiveMQ版本中,客户机并不总是这样做,因此在发生故障转移时,应用程序可以完全恢复。最好的选择是切换到v5.8.0,我相信它对此有一些修复
您可以在main中添加一些轮询代码,以便从控制台中读取某些内容,或者不确保客户端在您确定希望它停止运行之前保持运行 取决于您的版本。因为您自己并没有做任何事情来保持应用程序运行,而是依赖ActiveMQ代码来保持至少一个非deamon线程运行。在某些ActiveMQ版本中,客户机并不总是这样做,因此在发生故障转移时,应用程序可以完全恢复。最好的选择是切换到v5.8.0,我相信它对此有一些修复
您可以在main中添加一些轮询代码,以便从控制台中读取某些内容,或者不确保客户端在您确定希望它停止运行之前保持运行 多谢各位。为了保持下去,你有没有更好的方法来代替从控制台阅读?主线程中的Thread.sleep或类似的东西怎么样?我当前的版本是5.2.0,可以为您的用例做任何工作。您可以使用单独的会话和使用者对控件主题或其他内容执行阻塞接收。最后由你选择适合你的东西。谢谢。为了保持下去,你有没有更好的方法来代替从控制台阅读?主线程中的Thread.sleep或类似的东西怎么样?我当前的版本是5.2.0,可以为您的用例做任何工作。您可以使用单独的会话和使用者对控件主题或其他内容执行阻塞接收。最后,由你来选择适合你的东西。