Spring boot Artemis嵌入式代理行为

时间:2016-09-30 11:52:40

标签: spring-boot broker activemq-artemis

早上好,

我最近一直在与spring-boot-artemis-starter挣扎。 我对它的弹簧支持的理解如下:

  • 设置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");
            }
        };
    }

}

3 个答案:

答案 0 :(得分:6)

您只需在Artemis配置中添加连接器和接受器即可。使用Spring Boot Artemis starter Spring创建一个Configuration bean,用于EmbeddedJMS配置。您可以在ArtemisEmbeddedConfigurationFactory类中看到此信息,其中将为配置设置Plotly.newPlot('myDiv', data) 。您可以编辑此bean并通过自定义Uncaught TypeError: Plotly.newPlot is not a function bean更改Artemis行为,该bean将被Spring autoconfig吸取并应用于Configuration。

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

InVMAcceptorFactory

答案 1 :(得分:3)

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

我们还意识到,如果没有自定义程序,application.properties文件就不会被加载,所以无论你在那里提到什么主机或端口,都不会计算它。

按照两个示例所述添加定制程序后,它的工作没有问题。

我们发现了一些结果:

  • 配置ArtemisConfigurationCustomizer后只加载了application.properties

  • 您不再需要使用嵌入式spring boot artemis客户端的broker.xml

  • 许多显示使用Artemis的例子都使用了" in-vm"协议,而我们只是想使用netty tcp协议,所以我们需要将它添加到配置中

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

请参阅此页:stackoverflow jmslistener-usage-for-publish-subscribe-topic

  

使用@JmsListener时,它使用DefaultMessageListenerContainer   它扩展了JmsDestinationAccessor,默认情况下具有   pubSubDomain设置为false。如果此属性为false,则为   在队列上运行。如果要使用主题,则必须设置此主题   属性值为true。

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

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

答案 2 :(得分:1)

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