【问题标题】:Spring Boot ActiveMQJMSConnectionFactory to connect to a JBoss EAP 6.1 HornetQSpring Boot ActiveMQJMSConnectionFactory 连接到 JBoss EAP 6.1 HornetQ
【发布时间】:2020-10-08 19:27:09
【问题描述】:

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

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

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

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

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

没有编译错误,“只有”:

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;
}

感谢您的帮助。

【问题讨论】:

    标签: spring-boot jms spring-jms hornetq activemq-artemis


    【解决方案1】:

    虽然 ActiveMQ Artemis 基于 HornetQ 代码库,但 ActiveMQ Artemis 客户端无法与 HornetQ 代理通信。每个客户端在连接时都会发送一个协议/客户端标识符。这个 ID 在 ActiveMQ Artemis 客户端和 HornetQ 客户端之间是不同的。 HornetQ 代理无法识别 ActiveMQ Artemis 客户端发送的 ID,因此不会完成握手。

    也就是说,我们一直在努力确保 HornetQ 客户端仍然可以与 ActiveMQ Artemis 代理通信。这就是org.apache.activemq.artemis.core.protocol.hornetq.HornetQProtocolManager 所提供的。

    无论如何,升级您的客户端并不会真正为您带来太多帮助。如果您想升级任何东西,我建议您升级 EAP,甚至迁移到 ActiveMQ Artemis 的独立版本,以便获得最新的修复和功能。

    【讨论】:

    • 非常感谢您的帮助!!我想就是这样,它会保持不变。过去几天我尝试了所有不同的东西并取得了成功,所以虽然我不高兴,因为它不起作用,但我有一些更接近:D 是的,实际上我一直在考虑升级 EAP,所以我想一旦我们这样做了我们会再试一次。
    • 完成 :) 再次感谢!
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2015-12-12
    • 2014-03-10
    • 2020-02-24
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多