目前我有一个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>
答案 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")
})