簡體   English   中英

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,帶有JMSTemplate的Spring JMS。

我有一個業務案例,其中調度程序每X分鍾醒來一次,並處理記錄並將其推入隊列。 實際上,我們有2個調度程序執行相同的操作,但只對diff表執行。 因此,對於這種情況,我為JMS模板實現了一個無xml方法(完全注釋)。 我在weblogic中設置了一個帶有連接工廠和2個隊列的模塊。 我已經對其進行了測試,並且工作正常。

然而,

  1. 這是一個在單個conn工廠中使用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; } }; } 

這是正確的方法嗎? 如果這不是正確的方法,將來可能會遇到什么問題。

關於這個主題的任何建議都可能對我有幫助。您可以通過示例為基礎的方法為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消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM