我已经阅读了 stackoverflow 上的 EJB 限制和几个答案,但我不太确定我在工作中发现的一段代码。
有一项服务可以根据 Foos 的标识符提供有关 Foos 的详细信息。
public FooResponse getFoo(FooRequest request){...};
表面之下的某个地方是一个自编写的池,其中保存最近提供的响应对象。对于每个请求,都会询问池是否有可用的条目。如果是,则将其用作响应,如果不是,则将询问数据库。当从数据库获取响应时,它将存储在池中。
池使用两种策略来控制其大小。
首先,它使用java.lang.ref.SoftReference<T>
里面 Map
避免OutOfMemoryError
s。
它使用的第二个东西是 java.util.TimerTask
这是为 Map
中的每个条目创建的并由 java.util.Timer
安排,它会在一段可配置的时间后删除该条目。
在我看来,这违反了 EJB 不允许创建线程(java.util.Timer
却这样做)的限制。我是对的还是我在某个地方遗漏了一些东西?
直到今天,这还没有造成任何明显的问题。您是否建议摆脱这个自编码池?
另一件事是,该服务是一个无状态的 SessionBean。一个容器不仅仅会创建其中之一。因此,它们不共享同一个池,如果一颗 bean 被问及Foo
,那就太幸运了。两次。我也这样认为吗?
最佳答案
创建自己的线程的主要问题是,这意味着它们不受应用程序服务器的控制,这可能会导致恶意 EJB 通过创建太多线程来“破坏服务器”。
但是,拥有后台线程是一件可取的事情,因此应用程序服务器通常会提供“工作管理器”来安排任务(使用计时器或并行线程)。
这里有一篇关于 CommonJ 与 Websphere 的文章,提供了如何在不破坏服务器的情况下使用线程的背景知识:Work Managers
Weblogic 的 CommonJ 文档如下:The Timer and Work Manager API
尽管可能偏离主题,但 Spring 与工作管理器集成的方式如下:Task Execution and Scheduling
为了解决您的问题,我将与缓存集成(例如 EHCache )并让它计算出何时从缓存中逐出项目。
(再次强调,可能是题外话,使用 Spring,可以通过在代码中添加一些注释来使用缓存: ehcache-spring-annotations )
关于java - 这是否违反了 EJB 限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9033455/