Java 在weblogic和SpringJMS模板中,同一模块中有多个队列,只有一个连接工厂
我不熟悉JMS和队列。请原谅我的知识 服务器:Weblogic 12.x 框架:Spring、Hibernate、SpringJMS和JMSTemplate 我有一个业务案例,其中调度器每X分钟唤醒一次,处理记录并将其推送到队列中。事实上,我们有两个调度器执行相同的操作,但用于不同的表。因此,在本例中,我为JMS模板实现了一种无xml方法(完全注释)。我在weblogic中设置了一个模块,其中包含一个连接工厂和两个队列。我已经测试过了,它工作得很好 但是,Java 在weblogic和SpringJMS模板中,同一模块中有多个队列,只有一个连接工厂,java,jms,message-queue,weblogic12c,spring-jms,Java,Jms,Message Queue,Weblogic12c,Spring Jms,我不熟悉JMS和队列。请原谅我的知识 服务器:Weblogic 12.x 框架:Spring、Hibernate、SpringJMS和JMSTemplate 我有一个业务案例,其中调度器每X分钟唤醒一次,处理记录并将其推送到队列中。事实上,我们有两个调度器执行相同的操作,但用于不同的表。因此,在本例中,我为JMS模板实现了一种无xml方法(完全注释)。我在weblogic中设置了一个模块,其中包含一个连接工厂和两个队列。我已经测试过了,它工作得很好 但是, 这是一种使用两个队列和一个conn工厂
@Autowired
private JmsTemplate jmsTemplate_Queue_1;
@Autowired
private JmsTemplate jmsTemplate_Queue_2;
jmsTemplate_Queue_1.send(wrapMessage("Hello"));
jmsTemplate_Queue_1.send(wrapMessage("test"));
private MessageCreator wrapMessage(final String msg) {
return new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
ObjectMessage om = session.createObjectMessage();
om.setObject(msg);
return om;
}
};
}
@Configuration
@EnableJms
@ComponentScan({ "com.xxxx.xxx.config" })
@PropertySource("classpath:application.properties")
public class JmsConfiguration{
@Autowired
private Environment environment;
@Bean
public JndiTemplate jndiTemplate() {
JndiTemplate jndiTemplate = new JndiTemplate();
Properties jndiProps = new Properties();
jndiProps.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
Properties props = System.getProperties() ;
jndiProps.setProperty("java.naming.provider.url","t3://localhost:7001");
jndiTemplate.setEnvironment(jndiProps);
return jndiTemplate;
}
@Bean
public JndiObjectFactoryBean jmsConnectionFactory() {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setJndiName(environment.getProperty("jms.connectionFactory"));
return jndiObjectFactoryBean;
}
@Bean
public JndiObjectFactoryBean queue_one() {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setJndiName(environment.getProperty("jms.queue_one"));
return jndiObjectFactoryBean;
}
@Bean
public JndiObjectFactoryBean queue_two() {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setJndiName(environment.getProperty("queue_two"));
return jndiObjectFactoryBean;
}
@Bean
public TransactionAwareConnectionFactoryProxy connectionFactoryProxy() {
return new TransactionAwareConnectionFactoryProxy((ConnectionFactory) jmsConnectionFactory().getObject());
}
@Bean(name="jmsTemplate_Queue_1")
public JmsTemplate jmsTemplate_Queue_1() {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactoryProxy());
jmsTemplate.setSessionTransacted(false);
jmsTemplate.setReceiveTimeout(5000);
jmsTemplate.setDefaultDestination((Destination) queue_one().getObject());
return jmsTemplate;
}
@Bean(name="jmsTemplate_Queue_2")
public JmsTemplate jmsTemplate_Queue_2() {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactoryProxy());
jmsTemplate.setSessionTransacted(false);
jmsTemplate.setReceiveTimeout(5000);
jmsTemplate.setDefaultDestination((Destination) queue_two().getObject());
return jmsTemplate;
}
//Thank you for looking the code till here. I don't want to be rude by not saying thank you!
@Bean
public QueueMessageSender queueMessageSender() {
return new QueueMessageSender();
}
你所拥有的一切都是美好的;因为它们都使用相同的连接工厂,所以您可以使用单个
JmsTemplate
,并在每次发送时传入目标,但是没有必要只使用两个队列。如果您有很多队列,那么管理起来可能会更容易
然而,没有这样的方法
jmsTemplate_Queue_1.send("Hello");
。。。我想你是说
jmsTemplate_Queue_1.convertAndSend("Hello");
…因为字符串必须转换为JMS消息。我的错误,先生。我已经用另一种方法编辑了消息部分。另外,你能为新手推荐一本关于JMS和spring队列/主题消息传递的好书吗。JMS设置和配置是否特定于weblogic/Jboss等服务器?中的章节应该包含您需要的大部分内容。是的,设置代理依赖于供应商,但通常,从Spring配置的角度来看,它只意味着
目的地(队列/主题)和连接工厂bean定义的不同类名,或者使用JNDI从服务器获取它们。这使得在不同的代理中使用相同的Spring应用程序非常容易。例如,一个嵌入的ActuMeq代理经常用于CI集成测试。您可能需要考虑使用<代码>转换和发送> <代码>方法。这样,字符串
将作为文本消息
发送。始终发送ObjectMessage
不一定是最好的选择。