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

2020-01-23 12:01:07 +08:00
 Newyorkcity
public Future<integer> checkA(){
  ......
  return new AsynResult...
}

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

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

请问该如何实现呢?

谢谢!

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

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

提炼一下的话就是一个业务执行前需要考察几个条件是否成立,这些条件之间互不相干,但只要任意一个不通过那业务就没必要执行。在这种情景下,一个一个条件串行地执行过去而不并发么?
limuyan44
2020-01-23 16:32:46 +08:00
第一点,互不相关的校验也代表要一起验证,验证是需要代价的,这时候并行不意味着就比串行好到哪里去。第二点,你说的谁先有结果谁先返回可以尝试一下 CompletionService
aguesuka
2020-01-23 19:29:37 +08:00
楼主的意思是要实现一个 steam.anyMatch 的 aio 版吧, 优雅的办法我也不知道。
exceptionplayer1
2020-01-24 11:11:16 +08:00
CompletionService 可以。
exceptionplayer1
2020-01-24 11:16:25 +08:00
Java 提供了 CompletionService,同时可以参考[Dubbo 集群策略]( http://dubbo.apache.org/zh-cn/docs/user/demos/fault-tolerent-strategy.html)的实现,有一种策略为 Forking 策略,跟 CompletionService 很类似。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639996

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX