使用jndi查找的JndiDestinationResolver的Bean定义示例

时间:2019-04-09 19:52:27

标签: spring spring-jms jmstemplate

我正在使用JmsTemplate向IBM MQ队列发送消息或从IBM MQ队列接收消息。我的应用程序安装在WebSphere Application Server 8.0上,为了检索连接,我使用jndi查找。

我有6个队列,我需要根据情况从其中提取/删除xml。另外,我已经在WAS中添加了这些队列。我需要帮助来了解两件事:

  1. 我应该使用DynamicDestinationResolver还是JndiDestinationResolver

  2. 根据我的理解,我应该使用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 个答案:

答案 0 :(得分:0)

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");

因此,要使用哪一个取决于您的偏好。