Spring引导:使用Java Bean类从application.properties文件读取Spring.jms.jndi-name属性

Spring引导:使用Java Bean类从application.properties文件读取Spring.jms.jndi-name属性,java,spring,spring-boot,ibm-mq,Java,Spring,Spring Boot,Ibm Mq,我正在使用JNDI查找获取tomcat服务器上webspheremq代理的连接对象。我使用JmsTemplate将消息发送到WMQ Broker上的队列,并试图避免基于Spring Xml的配置,因此我配置了Spring boot的application.properties文件以指定JNDI查找up name。下面是application.properties文件中的属性 spring.jms.jndi-name= java:comp/env/XXXX 我使用Springbean来定义Jms

我正在使用JNDI查找获取tomcat服务器上webspheremq代理的连接对象。我使用JmsTemplate将消息发送到WMQ Broker上的队列,并试图避免基于Spring Xml的配置,因此我配置了Spring boot的application.properties文件以指定JNDI查找up name。下面是application.properties文件中的属性

spring.jms.jndi-name= java:comp/env/XXXX
我使用Springbean来定义JmsTemplate,下面是它的代码

@Configuration
public class JmsMessageTemplateBean {

    //@Value("${spring.jms.jndi-name}")
    //private ConnectionFactory connectionFactory;

    @Bean
    public JmsTemplate jmsTemplate() throws Exception{
        JmsTemplate jmsMessagingTemplate = new JmsTemplate();
        jmsMessagingTemplate.setDefaultDestinationName("Some Queue");
        jmsMessagingTemplate.setConnectionFactory(connectionFactory);
        return jmsMessagingTemplate;
    }
}
我有几个问题:

1.如何从application.properties文件中读取JNDI属性,并在上述bean中将连接对象设置为Jms模板

2.我观察到,JNDI查找中的连接对象是
MQQueueConnectionFactory
,并且从我所研究的
JmsTemplate
支持
javax.jms.ConnectionFactory
对象。有没有办法将
MQQueueConnectionfactory
对象转换为
javax.jms.Connectionfactory


感谢您的回答。

我也很难想出如何实现Spring Boot JMS侦听器,监听JBoss应用服务器中的ActiveMQ队列

Spring引导自动配置支持ActiveMQ,但由于它位于JBoss服务器内部,Spring引导无法连接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}”)

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

你正在走向复杂。删除bean,您已经获得了一个带有springboots自动配置的
JmsTemplate
。MQQueueConnectionFactory是一个
ConnectionFactory
@M.Deinum。感谢您的回复。通过Spring的自动引导配置,我得到了JmsTemplate,但它的connectionfactory默认情况下是在localhost broker中查找的。如何配置JmsTemplate以使用application.properties文件中指定的Spring.jms.jndi-name。如果您确实指定了该属性,则应使用该属性进行查找。还要确保在类路径中没有类似activemq的内容。您必须使用Spring Boot 1.2或更高版本才能工作。这是一个非常详细的答案,但问题是关于IBM的Websphere MQ,您提供的答案是关于ActiveMQ的,我不确定您为ActiveMQ提供的底层配置详细信息是否有助于解决IBM MQ的问题,如果是这样的话,在这个问题上留下来也许是值得的。如果没有,那么最好找一个与ActiveMQ相关的问题来提供这个答案,或者甚至问你自己的问题并自我回答。谢谢Josh,是的,你是对的,我最好创建一个新问题并回答它。我之所以发布这篇文章,是因为它与我所面临的实现问题关系最为密切,但在最初的问题和我的答案之间仍然存在很大差距:)@ThomasJoeisseint我正在尝试在JBOSS服务器内部连接activemq。但是,我得到以下错误:java.lang.IllegalArgumentException:org.springframework.jms.support.JmsAccessor.afterPropertiesSet(JmsAccessor.java:169)中需要属性“connectionFactory”
 @JmsListener(destination = "${queue}")
  public void receive(Message message) {
    System.out.println("Received Message: " + message);
  }