首页 > 解决方案 > Quarkus 应用程序可以连接到多个 JMS 代理实例吗?

问题描述

有什么方法可以使用 Quarkus 应用程序中的 JMS 连接到多个 ActiveMQ Artemis 实例?

我在文档中看到,对于 [Qpid JMS - AMQP] 和 [Artemis JMS],属性中的连接 URL 都是字符串,并且它是必需的。这是否意味着我不能指定多个要连接的代理 URL?

我不想使用camel-quarkus-activemqcamel-quarkus-jms因为这个当前的错误

标签: quarkusactivemq-artemis

解决方案


就像@Robbie Gemmell 在评论中指出的那样。

一个 ConnectionFactory 采用所需参数的代理 URL。然后对于其他的 ConnectionFactory 我们可以直接实例化它。像这样:

应用程序属性

# Configures the Artemis properties.
quarkus.artemis.url=tcp://localhost:61616
quarkus.artemis.username=admin
quarkus.artemis.password=admin

# Broker URL for the second ConnectionFactory
brokerURLService=tcp://remote-service:61616

骆驼配置

@ApplicationScoped
public class CamelConfigurationz {

  @Value("${brokerURLService}")
  private String brokerURLService;

  @Named
  public Sjms2Component sjms2(ConnectionFactory connectionFactory) {
    Sjms2Component sjms2 = new Sjms2Component();
    sjms2.setConnectionFactory(connectionFactory);
    return sjms2;
  }

  @Named
  public Sjms2Component sjms2Service(ConnectionFactory amqJmsServiceFactory) {
    Sjms2Component sjms2Service = new Sjms2Component();
    sjms2Service.setConnectionFactory(amqJmsServiceFactory);
    return sjms2Service;
  }

  @Named
  public ActiveMQJMSConnectionFactory amqJmsServiceFactory() throws JMSException {
    ActiveMQJMSConnectionFactory amqJmsServiceFactory = new ActiveMQJMSConnectionFactory();
    amqJmsServiceFactory.setBrokerURL(brokerURLService);
    return amqJmsServiceFactory;
  }

}

路线

public class CamelRoutes extends EndpointRouteBuilder {

  @Override
  public void configure() throws Exception {

    from(sjms2("inquarkus"))
    .log("got activemq message ---------------------------------")
    .to(sjms2("outquarkus"));
    
    from(sjms2("sjms2Service", "inquarkusService"))
    .log("got activemq message service ---------------------------------")
    .to(sjms2("sjms2Service", "outquarkusService"));

  }

}

它可以以不同的方式完成,因此请注意,我在上面的示例中也使用了 spring di 扩展来使用@Value。Camel-quarkus-endpointdsl 也可以使用 EndpointRouteBuilder。


推荐阅读