【问题标题】:org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failedorg.apache.activemq.transport.InactivityIOException:无法发送,通道已经失败
【发布时间】:2015-01-22 16:14:23
【问题描述】:

我正在使用 apache 的 activemq 进行排队。在将内容写入队列时,我们已经开始经常看到以下异常:

Caused by: org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed: 
    at org.apache.activemq.transport.AbstractInactivityMonitor.doOnewaySend(AbstractInactivityMonitor.java:282)
    at org.apache.activemq.transport.AbstractInactivityMonitor.oneway(AbstractInactivityMonitor.java:271)
    at org.apache.activemq.transport.TransportFilter.oneway(TransportFilter.java:85)
    at org.apache.activemq.transport.WireFormatNegotiator.oneway(WireFormatNegotiator.java:104)
    at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:68)
    at org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:81)
    at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:86)
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1366)

我不知道是什么原因造成的——坦率地说,我什至不知道从哪里开始调试导致这种情况的原因。

这是队列设置代码:

    camelContext = new DefaultCamelContext();
    camelContext.setErrorHandlerBuilder(new LoggingErrorHandlerBuilder());
    camelContext.getShutdownStrategy().setTimeout(SHUTDOWN_TIMEOUT_SECONDS);

    routePolicy = new RoutePolicy();
    routePolicy.setCamelContext(camelContext);

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    connectionFactory.setBrokerURL(queueUri);
    // use a pooled connection factory between the module and the queue
    pooledConnectionFactory = new PooledConnectionFactory(connectionFactory);

    // how many connections should there be in the session pool?
    pooledConnectionFactory.setMaxConnections(this.maxConnections);
    pooledConnectionFactory.setMaximumActiveSessionPerConnection(this.maxActiveSessionPerConnection);
    pooledConnectionFactory.setCreateConnectionOnStartup(true);
    pooledConnectionFactory.setBlockIfSessionPoolIsFull(false);

    JmsConfiguration jmsConfiguration = new JmsConfiguration(pooledConnectionFactory);
    jmsConfiguration.setDeliveryPersistent(false); // do not store a copy of the messages on the queue

    ActiveMQComponent activeMQComponent = ActiveMQComponent.activeMQComponent(queueUri);
    activeMQComponent.setConfiguration(jmsConfiguration);
    camelContext.addComponent("activemq", activeMQComponent);
    Component activemq = camelContext.getComponent("activemq");

    // register endpoints for queues and topics
    Endpoint queueEndpoint = activemq.createEndpoint("activemq:queue:polaris.*");
    Endpoint topicEndpoint = activemq.createEndpoint("activemq:topic:polaris.*");
    producerTemplate = camelContext.createProducerTemplate();

    camelContext.start();
    queueEndpoint.start();
    topicEndpoint.start();

就像我说的那样,该错误并未提示任何调试方向,并且在我可以确定我的配置设置不正确的 100% 的情况下,它不会发生。

【问题讨论】:

  • 你是如何创建骆驼路线的?你是用 producerTemplate 发送消息到队列吗?
  • 如果您大幅减少每个连接的活动会话数,问题会消失还是发生频率降低?您是在快速发送消息还是有一段时间不活动?看看inactivity monitor
  • 我认为你在做某事,@Ralf。我发现了一堆“超出最大连接数”的错误,所以我增加了最大连接数,从那以后我就再也没有看到这些错误了。
  • 在 JMS-Configuration 中的本地服务器 Broker URL 端口应该是 61616 而不是 8161: --> spring.activemq.broker-url=tcp://localhost:61616

标签: java apache-camel activemq


【解决方案1】:
  • 管理端口:61616(默认)
  • 服务端口:8161(默认)

将您的代理 url 端口更改为 61616 并运行

refer this

【讨论】:

    【解决方案2】:

    最近我遇到了同样的问题。我找到了这个https://issues.apache.org/jira/browse/AMQ-6600

    当类路径中缺少其中一个 jar 时,Apache ActiveMQ 客户端会引发 InactivityIOException。就我而言,它是 hawtbuf-1.11.jar。当我将此 jar 添加到类路径时,它开始工作而没有错误。

    【讨论】:

    • 您是如何发现丢失了哪个 jar 的?
    【解决方案3】:

    检查是否有非 Jms 客户端 ping 您的 JMS 代理。这可能是外部监控工具、keepalived 等负载平衡工具或其他工具。

    【讨论】:

    • 我没有看到。不过谢谢你的想法!
    • @Denise 你是怎么检查这个的?您可以更改您的端口,看看异常是否仍然发生。
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2021-06-27
    • 2018-12-30
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多