【问题标题】:How to push and consume a message from Spring boot to standalone JBoss Wildfly 10 Artemis Activemq?如何将消息从 Spring Boot 推送和消费到独立的 JBoss Wildfly 10 Artemis Activemq?
【发布时间】:2019-05-28 18:48:03
【问题描述】:

我编写了一个 Spring Boot 应用程序,旨在推送和使用来自 JBoss Wildfly 10 ActiveMQ Artemis 的消息(注意:不是 Apache ActiveMQ 5.x)。我正在通过 Spring Tool Suite 运行此代码。

我还在本地系统(8080 端口)上设置了 JBoss Wildfly 10,并在 standalone-full.xml 配置文件中运行了相同的配置,以便在 Wildfly 的消息传递子系统中创建一个名为 TestQ 的队列。

接下来我在 Spring Boot 代码中使用 JMSTemplate 来推送和消费上述队列中的消息,application.properties 中包含以下内容:

spring.activemq.username=admin
spring.activemq.username=admin
spring.activemq.broker-url=http://localhost:8080

但是,我在运行代码时收到 Could not send message 错误。

您能否建议需要进行哪些更改?

我的基本目标是使用 Spring Boot 从这个外部队列推送和消费消息。

我在网上尝试了替代方案,但我得到的每个示例都是针对 Apache ActiveMQ 而不是 ActiveMQ Artemis 嵌入到 JBoss Wildfly 中,这是必需的。

我有以下 2 个课程:

1.

@SpringBootApplication
@EnableJms
public class App  {

    @Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }

    public static void main(String[] args) {
        // Launch the application
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);

        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);

        System.out.println("Sending a JMS message.");
        jmsTemplate.convertAndSend("sampleQueue", "Hello world!");
    } 
}

2.

@Component
public class ReceiveMessage {

    @JmsListener(destination = "sampleQueue")
    public void receiveMessage(String msg) {
        System.out.println("Received :" + msg);
    }
}

【问题讨论】:

  • 强烈建议:将 org.apache.activemq.artemis 日志设置为 DEBUG(在客户端和服务器上,如果不同的主机/不同的 WildFly 应用程序),回收应用程序服务器,并重新运行一些端到端测试.这可能是确定 1)谁失败以及 2)究竟是什么失败的最快/最有效的方法
  • 我在上面提到了activemq broker url。对于独立的wildfly来说这似乎可以吗?

标签: spring-boot jboss-eap-7 activemq-artemis


【解决方案1】:

在我看来application.properties 中的属性是针对 ActiveMQ 5.x 客户端而不是 ActiveMQ Artemis 客户端的。正如Spring Boot documentation 所说:

Artemis 配置由spring.artemis.* 中的外部配置属性控制。

此外,您应该将 Wildfly 上的端口直接公开给 ActiveMQ Artemis 代理,而不是使用合并端口 8080,因为这需要在 Artemis 客户端的 URL 上将 httpUpgradeEnabled 设置为 true,并且没有出于某种原因使用 Spring Boot 集成的方法。

【讨论】:

  • 这是一个很好的猜测……但我讨厌“猜测”。 +1,我鼓励 OP 尝试一下(如果可行,请“接受”您的答案)。问:如果它不起作用,你有什么建议?我的投票是“详细记录”。你有其他建议吗?问:什么是一个很好的“Hello world”来验证你有一个好的 ActiveMQ Artemis 安装和配置?有什么建议吗?
  • 我尝试如下更改属性,在这种情况下,我没有收到任何错误消息,但消息也没有推送到队列中:spring.artemis.mode=native spring.artemis.host=127.0 .0.1 spring.artemis.port=8080 spring.artemis.user=jboss spring.artemis.password=jboss@123 还有什么我可以包括的吗?或者我可以使用任何其他方法来代替 JMSTemplate?
  • 我更新了我的评论来解决你的问题,拉尔夫。简而言之,我认为您的问题是使用8080。您需要直接连接到 Artemis。
  • 是的,我尝试将属性中的端口更改为 61616,但仍然无法正常工作。您是否有任何简单的代码基本 Spring Boot 代码将消息推送到 jboss Wildfly 队列,以便我可以将其用作参考?
  • 您是否修改了 Wildfly 配置以暴露端口 61616?默认情况下不公开此端口。 Artemis 代理附带了一个 Sping Boot 示例,您可以see online,但它不使用 Wildfly,它使用 AMQP 客户端而不是 Artemis 核心客户端。
猜你喜欢
  • 2013-09-08
  • 2017-03-13
  • 2019-01-24
  • 2017-01-10
  • 1970-01-01
  • 2016-06-23
  • 2018-12-12
  • 2016-02-02
  • 2016-11-18
相关资源
最近更新 更多