EJB的超时策略:它们如何提供帮助?

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实例占用主内存。

我可以在哪里放置此注释?

与@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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值