2012-06-20 133 views
0

目前我有一个由Weblogic 10R3的Java EE应用程序主机,我有兴趣得到1消息驱动的Bean测试。问题是,我没有访问该Bean是听外来JMS服务器,这里是MDB代码:JMS队列“热”交换

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

我的计划是因为豆将查找队列通过JNDI,和我有权访问Weblogic托管服务器。所以我可以删除外部JMS服务器,然后添加一个本地jms队列和持有确切JNDI名称的connectionFactory。因此隔离外部依赖性。

有人认为这是合理的吗?或者任何人有其他想法?我也在考虑使用Mocking将JMS的依赖关系分离出来。

任何帮助深表感谢,感谢

下面是一些Weblogic的记录,指示信息的Bean无法处理“热”掉呢?

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

+0

顺便说一句,外国队列的供应商是websphere-mq,我猜想在本地创建的队列将是weblogic.jms.queue。我是MessageDriven Bean的新手,我想它可以处理差异? –

回答

0

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

但是,您不必删除外部配置 - 只需将其从服务器/群集中解除即可。然后,使用与当前用于访问外部资源相同的JNDI名称创建包含JMS队列(和ConnectionFactory,如果适用)的JMS模块,并且可以测试您的MDB。完成之后,您可以取消用于测试的JMS模块,并将外部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") 
}) 
+0

嘿杰夫,untarget确实比删除更好。在设置本地JMS模块之后,Bean似乎有困难,我在我的文章中包含了一些weblogic日志。请帮助 –

+0

它看起来像连接工厂和队列上的JNDI名称配置不正确。发布您的MDB代码给我看... –

+0

嘿杰夫,MDB代码更新,非常感谢您的帮助 –