lou*_*eye 8 broker spring-boot activemq-artemis
大家早,
我最近一直在与spring-boot-artemis-starter挣扎.我对它的spring-boot支持的理解如下:
spring.artemis.mode=embedded,和tomcat一样,spring-boot将实现通过tcp(服务器模式)可访问的代理.以下命令应该成功:nc -zv localhost 61616spring.artmis.mode=native和spring-boot只会根据spring.artemis.*属性(客户端模式)配置jms模板.客户端模式可以在我的机器上使用独立的artemis服务器.不幸的是,我无法在服务器模式下到达tcp端口.
如果有人确认我对嵌入式模式的理解,我将不胜感激.
感谢您的旅行帮助
经过一番挖掘后,我注意到spring-boot-starter-artemis开箱即用的实现使用了org.apache.activemq.artemis.core.remoting.impl.invm.InVMAcceptorFactoryacceptor.我想知道这不是根本原因(我再也不是专家).但似乎有一种方法可以自定义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");
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
我和我的同事遇到了与此链接上的文档完全相同的问题(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
Run Code Online (Sandbox Code Playgroud)
如果有人对完整示例感兴趣,我已将其上传到我的 github:https : //github.com/CorDharel/SpringBootArtemisServerExample
您只需要为Artemis配置添加连接器和接受器.使用Spring Boot Artemis starter Spring创建一个Configuration bean,用于EmbeddedJMS配置.您可以在ArtemisEmbeddedConfigurationFactory类中看到这一点,其中InVMAcceptorFactory将为配置设置.您可以编辑此bean并通过自定义ArtemisConfigurationCustomizerbean 更改Artemis行为,该bean 将被Spring autoconfig吸取并应用于Configuration.
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()));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5290 次 |
| 最近记录: |