Я работаю над отправкой и получением сообщений в/из очереди IBM MQ, используя JmsTemplate. Мое приложение установлено на сервере приложений WebSphere 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" />
Весь смысл JndiDestinationResolver
в том, что вам не нужно выполнять поиск вручную. Другими словами, при использовании JndiDestinationResolver
вам не нужен <jee:jndi-lookup />
, так как он обрабатывается DestinationResolver
.
Имя пункта назначения будет именем JNDI. Итак, в вашем коде JMS вы должны использовать следующее.
jmsTemplate.convertAndSend("jms/CPC.SEND.AUTHREQ278", "Your-Message-Here");
JndiDestinationResolver
будет использовать имя пункта назначения для поиска JNDI.
Если вы действительно хотите убрать имена JNDI из своего кода и хотите использовать <jee:jndi-lookup />
, используйте [BeanFactoryDestinationResolver
]. Это будет использовать имя пункта назначения для поиска bean-компонента из BeanFactory
(в данном случае ApplicationContext
). Тогда ваш код JMS будет указывать на имя компонента вместо имени JNDI.
jmsTemplate.convertAndSend("drop278", "Your-Message-Here");
Так что, какой из них использовать, зависит от ваших предпочтений.
Большое спасибо за ваш ответ. Это отвечает на мой вопрос.
Разве не требуется устанавливать JndiDestinationresolver в качестве значения свойства «destinationResolver»? Что-то вроде этого... @Bean public JmsTemplate getJmsTemplate() { JmsTemplate template = new JmsTemplate(); template.setConnectionFactory(getFactory()); шаблон.setDeliveryMode(2); template.setMessageConverter(smartMessageConverter); template.setDestinationResolver (jndiDestinationResolver); шаблон возврата; }
Извините за неправильный формат фрагмента кода, я отсутствовал на своем рабочем месте в течение нескольких минут, редактируя комментарий, и после этого я не могу редактировать комментарий.
Весь смысл
JndiDestinationResolver
в том, что вам не нуженjee:jndi-lookup
. Пунктом назначения будет имя JNDI, на которое вы хотите его отправить. Если вы действительно хотите выйти изjee:jndi-lookup
, используйте вместо этогоBeanFactoryDestinationResolver
и используйте имя компонента в качестве пункта назначения.