JMS队列“热”交换

时间:2012-06-20 15:50:20

标签: java queue jms weblogic ibm-mq

目前我有一个Weblogic 10R3的Java EE App主机,我有兴趣测试一个Message Driven Bean。问题是我无法访问Bean正在侦听的外部JMS服务器,这里是MDB代码:

import static com.citi.primefinance.utils.jms.ForeignJMSConstants.Queue.INCOMING_QUEUE_SWIFT_FX;
@MessageDriven(name = "IncomingSwiftFxProcessorMDB", mappedName = INCOMING_QUEUE_SWIFT_FX)
public class IncomingSwiftFxProcessorMDB extends AbstractMessageDrivenBean {
@Override
protected void processMessage(Serializable obj) throws Exception{

    debug(this.getClass().getName() + ".processMessage()");

    if (obj instanceof String) {
        info(this.getClass().getName() + ": received on Message object");
        processSwiftFxTradeMessage((String)obj);
    } else {
        error(this.getClass().getName() + ": received an object " + obj + " which is not a TextMessage");
    }
 }

我的计划是因为Bean将通过JNDI查找队列,并且我可以访问Weblogic托管服务器。所以我可以删除外部JMS服务器,然后添加一个本地jms队列和connectionFactory,保存确切的JNDI名称。因此孤立外部依赖。

人们认为这是合理的吗?还是有人有其他想法?我也在考虑使用Mocking来一起隔离对JMS的依赖。

非常感谢任何帮助,谢谢

这是一些Weblogic日志,表明Message Bean无法处理“Hot”交换?

incomingSwiftFxProcessorMDB无法连接到JMS目标:IncomingSwiftFxQueue。错误是: 消息驱动的EJB尝试使用JNDI名称连接到JMS连接工厂:SwiftConnectionFactory。但是,具有JNDI名称的对象:SwiftConnectionFactory不是JMS连接工厂。 NestedException消息是:weblogic.jms.client.JMSConnectionFactory>

1 个答案:

答案 0 :(得分:0)

最终,您应该在JMS界面的上下文之外测试您的业务逻辑。否则,是的 - 这是可行的。 WebLogic中的外部JMS服务器只是远程JMS目标的本地JNDI表示。

但是,您不必删除外部配置 - 只需从服务器/集群中取消它。然后,使用当前用于访问外部资源的相同JNDI名称创建包含JMS队列(和ConnectionFactory,如果适用)的JMS模块,并且可以测试MDB。完成后,您可以取消定位用于测试的JMS模块,并将Foreign JMS服务器重新定位到适当的资源。

保持'测试'JMS模块可能会很好,这样您可以在将来轻松再次测试:)

尝试将其更新为这样,并实现MessageListener接口:

@MessageDriven(
messageListenerInterface = javax.jms.MessageListener.class,
name = "MyListener",
mappedName = "jms/my/notification",
activationConfig = {
    @ActivationConfigProperty(
        propertyName = "connectionFactoryJndiName",
        propertyValue = "weblogic.jms.XAConnectionFactory"),
    @ActivationConfigProperty(
        propertyName = "destinationType",
        propertyValue = "javax.jms.Queue")
})