我很难弄清楚如何实现Spring Boot JMS侦听器,侦听JBoss应用服务器中的ActiveMQ队列。 因此,我选择发布一个问题并用我的最终解决方案回答该问题,希望它可以为您节省一些时间。
答案 0 :(得分:3)
ActiveMQ,但由于它位于JBoss服务器内部,因此Spring Boot无法连接ActiveMQ。
实际上,您需要通过在JNDI提供程序上进行查找来自己定义connectionFactory
和jmsListenerContainerFactory
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;
}
然后,如果要使用队列,只需使用带有@JmsListener(destination = "${queue}")
批注的方法来定义JMS消费者类。
@JmsListener(destination = "${queue}")
public void receive(Message message) {
System.out.println("Received Message: " + message);
}
希望可以节省几个小时的研究;)
欢呼