我是JMS和隊列的新成員。請原諒我的知識。框架:Spring,Hibernate,帶有JMSTemplate的Spring JMS。在weblogic和spring JMS模板中只有一個連接工廠的同一模塊中的多個隊列
我有一個商業案例,調度程序爲每個X分鐘喚醒並處理記錄並將它們推入隊列。實際上,我們有2個調度程序,但是對於差異表來說,它們是相同的。因此,對於這種情況,我已經爲JMS模板實現了no xml方法(完全註釋)。我使用連接工廠和2個隊列在weblogic中設置了一個模塊。我已經測試過它,它的工作正常。
然而,
- 這是使用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; } }; }
這是做正確的方式? 未來如果這不是一個正確的方法,我會遇到什麼樣的問題。
對這個主題的任何建議可能對我有所幫助。任何好的書你可以建議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();
}
我的錯誤先生。我用另一種方法編輯了消息部分。 – MBK
另外,你可以爲JMS上的新手和彈簧隊列/主題消息提供一本好書。 JMS設置和配置特定於像weblogic/Jboss等服務器嗎? – MBK
[Spring參考手冊](http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jms.html)中的章節應該有你需要的大部分內容。是的,設置代理是依賴於供應商的,但通常從Spring配置的角度來看,它僅僅意味着'Destination'(隊列/主題)和連接工廠bean定義的不同類名,或者使用JNDI來從它們服務器。這使得與不同經紀人一起使用相同的Spring應用程序變得非常簡單。例如,嵌入式ActiveMQ代理經常用於CI集成測試。 –