【发布时间】:2018-09-26 15:52:07
【问题描述】:
第 1 步:我想让一个 CompletableFuture<String> asyncFuture 在 微服务 A 中启动,通过 supplyAsync 运行异步任务。
第 2 步:然后通过从不同的微服务 B 中手动调用 asyncFuture.complete(T value) 手动完成相同的未来对象,这将由一些异步事件触发。
显然微服务A和微服务B有不同的JVM。 实际上,微服务 A 和微服务 B 是同一微服务的不同实例,运行在 Kubernetes 的不同 pod 上。
在第 1 步和第 2 步之间,future 对象将存储在 Redis 中,微服务 B 可以安全地检索。
经过一些快速的谷歌搜索后,我想我会尝试以下几个解决方案:
1> HazelCast 的分布式执行器服务,我可以在调用时作为第二个参数传入
static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
参考: http://docs.hazelcast.org/docs/2.3/manual/html/ch09.html
2>使用 apache ignite 中的共享 executorService
参考:https://apacheignite.readme.io/v1.2/docs/executor-service
不确定两者是否可行?另外我想知道以前有没有人处理过这样的事情?如果是这样,如果您能与我分享您的解决方案,我将不胜感激。
【问题讨论】:
-
我的两分钱:您要求一个 jvm 完成由另一个 jvm 启动的线程。这听起来并不安全
-
奇怪的是,你会通过
supplyAsync()创建你的未来,然后手动complete()它。虽然没有严格禁止,但通常的模式是您的Supplier将提供结果,因此您不需要调用complete()。否则Supplier的结果将被忽略/丢失。
标签: java redis hazelcast ignite completable-future