使用JNDI与Spring Boot连接JMS队列



我很难弄清楚如何实现Spring Boot JMS侦听器,听JBOSS应用程序服务器中的ActiveMQ队列。因此,我选择发布一个问题并通过我的最终解决方案回答,希望它可以节省一些小时。

ActiveMQ由Spring Boot AutoConfiguration支持,但是由于它在JBoss Server 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;
  }

那么,如果您想消耗队列,您只需用@JmsListener(destination = "${queue}")

注释的方法定义JMS消费类别类
 @JmsListener(destination = "${queue}")
  public void receive(Message message) {
    System.out.println("Received Message: " + message);
  }

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

欢呼

最新更新