arm926ej
EJB 3.1在其API中引入了与超时相关的注释。
- @AccessTimeout
- @StatefulTimeout
让我们快速看一下它们是什么以及它们为什么重要
@AccessTimeout
指定一个排队请求(等待另一个线程完成)超时的时间段。
当您的会话bean实例被并发请求轰炸时,EJB容器通过序列化这些调用(即阻塞其他线程直到当前线程完成执行)来确保完整性。 您可以使用此批注进一步完善此行为。
哪些bean可以利用此注释?
这适用于
- 有状态的 (@Stateful)Bean和
- 配置了容器托管的并发选项(ConcurrencyManagementType.CONTAINER)的Singleton bean(@Singleton)
它为什么如此重要 ?
由于EJB容器对并发请求进行了序列化,因此具有此批注可确保不会永远阻止潜在的(等待)线程,并有助于定义并发策略 。
我可以在哪里放置此注释?
- 在类上–全局适用于所有方法
- 仅在特定方法上
- 在特定方法上覆盖类级别注释的设置
如何使用它 ?
您可以使用此批注的value和unit元素定义其行为
这里有一些选择
- @AccessTimeout(0) –这意味着您的方法根本不支持并发访问,并且客户端最终将收到java.ejb.ConcurrentAccessException
- @AccessTimeout(-1) –您的方法将无限期阻塞(我不认为这是个好主意!)
- @AccessTimeout(5000) –如果有机会,方法将在队列中的下一个线程(如果有)之前等待5000 ms(5秒)
几件事要注意
- unit元素的默认值为java.util.concurrent.TimeUnit.MILLISECONDS
- 小于-1的超时值无效
@StatefulTimeout
定义驱逐空闲状态会话Bean的阈值限制,即在特定时间间隔内未收到客户端请求的Bean
它为什么如此重要 ?
假设您有一个有状态的会话Bean处理用户注册工作流程。 用户在特定时间间隔内处于非活动状态(可能正在执行其他操作)。 您希望有状态会话Bean在内存中活动多长时间? 配置此注释可以帮助防止不活动的Bean实例占用主内存。
我可以在哪里放置此注释?
与@AccessTimeout批注相同的规则!
如何使用它 ?
您可以使用此批注的value和unit元素定义其行为
这里有一些选择
- @StatefulTimeout(0) –这意味着您的bean实例将在包含此批注的方法完成后立即删除
- @StatefulTimeout(-1) –您的方法对超时不敏感(固执的人!)
- @StatefulTimeout(15000) –方法将等待15000毫秒(15秒)以用于客户端请求,然后该方法将成为驱逐对象
几件事要注意
- unit元素的默认值为java.util.concurrent.TimeUnit.MILLISECONDS
- 小于-1的超时值无效
干杯!
翻译自: https://www.javacodegeeks.com/2015/04/timeout-policies-for-ejbs-how-do-they-help.html
arm926ej