gpt4 book ai didi

java - 使用 Java Bean 类的 application.properties 文件中的 Spring Boot : Reading spring. jms.jndi-name 属性

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:28 24 4
gpt4 key购买 nike

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

spring.jms.jndi-name= java:comp/env/XXXX

我正在使用 Spring bean 来定义 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中将Connection对象设置为Jms Template。

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

感谢您的回答。

最佳答案

我也很难弄清楚如何实现 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 - 使用 Java Bean 类的 application.properties 文件中的 Spring Boot : Reading spring. jms.jndi-name 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31493732/

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