EJB3如何在bean被删除之前确保事情发生

时间:2011-07-18 08:45:04

标签: java ejb-3.0 stateful-session-bean

假设我让我的客户使用有状态会话Bean在飞机上预留座位。如果客户端显式调用我的Remove方法,那么他的所有预留都将被取消,之后将删除bean。

但是,如果客户端空闲了一段时间并且Bean被钝化,如果Bean在被钝化时超时,它将被删除而不调用我的任何函数。因此,如果有人能告诉我如何确保如果bean被删除则取消预订,我将非常感激。如果我使用@PreDestroy注释,它会解决这个问题吗?

祝你好运, James Tran

3 个答案:

答案 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注释的方法(即使我在钝化状态下超时)