首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >永久JMS连接失败但没有错误或InactivityExceptions

永久JMS连接失败但没有错误或InactivityExceptions
EN

Stack Overflow用户
提问于 2019-05-28 13:27:32
回答 1查看 144关注 0票数 0

我们有一个类似于这个old question的问题。然而,我们的设置有点不同。例如,心跳应该已经存在,因为我们有来自ActiveMQ的默认ActiveMQ。

我们有一个使用嵌入式代理的客户端。嵌入式代理具有远程代理的网络连接器,作为机器上的独立服务运行。这样,我们就可以将客户端和服务器之间的通信解耦。嵌入式代理充当客户端的本地队列。

客户端向嵌入式代理发送消息。这些消息要么通过网络连接器流向远程代理,要么(当连接暂时不可用时)留在嵌入式代理中,直到重新建立连接为止。

嵌入式代理和远程代理都是Apache ActiveMQ的实例。JMS实现基于Spring。

在实践中,我们有时会看到奇怪的行为(通常经过一段很长的时间之后,没有任何问题):

  • 网络连接器列在远程代理管理控制台的connections-选项卡中。但是,并非所有消息都是在远程代理中传递的。通常,字节消息被卡在嵌入式代理中,而文本消息则被传递到远程代理的队列中。
  • 网络连接器列在远程代理管理控制台的connections-选项卡中。但是,没有在远程代理中传递任何消息。

远程代理上启用了无活动监视器。嵌入式代理是使用下面所示的代码创建的(为了简洁起见,省略SSL代码)。

我们不知道是什么导致了问题,更重要的是,为什么设置不能自动恢复。我们期望此安装程序自动检测到连接不可用,并设置一个新连接。然而,这种情况似乎并没有发生。

有没有人知道我们可以从哪里开始寻找,或者,更好的是,知道问题可能是什么?

代码语言:javascript
复制
@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory(final Optional<TransportListener> transportListener)
{
    final ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();

    activeMQConnectionFactory.setClientIDPrefix(clientIDPrefix);
  activeMQConnectionFactory.setBrokerURL(this.env.getProperty("activemq.connection.url"));
    activeMQConnectionFactory.setUserName(this.env.getProperty("activemq.users.username"));
    activeMQConnectionFactory.setPassword(this.env.getProperty("activemq.users.password"));

    transportListener.ifPresent(activeMQConnectionFactory::setTransportListener);

    return activeMQConnectionFactory;
}

@Bean
public CachingConnectionFactory cachingConnectionFactory(final ActiveMQConnectionFactory activeMQConnectionFactory)
{
    return new CachingConnectionFactory(activeMQConnectionFactory);
}

@Bean
public JmsTemplate jmsTemplate(final CachingConnectionFactory cachingConnectionFactory)
{
    final JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
    return jmsTemplate;
}

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(final ActiveMQConnectionFactory activeMQConnectionFactory)
{
    final DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(activeMQConnectionFactory);
    factory.setConcurrency("3-10");

    return factory;
}

@Bean
public MessageSender messageSender()
{
    return new MessageSender();
}

@Bean(initMethod = "start", destroyMethod = "stop")
public BrokerService bufferingBroker() throws Exception
{
    final BrokerService broker = new BrokerService();

    String brokerName = UUID.randomUUID().toString();
    broker.setBrokerName(brokerName);

    final NetworkConnector networkConnector = new DiscoveryNetworkConnector(
        new URI("static://" + this.env.getProperty("activemq.connection.url")));
    networkConnector.setUserName(this.env.getProperty("activemq.users.username"));
    networkConnector.setPassword(this.env.getProperty("activemq.users.password"));
    networkConnector.setNetworkTTL(5);
    broker.addNetworkConnector(networkConnector);

    return broker;
}

@Bean
public ActiveMQConnectionFactory embeddedActiveMQConnectionFactory(final BrokerService bufferingBroker) throws Exception
{
    final ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
    activeMQConnectionFactory.setBrokerURL("vm://" + bufferingBroker.getBrokerName() + "?create=false");

    return activeMQConnectionFactory;
}

@Bean
public CachingConnectionFactory embeddedCachingConnectionFactory(final ActiveMQConnectionFactory embeddedActiveMQConnectionFactory) throws Exception
{
    return new CachingConnectionFactory(embeddedActiveMQConnectionFactory);
}

@Bean
public JmsTemplate embeddedJmsTemplate(final CachingConnectionFactory embeddedCachingConnectionFactory) throws Exception
{
    return new JmsTemplate(embeddedCachingConnectionFactory);
}

@Bean
public DefaultJmsListenerContainerFactory embeddedJmsListenerContainerFactory(final ActiveMQConnectionFactory embeddedActiveMQConnectionFactory) throws Exception
{
    final DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(embeddedActiveMQConnectionFactory);
    factory.setConcurrency("3-10");

    return factory;
}

@Bean
public BufferedMessageSender bufferedMessageSender()
{
    return new BufferedMessageSender();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-27 15:23:41

结果发现,外部防火墙阻塞了消息,而文本消息可以通过,而不会出现任何问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56343363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档