【问题标题】:Solace - How to auto-reconnect when I get "Error sending message - already closed"Solace - 当我收到“发送消息时出错 - 已关闭”时如何自动重新连接
【发布时间】:2019-02-26 13:41:32
【问题描述】:

我的系统开始使用 solace API (sol-jms-10.1.1.jar) 引发异常。重新启动应用程序后,问题就消失了。我怀疑 MQ 在一个周末进行了维护,然后连接出现了问题。

我可以使用任何设置来自动断开断开的连接并重新连接以解决问题,而不必在这种情况下退回应用程序?

javax.jms.IllegalStateException: Error sending message - already closed (Tried to perform operation on a closed XML message producer)
    at sun.reflect.GeneratedConstructorAccessor677.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.solacesystems.jms.impl.JMSExceptionValue.newInstance(JMSExceptionValue.java:32)
    at com.solacesystems.jms.impl.JCSMPExceptionMapper$ArrayListMapper.get(JCSMPExceptionMapper.java:31)
    at com.solacesystems.jms.impl.JCSMPExceptionMapper.get(JCSMPExceptionMapper.java:94)
    at com.solacesystems.jms.impl.Validator.createJMSException(Validator.java:572)
    at com.solacesystems.jms.SolMessageProducer.sendMessage(SolMessageProducer.java:387)
    at com.solacesystems.jms.SolMessageProducer.send(SolMessageProducer.java:199)
...

Caused by: com.solacesystems.jcsmp.StaleSessionException: Tried to perform operation on a closed XML message producer
    at com.solacesystems.jcsmp.impl.JCSMPXMLMessageProducer.throwClosedException(JCSMPXMLMessageProducer.java:1434)
    at com.solacesystems.jcsmp.impl.JCSMPXMLMessageProducer.createBytesXMLMessage(JCSMPXMLMessageProducer.java:1864)
    at com.solacesystems.jcsmp.impl.JCSMPXMLMessageProducer.createXMLContentMessage(JCSMPXMLMessageProducer.java:1949)
    at com.solacesystems.jms.impl.FlowMessageProducerAdapter.createXMLContentMessage(FlowMessageProducerAdapter.java:85)
    at com.solacesystems.jms.encoding.DefaultJMSEncoder.encode(DefaultJMSEncoder.java:80)
    at com.solacesystems.jms.SolMessageProducer.sendMessage(SolMessageProducer.java:377)
    ... 27 more
Caused by: com.solacesystems.jcsmp.JCSMPTransportException: (JCSMPTransportException) Error receiving data from underlying connection.
    at com.solacesystems.jcsmp.protocol.impl.TcpClientChannel$ClientChannelReconnect.call(TcpClientChannel.java:2257)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    ... 3 more
Caused by: ((Client name: myurl   Local addr: ...  Remote addr: ...) - )  com.solacesystems.jcsmp.JCSMPErrorResponseException: 403: Replication Is Standby [Subcode:56]
    at com.solacesystems.jcsmp.protocol.impl.TcpChannel.executePostOnce(TcpChannel.java:228)
    at com.solacesystems.jcsmp.protocol.impl.ChannelOpStrategyClient.performOpen(ChannelOpStrategyClient.java:90)
    at com.solacesystems.jcsmp.protocol.impl.TcpClientChannel.performOpenSingle(TcpClientChannel.java:414)
    at com.solacesystems.jcsmp.protocol.impl.TcpClientChannel.access$800(TcpClientChannel.java:104)
    at com.solacesystems.jcsmp.protocol.impl.TcpClientChannel$ClientChannelReconnect.call(TcpClientChannel.java:2098)
    ... 4 more

【问题讨论】:

    标签: solace


    【解决方案1】:

    Solace API 能够在连接断开后自动重新连接。 此行为由“重新连接重试”属性控制。

    详情可以在https://docs.solace.com/Solace-JMS-API/Managing-Sessions.htm#establishing_connections_577400906_329588的“重新连接重试”下找到

    由于异常,应用程序已达到 Solace API 已放弃尝试重新连接的程度。 现在由应用程序重新创建连接。

    【讨论】:

    • “Solace API 已放弃尝试重新连接。现在由应用程序重新创建连接。” - 我希望应用程序不需要重新创建连接,为什么 solace API 不这样做?我现在正在实施这个解决方案,但希望驱动程序比我必须尝试/捕获重新创建连接更有弹性。
    • 因为所有配置的“重新连接重试次数”都已用尽。
    • 来自答案中的链接:“–1 值指定允许无限次数的重新连接退出”。因此,如果您希望 API 在后台无限期地重新连接,请将 Reconnect Retries 属性设置为 -1。
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2019-09-23
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多