2015-12-11 2 views
0

Я новичок в JMS и очередях. Пожалуйста, извините мои знания.Несколько очередей в одном модуле с только одним заводом в weblogic и весеннем шаблоне JMS

Сервер: Weblogic 12.x Рамки: Весна, Спящий режим, Весна JMS с JMSTemplate.

У меня есть бизнес-кейс, где планировщик просыпается на каждые X минут и обрабатывает записи и толкает их в очередь. Фактически, у нас есть 2 планировщика, которые делают то же самое, но для таблиц diff. Итак, для этого случая я применил xml-подход (полностью аннотированный) для шаблона JMS. Я установил один модуль в weblogic с фабрикой соединений и двумя очередями. Я тестировал его и работаю нормально.

Однако

  1. Это хороший подход к использованию 2 очереди с одним Conn завода?
  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

В главе [Справочное руководство по весне] (http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jms.html) должно быть больше всего, что вам нужно. Да, настройка брокера зависит от поставщика, но, как правило, с точки зрения конфигурации Spring, это просто означает разные имена классов для «Destination» (очереди/темы) и определения фабричных компонентов соединений или использование JNDI для их получения сервер. Это позволяет очень просто использовать одно и то же приложение Spring с разными брокерами. Например, встроенный брокер ActiveMQ часто используется для тестов интеграции CI. –

Смежные вопросы