当前位置: 首页 > 面试题库 >

当两个应用程序都使用嵌入式activemq时,如何将Jms消息从一个弹簧引导应用程序发送到另一个

沙宣
2023-03-14
问题内容

我有两个spring-boot应用程序。在接收方应用程序的Application.java中,我有:

@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    return factory;
}

并在Receiver.java中…

@JmsListener(destination = "myQueue", containerFactory = "myFactory")
public void receiveMessage(String tradeString) throws JSONException, IOException {
    tradeImpl = new ObjectMapper().readValue(tradeString, TradeImpl.class);
}

在发件人应用程序中,我只使用:

public void send(trade) {
   String queueName = "myQueue";
   String tradeString = new ObjectMapper().writeValueAsString(trade);
   jmsTemplate.convertAndSend(queueName, tradeString);
}

所以我只是将消息发送到接收方应用程序中指定的队列名称。我在日志中得到以下内容

无法启动JMX连接器无法绑定到URL [rmi:// localhost:1099> /
jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi
[Root异常是java.rmi.AlreadyBoundException:

结论为:

但是正如我提到的,我之前没有做过这个,也不知道是否可行。在Spring Boot docs中没有找到显式消息,这种组合不起作用。

我怀疑嵌入式Spring Boot JMS代理背后的想法是仅允许本地内存集成测试,而不是将嵌入式JMS代理暴露给外界。

有人知道我想做的事确实可行吗?如果不是,是否有关于如何使用嵌入式代理在春季启动应用程序之间实现消息传递的建议?


问题答案:

如果您的2个Spring Boot应用程序位于同一jvm上,则只需 添加以下两个应用程序之一的application.properties:

spring.activemq.broker-url=vm://localhost

当Spring
Boot检测到ActiveMQ在类路径上可用时,它也可以配置ConnectionFactory。如果存在代理,则将自动启动并配置嵌入式代理(只要未通过配置指定代理URL)。

如果您的2个Spring Boot应用程序位于2个不同的jvm上:在一个spring boot应用程序中,您需要具备:

在pom.xml中

    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-activemq -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-activemq</artifactId>
        <version>1.4.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
    </dependency>

在第二个:

在application.properties中

spring.activemq.broker-url=tcp://localhost:61616

在pom.xml中

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
</dependency>

如果您有2个jvm,每个应用程序1个,默认情况下,spring boot将仅使用vm连接器配置AMQ,在第一个应用程序中,您需要添加tcp连接器,如下所示:

@Bean(initMethod = "start", destroyMethod = "stop")
public BrokerService broker() throws Exception {
    final BrokerService broker = new BrokerService();
    broker.addConnector("tcp://localhost:61616");
    broker.addConnector("vm://localhost");
    broker.setPersistent(false);
    return broker;
}


 类似资料:
  • 问题内容: 我确信你们中有人注意到,如果您有Acrobat Reader(或其他PDF阅读器),并在Firefox中打开一个PDF,您会看到它嵌入在您的标签中。有什么方法可以将应用程序嵌入JFrame中? 问题答案: 这是一个相当棘手的问题。通常,诸如Adobe Reader之类的本机应用程序不提供可以嵌入到swing应用程序中的组件。但是在Windows中,有COM / OLE方法可以将应用程序

  • 我不确定我遇到的问题是概念问题还是技术问题,因为配置错误。 目标是在应用程序容器中托管的Java EE应用程序(特别是WildFly)和独立运行的Java SE应用程序之间发送双向消息,都使用标准JMS协议和主题。我认为这应该是可能的,只要他们都使用相同的经纪人和相同的主题。 因此,我有一个外部 Artemis 实例作为消息代理运行,并在 Java EE 应用程序的单独 Bean 中成功设置了生产

  • 寻找更新的解决方案,运行最新的离子1.1.0版本,使用科尔多瓦5. x。尝试能够在chrome中浏览一个网站,并使用网络意图将该网址发送到我的ionicAndroid应用程序。我的应用程序编译和运行,但是当我试图使用共享功能从chrome(或任何其他应用程序),并选择我的应用程序共享,我的应用程序崩溃。 我第一次尝试使用插件: 离子插件添加https://github.com/Initsogar/

  • Google在这里有一个很好的页面展示了如何这样做:https://developer.android.com/distribute/tools/promote/linking.html 基本上,使用这段代码,它将打开Play Store到新apps页面: 我错过了什么?我肯定它非常简单,也许我需要进口的东西。 解决方案:导入Uri类是一个问题。我仍然不确定新的热键是什么来导入它。Apple-Sh

  • 我使用带有单个文件组件的网页包。 我的菜单标题中有一个Vue实例,用于显示购物车下拉列表: 我在同一页面中有另一个Vue实例(产品目录): 我想$emit一个事件从一个实例到另一个实例:当目录更改时,我想调用ShoppingCart中的函数。 我测试eventHub: 所以我在每个实例上导入事件: 目录中: 在购物车: 但这行不通。仅当$on和$emit位于Vue的同一实例中时,它才起作用。 我认

  • 因此,我试图在另一个项目(测试框架)中添加一个SpringBoot可执行jar作为依赖项。 然而,一旦添加到pom和导入。Java导入不能正常工作。如果我看看罐子里面,所有的包都在前面加上: BOOT-INF/classes.some.package.classname.class 还有一些与Spring启动相关的软件包,MANIFEST等。 如果我将SpringBoot应用程序的构建切换为只使用