确实是一个非常好的问题,这里有一点洞察力。
CDI EG(专家组)决定对混合这两种有以下几个原因:
- 向后兼容性
- 现有的应用程序使用同步,它需要表现同样
- 保持相同的注解会要求您添加额外的选项以区别
- 返回类型
- 调用
Event.fireAsync()
给你一个CompletionStage
您可以向其中链下一步骤,exceptionally()
或thenApply()
等这自然融入异步编程模型。
- 好老
Event.fire()
只给你void
,对此你不能反应在所有 - 不利于异步
- 此外,同步型的返回值不能被改变,由于向后兼容
- 除外处理不同很多
- 异常同步通知==链的端部,则炸毁在异步通知
- 异常==你继续前进,并从观察者方法(可能来自多个线程!)收集所有异常,然后将它们呈现回调用代码。由于它是
CompletionStage
,您可以轻松应对。
- 将两者混合会导致用户方面产生一个非常令人困惑的结果 - 什么时候你会炸毁,你什么时候继续?什么是
Event.fire()
真正的结果(如果它是为异步以及)
- 内部观察者处理
- 这将是非常复杂的(假设它甚至会是可能的)混合同步和异步
- 请记住,您需要严格绘制一条线,在该线之间将同步和异步,因为上下文不会在其他线程中传播(例如
RequestScoped
需要在异步观察器线程中由Weld重新激活)
- 类似的麻烦来自安全上下文传播f或集成
- 往往存在预处理观察员,使其工作非常快,如果你有两个一个观察者方法,你真的不能前处理它,你永远不知道它会被用于
- 最后但并非最不重要 - 用户体验
- 这样,它是明确的,那是你收到的工作方式完全相同
- 并且对于
fireAsync()
你匹配@ObservesAsync
这些都是非常好的一点!我当然对这个决定有了更好的理解。谢谢! – brandizzi