Я новичок в JMS и очередях. Пожалуйста, извините мои знания.Несколько очередей в одном модуле с только одним заводом в weblogic и весеннем шаблоне JMS
Сервер: Weblogic 12.x Рамки: Весна, Спящий режим, Весна JMS с JMSTemplate.
У меня есть бизнес-кейс, где планировщик просыпается на каждые X минут и обрабатывает записи и толкает их в очередь. Фактически, у нас есть 2 планировщика, которые делают то же самое, но для таблиц diff. Итак, для этого случая я применил xml-подход (полностью аннотированный) для шаблона JMS. Я установил один модуль в weblogic с фабрикой соединений и двумя очередями. Я тестировал его и работаю нормально.
Однако
- Это хороший подход к использованию 2 очереди с одним Conn завода?
В 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
В главе [Справочное руководство по весне] (http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jms.html) должно быть больше всего, что вам нужно. Да, настройка брокера зависит от поставщика, но, как правило, с точки зрения конфигурации Spring, это просто означает разные имена классов для «Destination» (очереди/темы) и определения фабричных компонентов соединений или использование JNDI для их получения сервер. Это позволяет очень просто использовать одно и то же приложение Spring с разными брокерами. Например, встроенный брокер ActiveMQ часто используется для тестов интеграции CI. –