0

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

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

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

有任何想法吗?

4

5 回答 5

1

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

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

于 2008-12-15T15:44:42.590 回答
0

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

于 2008-12-18T03:37:12.477 回答
0

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

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

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

于 2009-02-02T21:26:59.717 回答
0

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

于 2009-02-05T20:51:49.800 回答
0

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

你能告诉我如何在 JAX WS 中使用 Call 上下文吗

于 2009-04-30T06:57:38.667 回答