V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

Java Future/return new AsynResult 的并发开发时,如果优雅地检验多个并发方法返回的结果?

  •  
  •   Newyorkcity · 2020-01-23 12:01:07 +08:00 · 1662 次点击
    这是一个创建于 1548 天前的主题,其中的信息可能已经有所发展或是发生改变。
    public Future<integer> checkA(){
      ......
      return new AsynResult...
    }
    

    就这种方法,假设有五六个,假定情景是它们用来检查一个用户是否有权限做某事,这五六个方法里只要有一个返回的结果是 0 (return new AsynResult<integer>(0)),那么就知道不会继续往下走了,其它方法的返回结果可以不必再等,可以直接告诉用户你没权限,88 了您。

    进一步地,如果要根据结果告知用户不同的被拦截服务的原因,比如checkA返回-100,则告知用户:『大人,时待变了』,如果是checkB返回-250,就告知用户:『澳门赌场开业了,性感荷官在线发牌』……当然,只要有一个方法表示通不过就立刻返回消息,其它检查方法结果不再重要。。

    请问该如何实现呢?

    谢谢!

    9 条回复    2020-01-24 11:16:25 +08:00
    shenlanAZ
        1
    shenlanAZ  
       2020-01-23 14:40:39 +08:00
    我觉得你这个并发用的不对,权限应该在用户登录的时候查出来并缓存起来,后面用到权限控制的时候只需要看一下有没有对应权限即可。
    Newyorkcity
        2
    Newyorkcity  
    OP
       2020-01-23 14:49:30 +08:00
    @shenlanAZ 额,这只是一个场景。。那我再换一个假设,比如说我主持一个论坛,一个坛友发帖,那我要审查他最近三分钟有没有发过贴,发帖的内容中是否有敏感词,发帖的格式是否正确这类的。。其中比如他发的内容里有没有敏感词,这我总不能预先知道吧
    STRRL
        3
    STRRL  
       2020-01-23 15:01:40 +08:00 via Android   ❤️ 1
    reactor 库了解一下?
    shenlanAZ
        4
    shenlanAZ  
       2020-01-23 15:05:53 +08:00   ❤️ 1
    @Newyorkcity 最近有没有发过贴也可以利用缓存去判断,发帖有没有敏感词 格式是否正确这些用不着多线程,这些东西上多线程 会被你的 leader 骂过度优化。

    如果你真的是想要并发取最先执行完毕的线程结果 你可以把结果放到外部的缓存里,在每个线程里都去判断这个结果存不存在,如果存在就放弃不管,如果不存在就存上去。当然 我这是业务思维。
    Newyorkcity
        5
    Newyorkcity  
    OP
       2020-01-23 15:19:10 +08:00
    @shenlanAZ 谢谢解答,我没什么实际项目的开发经验,只是自己在自己学习的项目里想练习一下并发开发。

    提炼一下的话就是一个业务执行前需要考察几个条件是否成立,这些条件之间互不相干,但只要任意一个不通过那业务就没必要执行。在这种情景下,一个一个条件串行地执行过去而不并发么?
    limuyan44
        6
    limuyan44  
       2020-01-23 16:32:46 +08:00   ❤️ 1
    第一点,互不相关的校验也代表要一起验证,验证是需要代价的,这时候并行不意味着就比串行好到哪里去。第二点,你说的谁先有结果谁先返回可以尝试一下 CompletionService
    aguesuka
        7
    aguesuka  
       2020-01-23 19:29:37 +08:00 via Android
    楼主的意思是要实现一个 steam.anyMatch 的 aio 版吧, 优雅的办法我也不知道。
    exceptionplayer1
        8
    exceptionplayer1  
       2020-01-24 11:11:16 +08:00
    CompletionService 可以。
    exceptionplayer1
        9
    exceptionplayer1  
       2020-01-24 11:16:25 +08:00   ❤️ 1
    Java 提供了 CompletionService,同时可以参考[Dubbo 集群策略]( http://dubbo.apache.org/zh-cn/docs/user/demos/fault-tolerent-strategy.html)的实现,有一种策略为 Forking 策略,跟 CompletionService 很类似。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2810 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 1742ms · UTC 12:06 · PVG 20:06 · LAX 05:06 · JFK 08:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.