Spring boot 如何在Tomcat中的多个Spring引导应用程序之间传递Camel VM消息
我们有一个部署在Tomcat中的应用程序堆栈,它由几个Spring引导应用程序组成。作为我们操作的一部分,我们希望将一些消息发送到vm端点,在该端点处,驼峰路由将使用这些消息,然后将它们发布到JMS主题,供其他对该主题的消息感兴趣的Spring Boot应用程序使用 当我启动应用程序堆栈时,有三个spring引导应用程序使用了camel,我在日志中看到camel正确启动。但是,当其中一个应用程序向vm端点发送消息时,从该端点使用消息并将消息路由到jms主题的路由似乎没有收到该消息。我已经将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
camel-core
jar放在我的tomcat-lib目录中。在SpringBootMaven插件配置中,我指定了骆驼核心jar的排除。奇怪的是,这个jar在战争的WEB-INF/lib
中!因此,我停止了Tomcat,从爆炸战争中移除了那个jar,并重新启动了Tomcat,但这并没有改变消息传递的行为
以下是我们正在使用的版本:
- 弹簧靴2.3.1
- 骆驼3.4.2
- Tomcat 8.5.5
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。为了便于维护,最好保持简单
不管怎样,我希望这能帮助其他人,也许有一天他们会发现自己在这里