早上好,
我最近一直在与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");
}
};
}
}
答案 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通道。