12

大家早,

我最近一直在努力使用 spring-boot-artemis-starter。我对其 spring-boot 支持的理解如下:

  • 设置spring.artemis.mode=embedded,并且像 tomcat 一样,spring-boot 将实例化通过 tcp (服务器模式)可访问的代理。以下命令应该成功:nc -zv localhost 61616
  • setspring.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");
            }
        };
    }

}
4

3 回答 3

11

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

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()));
    }
}
于 2017-03-19T10:56:08.600 回答
7

我和我的同事遇到了与此链接(Artemis 支持章节)上的文档完全相同的问题,没有提及添加单独的 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

于 2017-07-14T14:31:51.117 回答
2

嵌入模式将代理作为应用程序的一部分启动。这种设置没有可用的网络协议,只允许 InVM 调用。自动配置公开了您可以调整的必要部分,尽管我不确定您实际上是否可以使用嵌入式模式拥有 TCP/IP 通道。

于 2016-09-30T12:38:38.957 回答