英文:
Jms not working after update to spring boot 3 (and ConnectionFactory from javax to jakarta)
问题
在从SpringBoot v.2.5.5升级到v3.1.0后,需要将ConnectionFactory
也从javax.jms.ConnectionFactory
更新为jakarta.jms.ConnectionFactory
。
我没有改变其他任何东西。不幸的是,现在我遇到了这样的错误:
ERROR - 无法刷新用于目标 'tServerEvent' 的JMS连接 - 重试使用FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}。原因:无法连接到经纪人URL:tcp://localhost:61616。原因:java.net.ConnectException:连接被拒绝:没有进一步的信息
我进行了调查,并与旧的javax.ConnectionFactory
进行了比较,似乎它们的默认brokerUrl
不同
对于javax.jms.ConnectionFactory
,它是:vm://localhost?broker.persistent=false
对于jakarta.jms.ConnectionFactory
,它是:tcp://localhost:61616
即使我手动设置经纪人URL,像这样:
spring:
activemq:
broker-url: vm://localhost?broker.persistent=false
它仍然不起作用,错误是:原因:无法创建传输。原因:java.io.IOException:未识别的传输方案:[vm]
我不知道为什么jakarta.ConnectionFactory和旧的javax.ConnectionFactory的默认brokerUrl不同,也不知道如何成功运行我的应用程序。
如果您对我有一些提示,我将不胜感激。
以下是带有ConnectionFactory的JmsListenerContainerFactory
Bean的代码:
import jakarta.jms.ConnectionFactory;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
@Configuration
@EnableJms
public class JmsConfig {
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
}
英文:
After update from SpringBoot v.2.5.5 to v3.1.0 it was necessary to update also ConnectionFactory
from javax.jms.ConnectionFactory
to jakarta.jms.ConnectionFactory
.
I haven't changed anything else. Unfortunately now I'm getting an errors like this:
ERROR - Could not refresh JMS Connection for destination 'tServerEvent' - retrying using FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. Cause: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: no further information
I investigated it and compared with the old javax.ConnectionFactory
and it seems that default brokerUrl
for them is different
for javax.jms.ConnectionFactory
it was : vm://localhost?broker.persistent=false
for jakarta.jms.ConnectionFactory
it is : tcp://localhost:61616
Even if I manually set broker url, like this:
spring:
activemq:
broker-url: vm://localhost?broker.persistent=false
it is not working still and the error is: Cause: Could not create Transport. Reason: java.io.IOException: Transport scheme NOT recognized: [vm]
I don't know why the default brokerUrl is different for jakarta.ConnectionFactory and old javax.ConnectionFactory and don't know how can I run my application succesfullt.
I would appreciate if you have some tips for me.
And here is code with JmsListenerContainerFacroty
Bean with ConnectionFactory:
import jakarta.jms.ConnectionFactory;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
@Configuration
@EnableJms
public class JmsConfig {
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
}
答案1
得分: 5
对于 ActiveMQ,在 Spring Boot 3.0 中已被移除,因为它不支持 JMS 3.0(jakarta.jms.*
APIs)。Spring Boot 3.1 恢复了对自动配置 ActiveMQ 客户端的支持。嵌入式代理支持尚未恢复,因为ActiveMQ的代理尚未支持 JMS 3.0。
要在 Spring Boot 3.1 中使用 ActiveMQ,您将需要使用外部代理,就像Spring Boot 的 ActiveMQ 烟雾测试所做的那样。
英文:
Support for ActiveMQ was removed in Spring Boot 3.0 as is did not support JMS 3.0 (the jakarta.jms.*
APIs). Spring Boot 3.1 restored support for auto-configuring an ActiveMQ client. Embedded broker support has not been restored as ActiveMQ's broker does not yet support JMS 3.0.
To use ActiveMQ will Spring Boot 3.1, you will have to use an external broker as Spring Boot's ActiveMQ smoke test does.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论