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