如何使用 Spring Boot 配置嵌入式 ActiveMQ Broker URL

2023-11-26

我遵循了一个使用 Spring Boot(版本 1.4.X)设置和运行嵌入式 ActiveMQ 的简单示例。这是示例的链接https://spring.io/guides/gs/messaging-jms/

我的课程结构如下:

@SpringBootApplication
@EnableJms
public class Application {

@Autowired
ConfigurableApplicationContext context;

@Bean
JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory) {
    SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);

    return factory;
}

@JmsListener(destination = "mailbox-destination", containerFactory = "myJmsContainerFactory")
public void receiveMessage(String message) {
    System.out.println("Message received: " + message);
    context.close();
}

public static void main(String[] args) throws Exception {
    FileSystemUtils.deleteRecursively(new File("active-data"));
    ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

    JmsTemplate template = context.getBean(JmsTemplate.class);
    MessageCreator messageCreator = new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
            return session.createTextMessage("Test");
        }
    };
    template.send("mailbox-destination", messageCreator);
}
}

和 build.gradle 如下所示:

apply plugin: 'java'
apply plugin: 'maven'

group = 'jms.activemq'
version = '0.0.1-SNAPSHOT'

description = """jms.activemq"""

sourceCompatibility = 1.5
targetCompatibility = 1.5

repositories {
     maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-activemq', version:'1.4.0.RELEASE'
    testCompile(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version:'1.4.0.RELEASE') {
exclude(module: 'commons-logging')
}
}

到目前为止一切正常(只要我将 application.properties 留空),但是如果我尝试通过将以下内容添加到 application.properties 文件来配置代理 url(以便远程客户端可以连接):

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

我得到一个例外:

2016-08-03 12:46:00.938  WARN 88180 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'org.springframework.jms.config.internalJmsListenerEndpointRegistry'; nested exception is org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
2016-08-03 12:46:00.939  INFO 88180 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2016-08-03 12:46:00.945  INFO 88180 --- [           main] utoConfigurationReportLoggingInitializer :
org.springframework.context.ApplicationContextException: Failed to start bean 'org.springframework.jms.config.internalJmsListenerEndpointRegistry'; nested exception is org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:176) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:51) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:346) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:149) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:112) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:874) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at jms.activemq.Application.main(Application.java:37) [main/:na]
Caused by: org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:169) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.listener.AbstractJmsListeningContainer.start(AbstractJmsListeningContainer.java:273) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.config.JmsListenerEndpointRegistry.startIfNecessary(JmsListenerEndpointRegistry.java:243) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.config.JmsListenerEndpointRegistry.start(JmsListenerEndpointRegistry.java:206) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
... 12 common frames omitted
Caused by: javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:373) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:303) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:243) ~[activemq-client-5.13.4.jar:5.13.4]
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:180) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.listener.AbstractJmsListeningContainer.createSharedConnection(AbstractJmsListeningContainer.java:413) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.listener.AbstractJmsListeningContainer.establishSharedConnection(AbstractJmsListeningContainer.java:381) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.listener.AbstractJmsListeningContainer.doStart(AbstractJmsListeningContainer.java:285) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.listener.SimpleMessageListenerContainer.doStart(SimpleMessageListenerContainer.java:210) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.jms.listener.AbstractJmsListeningContainer.start(AbstractJmsListeningContainer.java:270) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE]
... 15 common frames omitted
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_92]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_92]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_92]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_92]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_92]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_92]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_92]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_92]
at org.apache.activemq.transport.tcp.TcpTransport.connect(TcpTransport.java:525) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.tcp.TcpTransport.doStart(TcpTransport.java:488) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.AbstractInactivityMonitor.start(AbstractInactivityMonitor.java:168) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.InactivityMonitor.start(InactivityMonitor.java:52) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.WireFormatNegotiator.start(WireFormatNegotiator.java:72) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:353) ~[activemq-client-5.13.4.jar:5.13.4]
... 23 common frames omitted 

我查看了一些链接,但仍然无法确定导致问题的原因。非常感谢一些有帮助的见解或材料。

我最初的想法是 Spring Boot 将读取这些值并使用它们来配置 ActiveMQ 代理,但看起来它使用这些值连接到代理(代理已经配置了不同的设置)。如何更改代理配置,以便外部客户端(不是从与代理相同的 JVM 运行)可以使用 tcp://localhost:61616 访问代理

UPDATE:

我遵循了嵌入列出的经纪人的方法之一here并能够嵌入具有所需 URL 的代理并能够连接到它。然而,我最终似乎拥有了两个代理,因为 Spring Boot 似乎仍然像以前一样继续创建一个代理。

基本上,我只是在调用 SpringApplication.run(Application.class, args); 之前添加这段代码并在 main 方法的开头添加

BrokerService broker = new BrokerService();
broker.addConnector("tcp://localhost:61617");
broker.setPersistent(false);
broker.start();

有两个代理实例(我相信)正在运行,感觉根本不对。

1)这是嵌入经纪人的正确方法吗

2)如果是这样,我怎样才能阻止Spring Boot启动另一个? (无需删除 spring-boot-starter-activemq 依赖项)。

提前致谢。


我相信我在玩了一段时间后就明白了这一点。我认为有两个实例正在运行,因为我试图创建与默认嵌入式代理的连接(试图确定它是否已创建/存在),如下所示:

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");

但显然 Spring Boot 认为它不存在并在当时创建了它。

因此,为了仅运行我创建的实例,我所需要做的就是提供一个在创建实例时添加到连接器的 URL(在本例中)tcp://localhost:61616) 在里面application.properties文件如下

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

Spring Boot 将连接到该实例并且不会创建另一个实例。如果属性文件中没有上述条目(或者如果您尝试使用 vm://localhost 连接到嵌入式实例?...就像我上面所做的那样),Spring Boot 将继续为您实例化一个实例。

我也读过这篇文章文档:

Spring Boot 还可以在检测到时配置一个 ConnectionFactory ActiveMQ 在类路径上可用。如果经纪人在场, 嵌入式代理会自动启动并配置(只要 没有通过配置指定代理 URL)。

但在我看来,它并没有很好地阐明(但它确实让我朝着正确的方向思考)。

如果您有不同的发现或者我的结论是否正确,请告诉我们。谢谢!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Spring Boot 配置嵌入式 ActiveMQ Broker URL 的相关文章

随机推荐

  • Flutter - TabBar 中不同的浮动操作按钮

    我正在尝试在一个不同的浮动按钮TabBar扑腾中 但我会尝试很多选择 但我不知道如何做 抱歉 我添加更多详细信息 我想做一个应用程序TabBar 就像这个颤振示例一样 如果您看到这是一个tabBarDemo应用程序 我可以在选项卡之间进行更
  • 在 matlab 中传递冒号作为函数的参数

    我想知道是否可以使用冒号 作为函数的参数 像这样的东西 function y func x if x is a colon do this else do that end 还可以通过关键工作吗end作为函数的参数 也1 end 3 end
  • JPA 2 @SequenceGenerator @GenerateValue 产生唯一约束冲突

    问题概述 在看似随机的时候 我们会得到一个异常 postgresql 重复键违反了唯一约束 我确实认为我知道我们的问题是什么 但我不想在没有可重现的测试用例的情况下对代码进行更改 但由于我们无法在生产中随机生成之外的任何环境中重现它 所以我
  • 有没有办法在 .net core 中对 F# 项目进行单元测试?

    我正在尝试创建一个在 net core 中运行的 F 单元测试项目 dotnet new t xunittest 将为 C 创建一个 xunit 测试项目 但 F 不存在此类等效项 我尝试修改从上面显示的 C dotnet new 输出的
  • R:有效地从数组中删除单维

    我正在寻找一种快速方法来从 R 数组中删除冗余维度 类似于squeeze MATLAB 中的命令 现在我结合了melt 和cast 命令来自reshape2包 但应该有一种不太复杂的方法来做同样的事情 到目前为止我就是这样做的 requir
  • 将 stargazer 与通过在分割 data.frame 上 lapply-ing 创建的 lm 对象列表一起使用

    我正在尝试为一组回归创建一个观星表 其中我对数据的子集运行每个回归 我认为 做到这一点的自然方法是使用split要从我的数据创建 data frames 列表 请使用以下命令创建 lm 对象列表lapply在 data frames 列表上
  • 从流中读取 XML

    我正在使用 ASP NET 并从表单导入 XML 文件 现在我将其转换为Stream Stream inputStream XmlFileUploadControl PostedFile InputStream 因为我以后可能需要这个版本
  • OSX 上 JVM 的 Zombie http.proxyHost 设置

    我最近更改了网络 并从 OSX Leopard 上的系统偏好设置 网络面板中删除了所有 HTTP 代理设置 然而 现在每当我使用 Eclipse 时 Java HTTP 代理系统属性似乎都会 自动 设置为使用我现在已失效的 HTTP 代理
  • 如何在CSS中使图像悬停?

    我想在悬停时将图像从正常更改为更亮 我的代码 div class nkhome a href Home html img src Images btnhome png a div nkhome margin left 260px top 1
  • 关于Spring框架应用中Beans.xml配置文件的使用

    我正在学习Spring MVC 今天 试图了解如何实现 JDBC DAO 我在 Spring Spring 而不是 Spring MVC 中找到了这个 Hello World 并且我开始看到它 因为我认为要实现 DAO 我必须创建一个单独的
  • 如何管理docker中的临时文件?

    我正在运行一个 Java 应用程序 它以给定格式读取一些数据并在临时目录中写入 CSV 文件 该文件完全写入后 数据将批量加载到数据库中 加载完成后 该文件将立即删除 不应共享此文件 现在 我想在 docker 容器中运行该应用程序的 ja
  • 有没有办法在 Android 设备上安全地存储用户数据?

    我正在编写一个应用程序 用户有时会通过它下订单 我想让用户可以选择保存他们的账单信息 姓名 地址等 以便以后如果他们想再次下订单时可以快速恢复 用户将输入密码以保护数据 显然 我不能只是将其作为文件放在设备上 因为任何人都可以 root 查
  • 在 BigQuery 中包含带有 ANY_VALUE 的空值

    我有一个 供应商 表 看起来像这样 company itemKey itemPriceA itemPriceB companyA 203913 20 10 companyA 203914 20 20 companyA 203915 25 5
  • 首先将列添加到带有数据库的 aspnetusers

    我找到了许多通过数据库迁移向身份表添加列 我已成功移至应用程序数据库 的教程 但我的理解是这不适用于数据库拳头项目 那么 如何将列添加到数据库第一个项目中的 aspnetusers 表中 我想添加一个名为 Is RegComplete 的位
  • PHP 函数使用外部变量

    function parts part structure http site url content echo tructure part php 这个函数使用了一个变量 site url这是在本页顶部定义的 但该变量未传递到函数中 我们
  • 如何使用 iframe 进行异步(AJAX)文件上传?

    我正在尝试使用ajax上传文件 我读到如果不使用就不可能做到这一点iframe 我写
  • 分解 C++ 代码大小

    我正在为旧博客文章中的第一个问题寻找一个很好的 Stack Overflow 风格答案C 代码大小 我将在下面重复 我真的很想要一些工具 最好是基于 g 来显示编译 链接代码的哪些部分是从 C 源代码的哪些部分生成的 例如 查看是否正在为数
  • 如何生成随机数,每个随机数与所有其他元素的差异至少为 x?

    我知道这违背了随机数的定义 但我的项目仍然需要这个 例如 我想生成一个包含 5 个随机元素的数组range 0 200 现在 我希望每个元素之间至少有 15 的差异 所以随机数组应该看起来像这样 15 45 99 132 199 我可以使用
  • 使用 Javascript 将 HTML 的 DocType 作为字符串获取

    我知道我可以通过访问 doctype 对象document doctype or document childNodes 0 但我的问题是将 doctype 作为字符串获取 我可以通过调用在 chrome 和 safari 中执行此操作do
  • 如何使用 Spring Boot 配置嵌入式 ActiveMQ Broker URL

    我遵循了一个使用 Spring Boot 版本 1 4 X 设置和运行嵌入式 ActiveMQ 的简单示例 这是示例的链接https spring io guides gs messaging jms 我的课程结构如下 SpringBoot