spring-boot - Spring 启动 Artemis 嵌入式代理行为

标签 spring-boot broker activemq-artemis

早上好,

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

  • 套装spring.artemis.mode=embedded并且,像 tomcat 一样,spring-boot 将实例化一个可以通过 tcp(服务器模式)访问的代理。以下命令应该会成功:nc -zv localhost 61616
  • 套装spring.artmis.mode=native而spring-boot只会根据spring.artemis.*配置jms模板属性(客户端模式)。

  • 客户端模式与我机器上的独立 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");
                }
            };
        }
    
    }
    

    最佳答案

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

    Spring Boot 应用程序的示例配置类:

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

    关于spring-boot - Spring 启动 Artemis 嵌入式代理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39790913/

    相关文章:

    mysql - 在 SpringBoot 和 Angular 中使用枚举

    java - Spring 启动和 RabbitMQ : Failed to connect to reactor. io.net.impl.netty.tcp.NettyTcpClient

    java - 如何在主线程中保持 apache Camel 上下文处于 Activity 状态

    activemq-artemis - 无法访问 Artemis 控制台

    java - 如何启用包含特定单词的 url 过滤器?

    javascript - C3 图表不从 jQuery 数据呈现

    spring-boot - Spring 启动,线程 "main"中的异常 java.lang.NoClassDefFoundError : org/SpringFramework/boot/SpringApplication

    jms - 将消息从一个 ActiveMQ 转发到另一个?

    python - celery 取消自己

    java - 是否可以在 XInclude 属性 href 中使用 Java 系统属性变量?