如何在 Tomcat 中的多个 Spring 引导应用程序之间传递 Camel VM 消息
How to pass Camel VM messages between multiple Spring Boot applications in Tomcat
我们有一个部署在 Tomcat 中的应用程序堆栈,它由几个 Spring 启动应用程序组成。作为我们操作的一部分,我们希望将一些消息发送到 vm 端点,骆驼路由将在其中使用这些消息,然后将它们发布到 JMS 主题以供对消息感兴趣的任何其他 Spring 引导应用程序使用关于那个话题。
当我启动应用程序堆栈时,有三个 spring 启动应用程序使用 camel,我在日志中看到 camel 正常启动。但是,当其中一个应用程序向 vm 端点发送消息时,从该端点使用并将消息路由到 jms 主题的路由似乎没有收到该消息。我已将 camel-core
jar 放在我的 tomcat lib 目录中。在 spring 启动 maven 插件配置中,我指定了 camel-core jar 的排除项。奇怪的是,那个罐子无论如何都在 war 的 WEB-INF/lib
中!所以我已经停止 Tomcat,从展开的 war 中删除了那个 jar,然后重新启动 Tomcat,但这并没有改变消息传递的行为。
以下是我们使用的版本:
- Spring 启动 2.3.1
- 骆驼 3.4.2
- Tomcat8.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
class 接收一个 ProducerTemplate
,该 ProducerTemplate
在构造函数中自动连接。当应用程序调用此组件发送消息时,我在日志中看到一行内容为
o.a.c.impl.engine.DefaultProducerCache (169) - >>>> vm://task Exchange[]
所以消息似乎正在生成并正确发送到 vm 端点。但是,我在路由引擎的骆驼路由中看不到它已 received/consumed 的迹象,因为该路由的日志行没有记录任何内容,而且我在日志中看不到接收消息的其他迹象。奇怪的是,在我将骆驼核心 jar 放入 tomcat 的 lib 目录之前,我没有收到 vm:task 端点上没有任何消费者的错误。
我做错了什么吗?如何让 spring boot maven 插件真正排除 camel-core?为什么消息(发送到 vm 端点)没有被路由引擎中的路由消耗?在此先感谢您的帮助。
编辑:通过在 war 插件的配置中添加排除项,我能够将 camel-core 排除在 war 文件之外,但我仍然无法使用该消息在虚拟机端点上。
我会post回答,或者至少是“一个”答案,给任何可能发现自己处于我所处的令人困惑的情况的人。
简而言之,答案是最好避免尝试在像 Tomcat 这样的大型 JVM 中跨不同上下文发送 VM 消息。相反,使用类似 JMS 的东西。我使用了 Artemis,并在 tomcat 的 spring 引导应用程序之一中建立了一个嵌入式代理。在其他应用程序(将成为客户端)中,我需要连接到嵌入式 artemis 服务器,这需要您添加一个 @Configuration
class(在支持嵌入式代理的模块中)实现 ArtemisConfigurationCustomizer
:
@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 共享库文件夹中的 camel-core jar。出于维护目的,最好保持简单!
无论如何,我希望这对有一天可能会发现自己在这里的其他人有所帮助。
我们有一个部署在 Tomcat 中的应用程序堆栈,它由几个 Spring 启动应用程序组成。作为我们操作的一部分,我们希望将一些消息发送到 vm 端点,骆驼路由将在其中使用这些消息,然后将它们发布到 JMS 主题以供对消息感兴趣的任何其他 Spring 引导应用程序使用关于那个话题。
当我启动应用程序堆栈时,有三个 spring 启动应用程序使用 camel,我在日志中看到 camel 正常启动。但是,当其中一个应用程序向 vm 端点发送消息时,从该端点使用并将消息路由到 jms 主题的路由似乎没有收到该消息。我已将 camel-core
jar 放在我的 tomcat lib 目录中。在 spring 启动 maven 插件配置中,我指定了 camel-core jar 的排除项。奇怪的是,那个罐子无论如何都在 war 的 WEB-INF/lib
中!所以我已经停止 Tomcat,从展开的 war 中删除了那个 jar,然后重新启动 Tomcat,但这并没有改变消息传递的行为。
以下是我们使用的版本:
- Spring 启动 2.3.1
- 骆驼 3.4.2
- Tomcat8.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
class 接收一个 ProducerTemplate
,该 ProducerTemplate
在构造函数中自动连接。当应用程序调用此组件发送消息时,我在日志中看到一行内容为
o.a.c.impl.engine.DefaultProducerCache (169) - >>>> vm://task Exchange[]
所以消息似乎正在生成并正确发送到 vm 端点。但是,我在路由引擎的骆驼路由中看不到它已 received/consumed 的迹象,因为该路由的日志行没有记录任何内容,而且我在日志中看不到接收消息的其他迹象。奇怪的是,在我将骆驼核心 jar 放入 tomcat 的 lib 目录之前,我没有收到 vm:task 端点上没有任何消费者的错误。
我做错了什么吗?如何让 spring boot maven 插件真正排除 camel-core?为什么消息(发送到 vm 端点)没有被路由引擎中的路由消耗?在此先感谢您的帮助。
编辑:通过在 war 插件的配置中添加排除项,我能够将 camel-core 排除在 war 文件之外,但我仍然无法使用该消息在虚拟机端点上。
我会post回答,或者至少是“一个”答案,给任何可能发现自己处于我所处的令人困惑的情况的人。
简而言之,答案是最好避免尝试在像 Tomcat 这样的大型 JVM 中跨不同上下文发送 VM 消息。相反,使用类似 JMS 的东西。我使用了 Artemis,并在 tomcat 的 spring 引导应用程序之一中建立了一个嵌入式代理。在其他应用程序(将成为客户端)中,我需要连接到嵌入式 artemis 服务器,这需要您添加一个 @Configuration
class(在支持嵌入式代理的模块中)实现 ArtemisConfigurationCustomizer
:
@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 共享库文件夹中的 camel-core jar。出于维护目的,最好保持简单!
无论如何,我希望这对有一天可能会发现自己在这里的其他人有所帮助。