将任意数据与ejb调用上下文相关联

时间:2008-12-15 13:26:24

标签: java java-ee ejb-3.0

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

是否存在某种呼叫背景?我可以将任意数据与它相关联吗?

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

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

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

个人而言,这似乎(对我而言)就像一个糟糕的设计。我可以看到这样做,如果你在中间有一些你无法控制的代码,但为什么呢?你正在使你的代码逻辑非常难以理解,因为你有一堆“魔法”数据,它们只出现在你的函数中。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我正在讨论是否放弃使用EJB Local或Remote接口,而是通过JMS传递消息,这也使这很容易。

有合理的情况需要这样做,并不代表设计缺陷。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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