Spring 启动 ActiveMQJMSConnectionFactory 以连接到 JBoss EAP 6.1 HornetQ

Spring Boot ActiveMQJMSConnectionFactory to connect to a JBoss EAP 6.1 HornetQ

我不确定我正在尝试做的事情是否可行,但基本上我正在尝试将当前的实现从 HornetQ 更新为使用 Artemis 的 ActiveMQ。

我的系统是来自 HornetQ 的 JMS 消费者。

如果我使用 "HornetQJMSConnectionFactory",当前的实现可以工作,但是当我更改为 ActiveMQJMSConnectionFactory 时,它无法连接。

为了测试新的实现,我启动了一个 ActiveMQ 的本地实例并使用新的实现。

所以我尝试了多种不同的方法,包括强制协议 =HORNETQ,但没有任何效果。

没有编译错误,"only":

ERROR o.s.j.l.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful - Could not refresh JMS Connection for destination 'QueueX' - retrying using FixedBackOff{interval=5000, currentAttempts=1, maxAttempts=unlimited}. Cause: Failed to create session factory; nested exception is ActiveMQConnectionTimedOutException[errorType=CONNECTION_TIMEDOUT message=AMQ219013: Timed out waiting to receive cluster topology. Group:null]

旧实现

private ConnectionFactory createConnectionFactory(SyncProperties.SmpJmsServer jmsServer) {

    final String className = "org.hornetq.core.remoting.impl.netty.NettyConnectorFactory";

    Map<String, Object> params = new HashMap<String, Object>();
    params.put("host", getJmsHost());
    params.put("port", getJmsPort());
    TransportConfiguration transportConfiguration = new TransportConfiguration(className, params);

    HornetQJMSConnectionFactory hornetQJMSConnectionFactory = new HornetQJMSConnectionFactory(false, transportConfiguration);
    hornetQJMSConnectionFactory.setConnectionTTL(300000);
    hornetQJMSConnectionFactory.setConsumerWindowSize(0);
    UserCredentialsConnectionFactoryAdapter adapter = new UserCredentialsConnectionFactoryAdapter();
    adapter.setTargetConnectionFactory(hornetQJMSConnectionFactory);
    adapter.setUsername(getJmsUsername());
    adapter.setPassword(getJmsPassword());
    CachingConnectionFactory smpCachingConnectionFactory = new CachingConnectionFactory(adapter);
    return smpCachingConnectionFactory;
}

新实现

 public ConnectionFactory createActiveMQJMSConnectionFactory()  {

    ActiveMQJMSConnectionFactory activeMQJMSConnectionFactory = new ActiveMQJMSConnectionFactory(false, amqTransportConfiguration());

    activeMQJMSConnectionFactory.setConnectionTTL(300000);
    activeMQJMSConnectionFactory.setConsumerWindowSize(0);

    UserCredentialsConnectionFactoryAdapter adapter = new UserCredentialsConnectionFactoryAdapter();
    adapter.setTargetConnectionFactory(activeMQJMSConnectionFactory);
    adapter.setUsername(getJmsUsername());
    adapter.setPassword(getJmsPassword());
    CachingConnectionFactory smpCachingConnectionFactory = new CachingConnectionFactory(adapter);

    return smpCachingConnectionFactory;
}



@Bean("amqTransportConfiguration")
public TransportConfiguration amqTransportConfiguration() {
    return new TransportConfiguration("org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory", getParams());
}

static Map<String, Object> getParams() {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("host", getJmsHost());
    params.put("port", getJmsPort());
    return params;
}

感谢您的帮助。

尽管 ActiveMQ Artemis 基于 HornetQ 代码库,但 ActiveMQ Artemis 客户端无法与 HornetQ 代理对话。每个客户端在连接时发送一个 protocol/client 标识符。这个 ID 在 ActiveMQ Artemis 客户端和 HornetQ 客户端之间是不同的。 HornetQ 代理不会识别 ActiveMQ Artemis 客户端发送的 ID,因此不会完成握手。

也就是说,我们已经努力确保 HornetQ 客户端仍然可以与 ActiveMQ Artemis 代理对话。这就是 org.apache.activemq.artemis.core.protocol.hornetq.HornetQProtocolManager 提供的。

无论如何,升级您的客户端对您来说并没有多大用处。如果你想升级任何东西,我建议你升级 EAP,甚至移动到独立版本的 ActiveMQ Artemis,这样你就可以获得最新的修复和功能。