问题描述
我们有一个带有队列和生产者的ActiveMQ Artemis 2.14.0实例,该实例有时会因以下错误而失败:
javax.jms.JMSException: AMQ219016: Connection failure detected. Unblocking a blocking call that will never get a response
at org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.sendBlocking(ChannelImpl.java:467) ~[artemis-jms-client-all-2.14.0.jar!/:2.14.0]
我们需要了解可能发生这种情况的情况。我们看到这种情况时有发生,我们不知道确切的情况。有没有人经历过这种情况并且可以提供任何解决方案?
解决方法
The documentation很好地说明了为什么可能引发此异常:
如果客户端代码处于对服务器的阻塞调用中,等待响应继续执行,则在发生故障转移时,新会话将不知道正在进行的调用。否则,此呼叫可能会永远挂起,等待永远不会出现的响应。
为避免这种情况,Apache ActiveMQ Artemis将通过使它们抛出
javax.jms.JMSException
(如果使用JMS)或带有错误代码的ActiveMQException
来取消阻止故障转移时正在进行的任何阻塞调用。ActiveMQException.UNBLOCKED
。客户端代码可以捕获此异常并根据需要重试任何操作。如果要取消阻塞的方法是对
commit()
或prepare()
的调用,则事务将自动回滚,Apache ActiveMQ Artemis将抛出javax.jms.TransactionRolledBackException
(如果使用JMS) ,如果使用核心API,则错误代码为ActiveMQException
的{{1}}。