假设我让我的客户使用 Stateful Session Bean 预订飞机上的座位。如果客户端显式调用了我的 Remove 方法,他的所有保留都将被取消,然后 bean 将被删除。
但是,如果客户端空闲一段时间并且 Bean 被钝化,如果 Bean 在被钝化时超时,它将被删除而不调用我的任何函数。因此,如果有人能告诉我如何确保在删除 bean 时取消预订,我将不胜感激。如果我使用@PreDestroy 注释,它会解决这个问题吗?
最好的问候,詹姆斯·特兰
假设我让我的客户使用 Stateful Session Bean 预订飞机上的座位。如果客户端显式调用了我的 Remove 方法,他的所有保留都将被取消,然后 bean 将被删除。
但是,如果客户端空闲一段时间并且 Bean 被钝化,如果 Bean 在被钝化时超时,它将被删除而不调用我的任何函数。因此,如果有人能告诉我如何确保在删除 bean 时取消预订,我将不胜感激。如果我使用@PreDestroy 注释,它会解决这个问题吗?
最好的问候,詹姆斯·特兰
该方法很可能@PreDestroy
不被调用。EJB 3.1 规范明确指出:
4.6.3 错过的 PreDestroy 呼叫
Bean Provider 不能假定容器总是为会话 bean 实例调用 PreDestroy 生命周期回调拦截器方法(或 ejbRemove 方法)。以下场景导致不为实例调用 PreDestroy 生命周期回调拦截器方法:
• EJB 容器崩溃。
• 从实例的方法向容器抛出的系统异常。
•实例处于被动状态时客户端不活动超时。超时由 Deployer 以特定于 EJB 容器实现的方式指定。
@PreDestroy
如果在这种情况下不调用该方法,规范还详细说明了如何删除资源:
例如,如果购物车组件被实现为会话 bean,并且会话 bean 将购物车内容存储在数据库中,则应用程序应该提供一个定期运行的程序,并从数据库中删除“废弃”的购物车。
在您的情况下,这取决于您如何存储预订状态。如果它们保留在数据库中,那么我建议采用与规范中规定的方法相同的方法。您可以使用 EJB Timer 服务来定期执行此活动,或者使用 Quartz 之类的调度程序。请注意,必须区分不再存在的钝化会话 bean 实例的内容和将再次准备就绪的那些内容。
钝化的 bean 将在超时时被销毁,因此任何带有注释的方法@PreDestroy
都可以满足您的需求。
当 A 处于活动状态时,A 的 Stateful bean 实例将不会与 B 共享,直到 A 的实例被销毁。请参阅本文的图表以进一步阅读
是的,它应该。带有注释的方法@PreDestroy
将在 bean 移除之前被调用(即使我在钝化状态下超时)