gpt4 book ai didi

java - 使用 JNDI 与 Spring Boot 连接 JMS 队列

转载 作者:行者123 更新时间:2023-11-30 06:02:43 26 4
gpt4 key购买 nike

我很难弄清楚如何实现 Spring Boot JMS 监听器,监听 JBoss 应用服务器中的 ActiveMQ 队列。因此我选择发布一个问题并用我的最终解决方案来回答它,希望它能为你们中的一些人节省几个小时。

最佳答案

ActiveMQ 受 Spring Boot 自动配置支持,但由于它位于 JBoss 服务器内部,因此 Spring Boot 无法连接 ActiveMQ。事实上,您需要通过查找 JNDI 提供程序来自己定义 connectionFactoryjmsListenerContainerFactory bean。

@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);
}

希望这有助于节省几个小时的研究;)

干杯

关于java - 使用 JNDI 与 Spring Boot 连接 JMS 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53851422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com