将异步操作转换为同步操作是Java应用中常见的要求。例如,控制器将消息发送到消息队列(MQ),MQ处理后,将结果写入Redis。控制器需要立即返回处理结果,但避免低效轮询Redis。本文讨论了更优雅的解决方案。
虽然轮询并非不可取,但在这种情况下,更优雅的回调机制是首选。在目前的方法中,控制器线程继续轮询Redis,直到结果或加班。通过消费者通知,可以阻挡线程,实现异步转同步:
方案1:Redis发布/订阅(Pub/Sub)
消费者处理消息后,通过Redis发布完成信号。控制器将消息发送到MQ后,订阅相应的频道,等待完成信号。接收信号后,控制器线程解除堵塞并返回结果。
立即学习“Java免费学习笔记(深入);
方案二:MQ消息监控
消费者处理完成后,将完成消息发送到MQ。控制器发送初始消息后,监控MQ,等待完成消息。接到消息后,控制器线程解除堵塞并返回结果。
方案三:自定义HTTP回调
启动本地HTTP接口,接收异步过程结束的通知。控制器启动异步过程后,将其堵塞在一个对象上。异步过程结束后,通过HTTP接口发送通知。接到请求后,唤醒阻塞线程,完成异步转同步。
根据具体需要选择哪种方案。 方案1和方案2使用现有基础设施相对简单。方案3需要开发额外的HTTP接口,但更灵活,适用于更复杂的场景。 每一个方案都比简单的轮询更有效、更优雅。
以上是Java代码如何优雅地实现异步转同步?详情请关注图灵教育的其他相关文章!
