【问题标题】:Associate arbitrary data with ejb call context将任意数据与 ejb 调用上下文相关联
【发布时间】:2008-12-15 13:26:24
【问题描述】:

我有一堆无状态的 ejb 3.0 bean 在链中相互调用。 考虑一下,BeanA.do(message) -> BeanB.do() -> BeanC.do() -> BeanD.do()。 现在我想从 BeanD.do() 访问消息数据。明显的解决方案是将消息作为参数传递给所有 do() 调用(实际上这就是它现在的工作方式),但我想要一些更好的解决方案。

是否有某种调用上下文?我可以将任意数据与之关联吗?

我想做的,只是将 BeanA.do(message) 中的消息放入与 bean 函数调用关联的一些本地存储中,然后在 BeanD.do() 中检索它。

有什么想法吗?

【问题讨论】:

    标签: java jakarta-ee ejb-3.0


    【解决方案1】:

    我不相信 EJB 规范中有任何东西可以提供该功能。如果您在特定的应用服务器上,您可能能够使用应用服务器特定的东西(我认为 JBoss 允许您将东西添加到调用上下文)。你也可以使用 JNDI 伪造一些东西。

    就我个人而言,这似乎(对我来说)是一个糟糕的设计。如果您在中间有一些您无法控制的代码,我可以看到这样做,但是为什么要这样做呢?你让你的代码逻辑很难遵循,因为你有一堆“神奇”的数据,它们只是出现在你的函数中。

    【讨论】:

    • 感谢您的回答。我会尝试搜索 JBoss 文档。在其他情况下,我同意你的看法,“魔术”数据不好。但在当前情况下,显式传递上下文数据只会分散实际业务逻辑的注意力。
    【解决方案2】:

    您可以拥有一个具有访问静态 ThreadLocal 字段的静态 get/set 方法的类。但是,如果您想将 EJB 耦合到其他类,我会接受 james 的建议并仔细考虑。一定要仔细检查您的应用服务器文档,因为我不确定是否支持在 EJB 环境中使用 ThreadLocals。

    【讨论】:

      【解决方案3】:

      我也有同样的问题。具有讽刺意味的是,这在 jax-ws 或 jax-rpc 中使用 SOAP 很容易做到,但使用 EJB 很难做到。

      我正在考虑是否放弃使用 EJB 本地或远程接口,转而通过 JMS 传递消息,这也很容易。

      在某些合法情况下需要这样做,但并不代表设计缺陷。

      【讨论】:

        【解决方案4】:

        这就是 Seam 提供的。使用纯 Web 服务(即没有 Web GUI 前端)运行有点尴尬。不过,我做到了,而且效果很好。

        【讨论】:

          【解决方案5】:

          我需要在 JAX WS 中使用调用上下文。 布伦特 说 “具有讽刺意味的是,这在 jax-ws 或 jax-rpc 中使用 SOAP 很容易做到,但使用 EJB 很难做到。”

          请告诉我如何在 JAX WS 中使用 Call 上下文

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-11
            • 2014-12-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多