【问题标题】:Tell OpenEJB to ignore MDB告诉 OpenEJB 忽略 MDB
【发布时间】:2026-02-21 11:45:01
【问题描述】:

我为最终将消息放入队列的活动编写了单元测试。只要将消息放入该队列,消息驱动的 bean 就会开始处理。但我不想在单元测试中测试 MDB。我如何告诉 OpenEJB 忽略它们?

我用几个属性设置了 OpenEJB:

    p.setProperty(Context.INITIAL_CONTEXT_FACTORY,
            "org.apache.openejb.client.LocalInitialContextFactory");
    p.setProperty("openejb.deployments.classpath.include", ".*");
    p.setProperty("openejb.localcopy", "false");

    // Messaging
    p.put("MyJmsResourceAdapter",
            "new://Resource?type=ActiveMQResourceAdapter");
    // Do not start the ActiveMQ broker
    p.put("MyJmsResourceAdapter.BrokerXmlConfig", "");
    p.put("MyJmsConnectionFactory",
            "new://Resource?type=javax.jms.ConnectionFactory");
    p.put("MyJmsConnectionFactory.ResourceAdapter", "MyJmsResourceAdapter");
    p.put("queue/MyQueue",
            "new://Resource?type=javax.jms.Queue");

我知道我必须设置openejb.deployments.classpath.exclude,但我无法确定正确的值:

    p.setProperty("openejb.deployments.classpath.exclude", "org.example.mdb.*");

例如,我的班级名为org.example.mdb.MyMDB

【问题讨论】:

  • 该属性不会过滤类路径中的单个类,而是过滤实际的类路径本身。 IE。 jar 和目录成为部署的“模块”。我们肯定需要一个类似的功能来对单个类进行包含/排除。会非常有用。

标签: java message-driven-bean openejb


【解决方案1】:

只有我的 2 美分:

  • 试试".*org/example/mdb.*" or ".*org.example.mdb.*"
  • 来自Loading Deployments from the Classpath

    请注意,默认情况下,这些设置将 只影响 OpenEJB 会使用的 jars 没有时扫描带注释的组件 找到描述符。如果你愿意 使用这些设置来过滤 出包含描述符的罐子, 设置

    openejb.deployments.classpath.filter.descriptors

    属性为真。默认为假

【讨论】:

  • 这是第一个表达式“.*org/example/mdb.*”。 OpenEJB 根据类路径值排除和包含类,因此必须使用“/”作为分隔符。在您的情况下,另一个选项可能是“.*/MyMDB.*”,或者,如果您使用“MDB”作为消息驱动 Bean 的后缀,则只需“.*/.*MyMDB.*”
【解决方案2】:

我们没有该功能,但如果您想做一些小技巧,可以轻松添加它 - 随时欢迎新的贡献和贡献者。

This class 将完全按照您的意愿行事......还有一些您可能不想要的事情:) 它去除了所有 MDB 和 JMS 资源引用(好的部分),并且去除了所有实体 bean 和持久性单元参考(你可能不想要的部分)。由于加载 ActiveMQ 或 OpenJPA 时遇到的一些调试问题,我们编写了它。如果您清理它,我们很乐意将其收回并支持它作为一项功能。

strips out all web services 有一个类似的功能。如果设置了特定的系统属性,它将安装在ConfigurationFactory 中。应该很容易在ConfigurationFactory 的基本相同位置使用类似的标志插入“MDB & JMS”移除器

事实上,由于在 OpenEJB 中所有注解和 xml 元数据都合并到一个对象树(这也是一棵 JAXB 树)中,因此您可以在实际部署应用程序之前对其进行非常强大的转换。例如,将特定的 bean 换成模拟版本。

其中一个我认为会成为出色功能但还没有时间进行工作的东西。 IE。在我们将树送去部署之前,制作一些干净的钩子让人们弄乱树。欢迎阅读本文的任何人加入并尝试一下(耶开源!)。

【讨论】: