使用 jndi 查找的 Jndi DestinationResolver 的 Bean 定义示例

Bean definition example for JndiDestinationResolver using jndi look up

我正在使用 JmsTemplate 发送和接收消息 to/from IBM MQ 队列。我的应用程序安装在 WebSphere 应用程序服务器 8.0 上,为了检索连接,我使用了 jndi 查找。

我有 6 个队列,根据情况,我需要 pick/drop xml。我还在 WAS 中添加了这些队列。我需要帮助来理解两件事:

  1. 我应该用DynamicDestinationResolver还是JndiDestinationResolver?

  2. 根据我的理解我应该使用JndiDestinationResolver;如果这是正确的,我如何在我的上下文文件中定义它并为每个队列引用 jndi-lookup 以便我可以在使用 jmsTemplate send/receive?

    [=28= 时从我的代码中检索它]

请参阅下面我的应用程序上下文文件:

<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]。这将使用目标名称从 BeanFactory(在本例中为 ApplicationContext)中查找 bean。然后,您的 JMS 代码将指向 bean 名称而不是 JNDI 名称。

jmsTemplate.convertAndSend("drop278", "Your-Message-Here");

所以使用哪一个取决于您的喜好。