Spring引导:使用Java Bean类从application.properties文件读取Spring.jms.jndi-name属性
我正在使用JNDI查找获取tomcat服务器上webspheremq代理的连接对象。我使用JmsTemplate将消息发送到WMQ Broker上的队列,并试图避免基于Spring Xml的配置,因此我配置了Spring boot的application.properties文件以指定JNDI查找up name。下面是application.properties文件中的属性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
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);
}