#spring #spring-jms #jmstemplate
#spring #spring-jms #jmstemplate
Вопрос:
Я работаю над отправкой и получением сообщений в / из очереди IBM MQ с использованием JmsTemplate. Мое приложение установлено на WebSphere application server 8.0, и для получения соединения я использую поиск jndi.
У меня есть 6 очередей, из которых мне нужно выбирать / удалять XML-файлы в зависимости от сценариев. Также я добавил эту очередь в WAS. Мне нужна помощь, чтобы понять две вещи:
-
Я должен использовать
DynamicDestinationResolver
илиJndiDestinationResolver
? -
Насколько я понимаю, я должен использовать
JndiDestinationResolver
; если это правильно, как я могу определить это в моем контекстном файле и ссылатьсяjndi-lookup
на каждую очередь, чтобы я мог извлечь его из своего кода при использовании отправки / получения JmsTemplate?
Пожалуйста, смотрите Ниже мой файл контекста приложения:
<bean id="jmsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jms/CPC.TapQueueConnCPC" />
<property name="lookupOnStartup" value="false" />
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.jms.QueueConnectionFactory" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsQueueConnectionFactory" />
<property name="receiveTimeout" value="10000" />
<property name="sessionAcknowledgeMode" value="1" />
<property name="destinationResolver" ref="jmsDestResolver"/>
</bean>
<bean id="fileTransferServiceImpl" class="org.kp.cpc.service.FileTransferServiceImpl" >
<constructor-arg name="jmsTemplate" ref="jmsTemplate" />
</bean>
<bean id="jmsDestResolver" class=" org.springframework.jms.support.destination.JndiDestinationResolver"/>
<jee:jndi-lookup id="drop278" jndi-name="jms/CPC.SEND.AUTHREQ278" />
<jee:jndi-lookup id="drop275" jndi-name="jms/CPC.SEND.AUTHREQ275" />
<jee:jndi-lookup id="recev278" jndi-name="jms/CPC.RECE.AUTHREQ278" />
<jee:jndi-lookup id="recev275" jndi-name="jms/CPC.RECE.AUTHREQ275" />
<jee:jndi-lookup id="preAuthStatus" jndi-name="jms/CPC.RECE.PREAUTH.STSUPD278"/>
<jee:jndi-lookup id="succ278" jndi-name="jms/CPC.RECE.SUCC.AUTHRESP278" />
Комментарии:
1. Весь смысл
JndiDestinationResolver
в том, что вам не нужноjee:jndi-lookup
. Вашим адресатом будет имя JNDI, на которое вы хотите его отправить. Если вы действительно хотите оставитьjee:jndi-lookup
использованиеBeanFactoryDestinationResolver
вместо и использовать имя компонента в качестве назначения.
Ответ №1:
Весь смысл JndiDestinationResolver
в том, что вам не нужно выполнять поиск вручную. Другими словами, при использовании JndiDestinationResolver
вам не нужен <jee:jndi-lookup />
, поскольку это все обрабатывается DestinationResolver
.
Именем назначения будет имя JNDI. Итак, в вашем коде JMS вы должны использовать следующее.
jmsTemplate.convertAndSend("jms/CPC.SEND.AUTHREQ278", "Your-Message-Here");
JndiDestinationResolver
Для выполнения поиска JNDI будет использоваться имя назначения.
Если вы действительно хотите исключить имена JNDI из своего кода и хотите использовать <jee:jndi-lookup />
, тогда используйте [ BeanFactoryDestinationResolver
] . При этом будет использоваться имя назначения для поиска компонента из BeanFactory
(в данном случае ApplicationContext
). В этом случае ваш код JMS будет указывать на имя компонента вместо имени JNDI.
jmsTemplate.convertAndSend("drop278", "Your-Message-Here");
Итак, какой из них использовать, зависит от ваших предпочтений.
Комментарии:
1. Большое спасибо за ваш ответ. Это отвечает на мой вопрос.
2. Разве не требуется устанавливать JndiDestinationresolver в качестве значения свойства «destinationResolver»? Что-то вроде этого… @Bean public JmsTemplate getJmsTemplate() { Шаблон JmsTemplate = new JmsTemplate(); template.setConnectionFactory(getFactory()); template.setDeliveryMode(2); template.setMessageConverter(smartMessageConverter); template.setDestinationResolver(jndiDestinationResolver); возврат шаблон; }
3. Извините за неправильный формат фрагмента кода, я несколько минут отсутствовал за своим столом во время редактирования комментария, и после wards я не могу отредактировать комментарий.