我很难弄清楚如何实现Spring Boot JMS Listener,在JBoss应用程序服务器中监听ActiveMQ队列。因此,我选择发布一个问题并用我的最终解决方案回答它,希望它可以为您节省几个小时。
Spring Boot自动配置支持ActiveMQ,但由于它位于JBoss服务器内部,Spring Boot无法连接ActiveMQ。事实上,您需要通过查找JNDI提供程序来定义连接工厂和jmsListenerContainerFactory。
@Configuration
@EnableJms
public class ActiveMqConnectionFactoryConfig {
@Value("${broker.url}")
String brokerUrl;
@Value("${borker.username}")
String userName;
@Value("${borker.password}")
String password;
@Value("${queue}")
String queueName;
private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
private static final String CONNECTION_FACTORY = "jms/RemoteConnectionFactory";
@Bean
public ConnectionFactory connectionFactory() {
try {
System.out.println("Retrieving JMS queue with JNDI name: " + CONNECTION_FACTORY);
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName(CONNECTION_FACTORY);
jndiObjectFactoryBean.setJndiEnvironment(getEnvProperties());
jndiObjectFactoryBean.afterPropertiesSet();
return (QueueConnectionFactory) jndiObjectFactoryBean.getObject();
} catch (NamingException e) {
System.out.println("Error while retrieving JMS queue with JNDI name: [" + CONNECTION_FACTORY + "]");
} catch (Exception ex) {
System.out.println("Error");
}
return null;
}
Properties getEnvProperties() {
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL, brokerUrl);
env.put(Context.SECURITY_PRINCIPAL, userName);
env.put(Context.SECURITY_CREDENTIALS, password);
return env;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
JndiDestinationResolver jndiDestinationResolver = new JndiDestinationResolver();
jndiDestinationResolver.setJndiEnvironment(getEnvProperties());
factory.setDestinationResolver(jndiDestinationResolver);
return factory;
}
然后,如果您想使用队列,您只需使用带有注释的方法定义JMS使用者类,该方法带有@JmsListener(destination=“${queue}”)
@JmsListener(destination = "${queue}")
public void receive(Message message) {
System.out.println("Received Message: " + message);
}
希望这有助于节省几个小时的研究;)
干杯
我有一个spring jms应用程序,目前使用ibm mq server进行队列管理。我们计划将中间件改为rabbitmq,以获得更好的性能并有效地控制它,但希望保持spring jms代码的原样。我遵循了以下链接中提到的所有步骤。https://www.rabbitmq.com/jms-client.html
我正在使用spring boot连接到solace队列。我使用下面的教程连接到solace JMS队列。https://www.devglan.com/spring-boot/spring-jms-solace-example它能够连接到solace队列。当应用程序启动并且与solace队列的连接正常工作时,我们遇到了一个问题,但在solace队列停止运行一段时间后,spring boot应用程序
我正在研究一个示例,其中JMS队列托管在JBoss EAP 6实例上(一个用于请求,另一个用于响应)。我还有一个在Weblogic托管服务器上运行的应用程序。 我想设置一种机制,允许运行在Weblogic上的应用程序能够使用添加到JBoss上的请求队列上的消息。此外,应用程序应该能够将消息发布到请求队列(也托管在JBoss上) 我在Oracle文档中读到了关于外国JNDI提供程序的信息,我找到的大
我有Spring启动应用程序,它通过注释从组件类中侦听 IBM MQ 队列。MQ 属性(主机名、通道、端口等)是从 yaml 文件设置的。 MQ 依赖项在分级构建中添加,如下所示: 这可以正常工作,只要我使用Tomcat容器在本地运行应用程序即可侦听消息。但是,如果我将其打包为 EAR 并部署到 Wesbphere8.5 服务器,它将引发以下异常,并且侦听器未从队列中读取消息。我确认所有运行时依赖
使用JNDI,我可以连接到ActiveMQ。但是当切换提供程序类时,它给了我以下异常。 Spring JNDI配置: 例外情况: null
我有WildFly 10.1.0.final,这有Artemis 1.1.0配置jndi.properties的正确方法是什么?: 此工作与WildFly 9.0.0.final具有HornetQ: . 我有下一个: 终于有了这个听众。 在MessageReceiver类中声明的shat队列。My standalone-full.xml是下一个: 我已经定义了正确定义的队列: 有关如何声明队列的参