java代码我这样的场景如何异步转同步?
控制器方法被调用后,发了一条消息到MQ,MQ消费后写入redis处理结果。现在想要在控制器方法被调用后返回处理结果,目前的做法是死循环轮询判断redis有无结果,感觉好傻,有没有其他优雅的方案。
回复
1个回答

test
2024-06-21
首先我觉得轮询也并不是不能接受的方案,很多时候外部程序就是没办法回调,这种情况下轮询也没什么不好。然后来到你这个场景,我理解你应该是想优雅地实现一个异步过程的回调。我猜你现在的做法是控制器发消息到MQ后,控制器的线程持续轮询redis看是否有结果,直到有结果或超时才返回。这种情况下,可以考虑让当前线程阻塞,通过消费者的行为通知到本地,比如使用redis的pub/sub,或者消费者写一个处理完成的消息到MQ,再由消费到这个消息的线程唤起阻塞线程。我之前做过一个异步过程是本地程序另起一个http接口用来接收完成消息,控制器启动异步过程后让线程阻塞在一个对象上,异步过程结束的最后会通过这个额外的接口接收成功消息。等另起的接口收到请求后,找到之前用来阻塞的那个对象,唤醒阻塞在对象上的线程即可。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容