2017-06-16 43 views

回答

3

确实是一个非常好的问题,这里有一点洞察力。

CDI EG(专家组)决定对混合这两种有以下几个原因:

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

      当前模型我能想到的其他优点0

    • 有所谓NotificationOptions它允许你指定执行人您的通知
    • 这也提供了更多的火力,以实现 - 焊接通过这些选项已经提供parallel execution and timeouts
  • 最后但并非最不重要 - 用户体验
    • 这样,它是明确的,那是你收到的工作方式完全相同
    • 并且对于fireAsync()你匹配@ObservesAsync
+0

这些都是非常好的一点!我当然对这个决定有了更好的理解。谢谢! – brandizzi