Spring启动Artemis嵌入代理行为



大家早上好,

我最近一直在与spring-boot-artemis-starter作斗争。我对它的spring-boot支持的理解如下:

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

客户端模式在我的机器上与独立的artemis服务器一起工作很好。不幸的是,我无法在服务器模式下访问tcp端口。

如果有人能证实我对嵌入式模式的理解,我将不胜感激。

谢谢你的帮助

经过一番挖掘之后,我注意到spring-boot-start -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配置中添加一个Connector和一个Acceptor。通过Spring Boot Artemis starter, Spring创建了一个用于EmbeddedJMS配置的配置bean。您可以在ArtemisEmbeddedConfigurationFactory类中看到这一点,其中将为配置设置InVMAcceptorFactory。你可以编辑这个bean,并通过自定义的ArtemisConfigurationCustomizer bean更改Artemis的行为,它将被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()));
    }
}

我和我的同事遇到了和这个链接上的文档(章节Artemis Support)完全相同的问题,文档中没有提到添加一个单独的artemisia configurationcustomizer——这很可悲,因为我们意识到如果没有这个Customizer,我们的Spring Boot App会启动并表现得好像一切正常,但实际上它什么都不会做。

我们还意识到,如果没有Customizer,应用程序。属性文件没有被加载,所以无论你提到的主机或端口是什么,它都不会被计算在内。

在添加了上述两个示例所述的Customizer之后,它可以正常工作。

下面是我们得出的一些结果:

  • 只加载应用程序。

  • 您不再需要broker.xml与嵌入式spring引导artemis客户端

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

  • 对我来说,最重要的参数是发布子域,因为我使用的是主题而不是队列。如果您正在使用主题,则需要将此参数设置为true,否则JMSListener将不会读取消息。

见此页:stackoverflow jmslistener-usage-for-publish-subscribe-topic

当使用@JmsListener时,它使用DefaultMessageListenerContainer它扩展了JmsDestinationAccessor,默认情况下具有pubSubDomain设置为false。当此属性为false时,则为对队列进行操作。如果你想使用主题,你必须设置这个

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

如果有人对完整的例子感兴趣,我已经把它上传到我的github:https://github.com/CorDharel/SpringBootArtemisServerExample

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

相关内容

  • 没有找到相关文章

最新更新