当前位置: 首页 > 知识库问答 >
问题:

JMS队列“热”交换

杜俊风
2023-03-14

目前我有一个Weblogic 10R3开发的Java EE应用程序主机,我有兴趣测试1个消息驱动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 html" target="_blank">object");
        processSwiftFxTradeMessage((String)obj);
    } else {
        error(this.getClass().getName() + ": received an object " + obj + " which is not a TextMessage");
    }
 }

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

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

非常感谢您的帮助,谢谢

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

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

共有1个答案

甄伟兆
2023-03-14

最终,您应该在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")
})
 类似资料:
  • 我们需要在WebSphere7中创建一个JMS队列,直到消息中指定的日期才将消息传递给MDB。如何着手制作这样一个自定义队列或队列处理器?我至今未能找到任何相关资料。 我们更喜欢使用内部JMS提供程序,但是如果这是不可能的,我们想尝试使用WebSphereMQ。 谢谢

  • 当谈到JMS队列/主题时,我很困惑。我想要的是消息应该发给每个订阅者,并且我希望订阅者在处于活动状态时从非活动时间接收消息。但是,我无法控制订阅者是否具有持久订阅。有没有办法设置持久队列,并将其设置为每个订阅者都会收到相同的消息?以及如何使用Spring配置进行设置 非常感谢。

  • 我有一个spring jms应用程序,目前使用ibm mq server进行队列管理。我们计划将中间件改为rabbitmq,以获得更好的性能并有效地控制它,但希望保持spring jms代码的原样。我遵循了以下链接中提到的所有步骤。https://www.rabbitmq.com/jms-client.html

  • 一点背景:我需要改进我们的一个批处理框架的性能。在那里,批处理输入被发送到JMS队列。此外,在队列endpoint,我们有一个MDB,它正在使用消息。现在,我在这里怀疑的是,如果有大量的消息,就没有MDB实例可以使用这些消息,因为所有这些消息都在处理之前的消息时被搁置。为了改善这一点,我正在考虑在MDB业务逻辑中实现一个线程池,这样一旦MDB接收到消息并将其传递给线程,它就可以免费使用另一条消息。

  • 问题内容: 有一条消息(文本),我肯定知道其格式和内容。 目前,已经实现了Java类,该类从文件中解析并读取此消息。 在现实世界中,此消息将来自消息队列。 现在,我应该在本地PC上模拟,模拟或生成Message Queue,以进行测试。 Java规范(java jms ): 关于此规范,我需要 JMS provider 。 JMS客户端 -这是我的类,它读取消息。 消息 本身,我知道。 那么问题是