Java “我该怎么杀人?”;ActiveMQ传输“;中断JMS MessageConsumer.receive()后的线程
我有一个使用ActiveMQConnectionFactory.createConnection()获取ActiveMQ连接的类。 然后,它创建并拥有会话、目的地和侦听该目的地的使用者(队列) 我在消费者上调用receive()或receive(millis)将消息从队列中删除。在某些情况下,我必须终止(中断)调用receive方法的线程。我尝试在那之后立即关闭会话和连接。不幸的是,我在调用close时经常遇到异常,并且关联的“ActiveMQ传输”线程(以及到代理的相关连接)保持活动状态。我得到的例外是Java “我该怎么杀人?”;ActiveMQ传输“;中断JMS MessageConsumer.receive()后的线程,java,connection,activemq,Java,Connection,Activemq,我有一个使用ActiveMQConnectionFactory.createConnection()获取ActiveMQ连接的类。 然后,它创建并拥有会话、目的地和侦听该目的地的使用者(队列) 我在消费者上调用receive()或receive(millis)将消息从队列中删除。在某些情况下,我必须终止(中断)调用receive方法的线程。我尝试在那之后立即关闭会话和连接。不幸的是,我在调用close时经常遇到异常,并且关联的“ActiveMQ传输”线程(以及到代理的相关连接)保持活动状态。我得
org.myorg.awsiface.communication.MessagingException: Failed to close JMS connection
at
org.myorg.aws.communication.transport.JMSMessageTransport.cleanUp(JMSMessageTransport.java:253)
at
org.myorg.aws.communication.protocol.ContextFinishedProtocol.cleanUp(ContextFinishedProtocol.java:94)
at org.myorg.myservice.job.Job.run(Job.java:206)
Caused by: javax.jms.JMSException: java.io.InterruptedIOExceptio)
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62)
at org.apache.activemq.ActiveMQConnection.doAsyncSendPacket(ActiveMQConnection.java:1227)
at org.apache.activemq.ActiveMQConnection.asyncSendPacket(ActiveMQConnection.java:1219)
at org.apache.activemq.ActiveMQSession.asyncSendPacket(ActiveMQSession.java:1799)
at org.apache.activemq.ActiveMQMessageConsumer.doClose(ActiveMQMessageConsumer.java:636)
at org.apache.activemq.ActiveMQMessageConsumer.close(ActiveMQMessageConsumer.java:627)
at org.myorg.aws.communication.transport.JMSMessageTransport.cleanUp(JMSMessageTransport.java:232)
... 2 more
Caused by: java.io.InterruptedIOException
at org.apache.activemq.transport.WireFormatNegotiator.oneway(WireFormatNegotiator.java:102)
at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:40)
at org.apache.activemq.transport.ResponseCorrelator.oneway(ResponseCorrelator.java:60)
at org.apache.activemq.ActiveMQConnection.doAsyncSendPacket(ActiveMQConnection.java:1225)
... 7 more
我尝试了以下连接URL
failover://tcp://broker.ip.address:61616
tcp://broker.ip.address:61616
failover://tcp://broker.ip.address:61616?trace=true&closeAsync=false
我也尝试过使用MessageConsumer::receiveNoWait()调用,只是执行我自己的Thread.sleep,但是每当我调用下面的函数来关闭连接时,我总是会遇到上面的异常
try {
// I added the following two lines to see if the taskRunner was handling the threads - still no luck
TaskRunnerFactory taskRunner = ((ActiveMQConnection)connection).getSessionTaskRunner();
taskRunner.shutdown();
if (producer != null) {
producer.close();
}
if (consumer != null) {
consumer.close();
}
session.close();
if (connection instanceof ActiveMQConnection) {
ActiveMQConnection amqConnection = (ActiveMQConnection) connection;
amqConnection.stop();
}
connection.stop();
connection.close();
}
catch (ConnectionClosedException e) {
// NOOP - this is ok
}
catch (Exception e) {
throw new MessagingException("Failed to close JMS connection", e, log);
}
我不知道为什么收尾对你不起作用。但是,通过使用异步消息侦听器,您可以完成您想要的任务
Connection connection = connectionFactory.createConnection();
connection.start();
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination queue = session.createQueue("queueName");
Consumer consumer = session.createConsumer( queue );
consumer.setMessageListener( new MessageListener()
{
public void onMessage( Message message )
{
// whatever was after the receive() method call
}
} );
那就没有必要被打断了。完成后,结束工作:
consumer.close();
session.close();
queue.close();
connection.close();
一种解决方案是在TCP ActiveMQ传输线程上设置守护程序标志, e、 g.
tcp://URI:PORT?daemon=true
查看ActiveMQ文档:对我不起作用。按照另一个答案使用
.close()
。