【问题标题】:JNDI on JMS Integration with Spring and Webspehre MQJNDI on JMS 与 Spring 和 Webspehre MQ 的集成
【发布时间】:2015-08-19 20:23:21
【问题描述】:

我在 Spring 中编写了一个 WS-Application,它支持将消息创建到 JMS 队列中。 我使用带有 ActiveMQ 的 Apache Tomcat 开发它。一切正常,我的 JNDI 资源可以派生连接工厂并将消息发送到队列中:

<jee:jndi-lookup id="jndiJmsQueueConnectionFactory"
        jndi-name="${jms.factory.jndiName}" proxy-interface="javax.jms.ConnectionFactory"
        lookup-on-startup="false">
 </jee:jndi-lookup>

<jee:jndi-lookup id="jndiSendQueue" jndi-name="${jms.myQueue.jndiName}"
        proxy-interface="javax.jms.Queue" lookup-on-startup="false"></jee:jndi-lookup>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref ="jmsQueueConnectionFactory"></property>
        <property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE"/>

</bean>

现在我们尝试将 Web 应用程序移至 Websphere。 JNDI 查找有效,应用程序可以创建工厂,找到队列,但是当我的代码尝试通过 createProducer() 创建生产者时,代码会抛出此异常:

java.lang.ClassCastException: com.sun.proxy.$Proxy28 cannot be cast to com.ibm.mq.jms.MQDestination

我尝试将“javax.jms.Queue”替换为“javax.jms.Destination”,但没有成功。

当我删除代理接口时它正在工作,但我需要在上下文启动时不获取该队列。

【问题讨论】:

    标签: java spring jms jndi ibm-mq


    【解决方案1】:

    当使用 Spring 时,它将查找到的 Destination 包装在 Spring 动态代理中。 WebSphere MQ JMS 提供者需要其 Destination 的实现,但它没有接收到,因此出现异常。您也许可以绕过对查找目标的 toString 调用,然后使用 Session 对象上的结果调用 createDestination。

    【讨论】:

    • 有确切的问题。这有效(使用createSession)。当依靠 Spring 执行 JNDI 查找队列时,注入​​的类是类 com.sun.proxy.$Proxy135,当调用 createSession 时,我可以获得类 com.ibm.mq.jms.MQQueue。我新建了我的队列名称,所以我不需要执行 toString。
    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2013-01-09
    • 2016-07-17
    • 2011-11-28
    相关资源
    最近更新 更多