Spring 启动 Artemis 嵌入式代理行为

Spring boot Artemis embedded broker behaviour

大家早上好,

我最近一直在为 spring-boot-artemis-starter 苦苦挣扎。 我对其 spring-boot 支持的理解如下:

客户端模式在我机器上的独立 artemis 服务器上工作得很好。 不幸的是,我永远无法在服务器模式下访问 tcp 端口。

如果有人确认我对嵌入式模式的理解,我将不胜感激。

感谢您的游览帮助

经过一些挖掘,我注意到 spring-boot-starter-artemis 提供的开箱即用的实现使用 org.apache.activemq.artemis.core.remoting.impl.invm.InVMAcceptorFactory 接受器。我想知道这是否不是根本原因(同样我绝不是专家)。 但似乎有一种方法可以自定义 artemis 配置。 因此我尝试了以下配置但没有任何运气:

@SpringBootApplication
public class MyBroker {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(MyBroker.class, args);
    }

    @Autowired
    private ArtemisProperties artemisProperties;

    @Bean
    public ArtemisConfigurationCustomizer artemisConfigurationCustomizer() {
        return configuration -> {
            try {
               configuration.addAcceptorConfiguration("netty", "tcp://localhost:" + artemisProperties.getPort());
            } catch (Exception e) {
                throw new RuntimeException("Failed to add netty transport acceptor to artemis instance");
            }
        };
    }

}

嵌入式模式将代理作为应用程序的一部分启动。这种设置没有可用的网络协议,只允许 InVM 调用。自动配置 exposes the necessary pieces you can tune 虽然我不确定您是否真的可以使用嵌入式模式拥有 TCP/IP 频道。

您只需将一个连接器和一个接受器添加到您的 Artemis 配置中。使用 Spring Boot Artemis starter Spring 创建一个将用于 EmbeddedJMS 配置的配置 bean。您可以在 ArtemisEmbeddedConfigurationFactory class 中看到这一点,其中将为配置设置 InVMAcceptorFactory。您可以编辑此 bean 并通过自定义 ArtemisConfigurationCustomizer bean 更改 Artemis 行为,该 bean 将被 Spring autoconfig 吸收并应用于配置。

您的 Spring 引导应用程序的示例配置 class:

import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory;
import org.springframework.boot.autoconfigure.jms.artemis.ArtemisConfigurationCustomizer;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ArtemisConfig implements ArtemisConfigurationCustomizer {
    @Override
    public void customize(org.apache.activemq.artemis.core.config.Configuration configuration) {
        configuration.addConnectorConfiguration("nettyConnector", new TransportConfiguration(NettyConnectorFactory.class.getName()));
        configuration.addAcceptorConfiguration(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
    }
}

我和我的同事遇到了完全相同的问题,因为 this link (chapter Artemis Support) 上的文档没有提到添加单独的 ArtemisConfigurationCustomizer - 这很可悲,因为我们意识到如果没有这个定制器,我们的 Spring 启动应用程序将开始并表现得好像一切都好,但实际上它什么也做不了。

我们还意识到,如果没有定制程序,application.properties 文件将不会被加载,因此无论您在那里提到的是什么主机或端口,它都不会被计算在内。

按照两个示例所述添加定制程序后,它工作正常。

这里是我们得出的一些结果:

  • 它仅在配置 ArtemisConfigurationCustomizer

  • 后加载 application.properties
  • 有了嵌入式 spring 引导 artemis 客户端,您不再需要 broker.xml

  • 许多展示 Artemis 使用的示例使用 "in-vm" 协议,而我们只想使用 netty tcp 协议,因此我们需要将其添加到配置中

  • 对我来说最重要的参数是 pub-sub-domain,因为我使用的是主题而不是队列。如果您正在使用主题,则需要将此参数设置为 true,否则 JMSListener 将不会读取消息。

查看此页面:

When using a @JmsListener it uses a DefaultMessageListenerContainer which extends JmsDestinationAccessor which by default has the pubSubDomain set to false. When this property is false it is operating on a queue. If you want to use topics you have to set this properties value to true.

In Application.properties:
spring.jms.pub-sub-domain=true

如果有人对完整示例感兴趣,我已将其上传到我的 github: https://github.com/CorDharel/SpringBootArtemisServerExample