同一模块中的多个队列,weblogic 和 spring JMS 模板中只有一个连接工厂
Multiple queues in same Module with only one connection factory in weblogic and spring JMS template
我是 JMS 和队列的新手。请原谅我的知识。
服务器:Weblogic 12.x
框架:Spring、Hibernate、Spring JMS with JMSTemplate。
我有一个业务案例,其中调度程序每 X 分钟唤醒一次并处理记录并将它们推入队列。事实上,我们有 2 个调度程序执行相同的操作,但用于差异表。因此,对于这种情况,我为 JMS 模板实施了一种无 xml 方法(完全注释)。我在 weblogic 中设置了一个带有连接工厂和 2 个队列的模块。我已经测试过它并且工作正常。
然而,
- 这是将 2 个队列与单个连接工厂一起使用的好方法吗?
在 QueueMessageSender 中,我使用以下注释发送消息。
@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;
}
};
}
这样做正确吗?
如果这不是正确的方法,将来我 运行 可能会遇到什么问题。
关于此主题的任何建议都可能对 me.Any 好书有所帮助,您可以为 spring 推荐 JMS 的好书,并采用基于示例的方法!
这是java中的配置文件:
@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 和队列的新手。请原谅我的知识。
服务器:Weblogic 12.x 框架:Spring、Hibernate、Spring JMS with JMSTemplate。
我有一个业务案例,其中调度程序每 X 分钟唤醒一次并处理记录并将它们推入队列。事实上,我们有 2 个调度程序执行相同的操作,但用于差异表。因此,对于这种情况,我为 JMS 模板实施了一种无 xml 方法(完全注释)。我在 weblogic 中设置了一个带有连接工厂和 2 个队列的模块。我已经测试过它并且工作正常。
然而,
- 这是将 2 个队列与单个连接工厂一起使用的好方法吗?
在 QueueMessageSender 中,我使用以下注释发送消息。
@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; } }; }
这样做正确吗? 如果这不是正确的方法,将来我 运行 可能会遇到什么问题。
关于此主题的任何建议都可能对 me.Any 好书有所帮助,您可以为 spring 推荐 JMS 的好书,并采用基于示例的方法!
这是java中的配置文件:
@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 消息。