Spring boot 如何在Tomcat中的多个Spring引导应用程序之间传递Camel VM消息

Spring boot 如何在Tomcat中的多个Spring引导应用程序之间传递Camel VM消息,spring-boot,apache-camel,activemq-artemis,spring-camel,Spring Boot,Apache Camel,Activemq Artemis,Spring Camel,我们有一个部署在Tomcat中的应用程序堆栈,它由几个Spring引导应用程序组成。作为我们操作的一部分,我们希望将一些消息发送到vm端点,在该端点处,驼峰路由将使用这些消息,然后将它们发布到JMS主题,供其他对该主题的消息感兴趣的Spring Boot应用程序使用 当我启动应用程序堆栈时,有三个spring引导应用程序使用了camel,我在日志中看到camel正确启动。但是,当其中一个应用程序向vm端点发送消息时,从该端点使用消息并将消息路由到jms主题的路由似乎没有收到该消息。我已经将cam

我们有一个部署在Tomcat中的应用程序堆栈,它由几个Spring引导应用程序组成。作为我们操作的一部分,我们希望将一些消息发送到vm端点,在该端点处,驼峰路由将使用这些消息,然后将它们发布到JMS主题,供其他对该主题的消息感兴趣的Spring Boot应用程序使用

当我启动应用程序堆栈时,有三个spring引导应用程序使用了camel,我在日志中看到camel正确启动。但是,当其中一个应用程序向vm端点发送消息时,从该端点使用消息并将消息路由到jms主题的路由似乎没有收到该消息。我已经将
camel-core
jar放在我的tomcat-lib目录中。在SpringBootMaven插件配置中,我指定了骆驼核心jar的排除。奇怪的是,这个jar在战争的
WEB-INF/lib
中!因此,我停止了Tomcat,从爆炸战争中移除了那个jar,并重新启动了Tomcat,但这并没有改变消息传递的行为

以下是我们正在使用的版本:

  • 弹簧靴2.3.1
  • 骆驼3.4.2
  • Tomcat 8.5.5
我们的“路由引擎”是第一个将所有内容链接在一起的spring引导应用程序,它使用来自vm端点的驼峰路由,并生成有关jms主题的消息。它使用
camel-spring-boot-starter
spring-boot-starter-artemis
camel-vm-starter
artemis-jms-server
camel-jms-starter
。其
RouteBuilder
的配置方法如下所示:

from("vm:task")
    .log(LoggingLevel.WARN, "********** Received task message");
    .to("jms:topic:local.private.task")
    .routeId("taskToJms");
向vm端点生成消息的应用程序使用
camel-spring-boot-starter
camel-vm-starter
。在该应用程序中,它有一个
@Service
类,该类接收构造函数中自动连接的
ProducerTemplate
。当应用程序调用这个组件来发送消息时,我在日志中看到一行内容是

o.a.c.impl.engine.DefaultProducerCache (169) - >>>> vm://task Exchange[]
因此,消息似乎正在生成并正确发送到vm端点。但是,由于路由引擎的驼峰路由的日志行没有记录任何内容,并且由于我没有在日志中看到接收消息的其他指示,因此我没有看到在路由引擎的驼峰路由中接收/使用该消息的指示。奇怪的是,在我将camel-core-jar放入tomcat的lib目录之前,我没有在vm:task端点上获得任何使用者的错误

我是不是做错了什么?如何让SpringBootMaven插件真正排除驼峰核心?为什么路由引擎中的路由没有使用消息(发送到vm端点)?提前感谢您的帮助


编辑:通过在war插件的配置中添加一个排除项,我可以将camel core排除在war文件之外,但我仍然无法使用vm端点上的消息。

我将发布答案,或者至少是“一个”答案,供任何可能发现自己处于我所处的令人困惑的情况的人使用

简言之,答案是最好避免在像Tomcat这样的大型JVM中尝试跨单独的上下文发送VM消息。相反,使用类似JMS的东西。我使用了Artemis,在tomcat的一个spring启动应用程序中安装了一个嵌入式代理。在其他应用程序(将是客户端)中,我需要连接到嵌入式artemis服务器,这要求您添加一个
@Configuration
类(在支持嵌入式代理的模块中),该类实现
ArtemicConfigurationCustomizer

@Configuration
public class ArtemisConfig implements ArtemisConfigurationCustomizer {
    @Override
    public void customize(final org.apache.activemq.artemis.core.config.Configuration configuration) {
        configuration.addConnectorConfiguration("nettyConnector", new TransportConnfiguration(NettyConnectorFactory.class.getName()));
        configuration.addAcceptorConfiguration(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
    }
}
这样,您的其他东西就可以连接到嵌入式Artemis代理。另外,当您将camel升级到其他版本时,您不必担心升级tomcat共享lib文件夹中的camel核心jar。为了便于维护,最好保持简单


不管怎样,我希望这能帮助那些有一天会在这里找到自己的人。

我将为那些可能已经发现自己陷入困惑境地的人发布答案,或者至少是“一个”答案

简言之,答案是最好避免在像Tomcat这样的大型JVM中尝试跨单独的上下文发送VM消息。相反,使用类似JMS的东西。我使用了Artemis,在tomcat的一个spring启动应用程序中安装了一个嵌入式代理。在其他应用程序(将是客户端)中,我需要连接到嵌入式artemis服务器,这要求您添加一个
@Configuration
类(在支持嵌入式代理的模块中),该类实现
ArtemicConfigurationCustomizer

@Configuration
public class ArtemisConfig implements ArtemisConfigurationCustomizer {
    @Override
    public void customize(final org.apache.activemq.artemis.core.config.Configuration configuration) {
        configuration.addConnectorConfiguration("nettyConnector", new TransportConnfiguration(NettyConnectorFactory.class.getName()));
        configuration.addAcceptorConfiguration(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
    }
}
这样,您的其他东西就可以连接到嵌入式Artemis代理。另外,当您将camel升级到其他版本时,您不必担心升级tomcat共享lib文件夹中的camel核心jar。为了便于维护,最好保持简单

不管怎样,我希望这能帮助其他人,也许有一天他们会发现自己在这里