2015-12-11 42 views
0

我是JMS和隊列的新成員。請原諒我的知識。框架:Spring,Hibernate,帶有JMSTemplate的Spring JMS。在weblogic和spring JMS模板中只有一個連接工廠的同一模塊中的多個隊列

我有一個商業案例,調度程序爲每個X分鐘喚醒並處理記錄並將它們推入隊列。實際上,我們有2個調度程序,但是對於差異表來說,它們是相同的。因此,對於這種情況,我已經爲JMS模板實現了no xml方法(完全註釋)。我使用連接工廠和2個隊列在weblogic中設置了一個模塊。我已經測試過它,它的工作正常。

然而,

  1. 這是使用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; 
          } 
         }; 
    } 
    

這是做正確的方式? 未來如果這不是一個正確的方法,我會遇到什麼樣的問題。

對這個主題的任何建議可能對我有所幫助。任何好的書你可以建議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(); 
    } 

回答

0

你有什麼是好的;因爲它們都使用相同的連接工廠,所以可以使用一個JmsTemplate並在每個發送中傳遞目的地,但沒有強制性的理由只有兩個隊列。如果你有很多隊列,可能會更容易管理。

但是,有沒有這樣的方法......

jmsTemplate_Queue_1.send("Hello"); 

...我想你的意思是

jmsTemplate_Queue_1.convertAndSend("Hello"); 

...因爲該字符串轉換爲JMS消息。

+0

我的錯誤先生。我用另一種方法編輯了消息部分。 – MBK

+0

另外,你可以爲JMS上的新手和彈簧隊列/主題消息提供一本好書。 JMS設置和配置特定於像weblogic/Jboss等服務器嗎? – MBK

+0

[Spring參考手冊](http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jms.html)中的章節應該有你需要的大部分內容。是的,設置代理是依賴於供應商的,但通常從Spring配置的角度來看,它僅僅意味着'Destination'(隊列/主題)和連接工廠bean定義的不同類名,或者使用JNDI來從它們服務器。這使得與不同經紀人一起使用相同的Spring應用程序變得非常簡單。例如,嵌入式ActiveMQ代理經常用於CI集成測試。 –

相關問題