java - 这是否违反了 EJB 限制?

标签 java multithreading ejb restriction

我已经阅读了 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/

相关文章:

java - StatusLogger 发现多个日志记录实现

java - 如何检索 Java Web 应用程序的更改列表?

java - 在 Wicket 中使用参数化 UI 消息的简单方法?

c++ - 在抛出 'std::system_error' 线程池实例后调用终止

java - hibernate升级后的问题-hibernate中的嵌套循环(CascadeType和EmbeddedId)

java - 长时间运行的调度程序抛出访问 jpa/ejb 对象的异常

java - 大文件上传时ClientAbortException : java. io.IOException

c++ - 响应式地检查两个队列而不 Hook CPU

c++11 原子排序 : extended total order memory_order_seq_cst for locks

java - org.hibernate.hql.internal.ast.QuerySyntaxException