当前位置: 首页 > 知识库问答 >
问题:

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

宋鸿云
2023-03-14

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

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

  • Spring Boot 2.3.1
  • 骆驼3.4.2
  • Tomcat 8.5.5
from("vm:task")
    .log(LoggingLevel.WARN, "********** Received task message");
    .to("jms:topic:local.private.task")
    .routeId("taskToJms");
o.a.c.impl.engine.DefaultProducerCache (169) - >>>> vm://task Exchange[]

共有1个答案

应涵容
2023-03-14

我会贴出答案,或者至少是“一个”答案,给任何可能发现自己处于我发现自己所处的令人困惑的境地的人。

简而言之,答案是最好避免尝试在一个大的JVM(如Tomcat)中跨不同的上下文发送VM消息。相反,使用JMS之类的东西。我使用了Artemis,并在Tomcat的一个spring boot应用程序中设置了一个嵌入式代理。在其他应用程序(即客户端)中,我需要连接到嵌入式artemis服务器,这要求您添加一个@configuration类(在支持嵌入式代理的模块中),该类实现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.addAcceptorConfigurathtml" target="_blank">ion(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
    }
}

这样,您的其他东西就可以连接到嵌入的Artemis代理。此外,当您将camel升级到其他版本时,您不必担心在tomcat共享的lib文件夹中升级camel核心JAR。为了维护目的,保持事情简单是很好的!

 类似资料:
  • 我有一个项目是由一个比我更有才华的人发起和策划的,我已经到了一个我不知道如何弥合的地步。 这是一个Java /JavaFX/SpringBoot项目,而不是Swing项目。我看到很多答案re: Swing。两个应用程序也在Gradle中设置,因此两个应用程序都有自己单独的命令,并且在CentOS 7中运行。两个应用程序都有自己的,单独的,。我相信最初的设计是为了,有目的地,从GUI中删除对数据的任

  • 我有一个项目是由比我更有才华的人发起和策划的,我已经到了一个我不知道如何沟通的地步。 这是一个Java /JavaFX/SpringBoot项目,而不是Swing项目。我看到很多答案re: Swing。两个应用程序也在Gradle中设置,因此两个应用程序都有自己单独的命令,并且在CentOS 7中运行。两个应用程序都有自己的,单独的,。我相信最初的设计是为了,有目的地,从GUI中删除对数据的任何访

  • 问题内容: 我的结构是这样的: 而结构是: 我主要尝试这样做: 是否可以在模板内部执行类似的操作? 问题答案: 引用的文档,该操作的语法: 这意味着您可以将一个可选数据传递给模板执行,而不是更多。如果要传递多个值,则必须将它们包装为传递的某个单个值。 因此,我们应该将这些数据包装到struct或map中。但是我们不能在模板中编写Go代码。我们可能要做的是注册一个函数,将这些数据传递给该函数,该函数

  • 我有在Tomcat 8服务器上运行的应用程序。应用程序使用log4j2进行内部日志记录。我想有一个application.war和两个不同的日志配置文件,如:log4j2_dev.xml和log4j2_prod.xml取决于环境。 在生产环境中,我希望部署应用程序。war并使用log4j2_prod.xml,在开发环境中部署应用程序。war并使用log4j2_dev.xml 那么,我如何指定在应用

  • 问题内容: 在应用程序之间传递简单数据(例如String)的最佳方法是什么?字符串是发送方应用中已知的字段,接收方应用需要此字段。 我曾考虑将其存储在MODE_WORLD_READABLE SharedPreferences中,但我不一定知道包名称(该名称将存在于库中),该值可以由各种应用程序设置,因此很难查找。 我当时想两个应用程序都包含BroadcastReceivers。打开接收方应用程序后

  • 我正在Openshift环境中部署一个Spring boot Web应用程序。由于我们在同一个引导项目中使用JSP和CSS等Web组件,因此我们将应用程序部署为Openshift环境中的WAR文件。我还添加了tomcat-embed-jasper来解析这些Web组件并执行WAR文件。 但问题是,当我在Openshift环境中部署它时,应用程序消耗了超过1GB的资源。有什么方法可以减少应用程序的内存