假设我让我的客户使用有状态会话Bean在飞机上预留座位。如果客户端显式调用我的Remove方法,那么他的所有预留都将被取消,之后将删除bean。
但是,如果客户端空闲了一段时间并且Bean被钝化,如果Bean在被钝化时超时,它将被删除而不调用我的任何函数。因此,如果有人能告诉我如何确保如果bean被删除则取消预订,我将非常感激。如果我使用@PreDestroy注释,它会解决这个问题吗?
祝你好运, James Tran
答案 0 :(得分:4)
很可能不会调用@PreDestroy
方法。 EJB 3.1规范明确指出:
4.6.3错过PreDestroy调用
Bean Provider不能假设容器将始终调用 PreDestroy生命周期回调拦截器方法(或ejbRemove 方法)用于会话bean实例。导致以下情况导致 PreDestroy生命周期回调拦截器方法不存在 要求一个实例:
•EJB容器崩溃。
•从实例方法抛出到容器的系统异常。
•实例处于被动状态时客户端不活动的超时。部署者以EJB容器实现特定的方式指定超时。
该规范还详细说明了如果在这种情况下未调用@PreDestroy
方法,可以如何删除资源:
例如,如果将购物车组件实现为会话 bean,会话bean将购物车内容存储在一个 数据库,应用程序应提供运行的程序 定期从数据库中删除“废弃的”购物车。
在您的情况下,这取决于您如何存储您的预订状态。如果它们持久存储在数据库中,那么我建议采用与规范中规定的相同的方法。您可以使用EJB Timer服务定期执行此活动,或使用Quartz等调度程序。请注意,必须区分不再存在的钝化会话bean实例的内容以及将再次准备好的那些实例。
答案 1 :(得分:1)
钝化的bean将在超时时被销毁,因此任何使用@PreDestroy
注释的方法都可以满足您的要求。
当A处于活动状态时,在A的实例被销毁之前,A的有状态bean实例不会与B共享。有关详细信息,请参阅本文the diagram
答案 2 :(得分:0)
是的,应该。在删除bean之前将调用使用@PreDestroy
注释的方法(即使我在钝化状态下超时)