同步请求处理中,异步rabbitmq获取数据

pujitan978 2024-03-04 10:48:46

画面点击检索按钮(springboot项目,项目中有检索类似处理有上百个接口)

请求接口test11,在这个接口中调用rabbitmq发送接口请求数据。第三方应用收到mq请求后准备数据发送。sprinboot模块监听到有数据,在test11请求中返还给web端。显示检索一栏。

该如何设计呢,最好给个例子。主要在如何等待数据返回,目前是用while一直循环数据List,有值就推出while,返回web端。

或者有其他好的设计方法,web端可修改。是否可以web端 后台  mabbitmq都用异步方式呢?  

 

...全文
成就一亿技术人!
拼手气红包 10.00元
1763 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小羊炒饭 2024-03-04
  • 打赏
  • 举报
回复

mq收到消息之后通过webSocket发送给具体的会话或者某个用户(这里主要看你怎么维护webSocket的用户列表),网上有很多实现方式,可以参考ruoyi或者其他。

pujitan978 2024-03-07
  • 举报
回复
@小羊炒饭 感谢回答
  • 打赏
  • 举报
回复

在设计这种基于消息队列(如RabbitMQ)的异步检索系统时,通常我们会避免使用while循环来等待数据返回,因为这种方式会阻塞当前线程,影响系统的性能和响应能力。相反,我们可以利用异步编程模型和Future、CompletableFuture或者Reactive编程(如使用RxJava、Reactor等)来处理异步操作。

以下是一个简单的例子,展示了如何在Spring Boot中使用CompletableFuture来实现异步检索和响应:

首先,确保你的Spring Boot项目中已经集成了RabbitMQ,并且配置好了消息生产者(用于发送请求)和消息监听器(用于接收第三方应用返回的数据)。

在你的test11接口中,你可以使用CompletableFuture来异步处理数据检索:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
import java.util.concurrent.CompletableFuture;  
import java.util.concurrent.ExecutionException;  
  
@RestController  
public class SearchController {  
  
    @Autowired  
    private SearchService searchService; // 假设这是你的服务类,用于处理检索逻辑  
  
    @GetMapping("/test11")  
    public CompletableFuture<SearchResult> test11() {  
        // 使用CompletableFuture异步执行检索操作  
        CompletableFuture<SearchResult> future = CompletableFuture.supplyAsync(() -> {  
            // 调用服务层的检索方法  
            return searchService.retrieveData();  
        });  
  
        // 如果需要,可以在这里添加异常处理逻辑  
        future.exceptionally(throwable -> {  
            // 处理异常,并返回异常信息或默认值  
            return new SearchResult("Error", null);  
        });  
  
        return future;  
    }  
}

在你的服务层SearchService中,实现发送RabbitMQ消息和接收响应的逻辑:
java
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

@Service
public class SearchService {

@Autowired  
private RabbitTemplate rabbitTemplate; // RabbitMQ的模板类,用于发送消息  

// 假设这是接收第三方应用返回数据的监听器方法  
// 注意:这个方法应该是异步执行的,并且用某种方式通知test11接口数据已经准备好  
public void handleDataReceived(SearchResult result) {  
    // 处理接收到的数据,可能是更新某个缓存或变量  
}  

public CompletionStage<SearchResult> retrieveData() {  
    // 发送RabbitMQ消息给第三方应用  
    rabbitTemplate.convertAndSend("exchange", "routingKey", "yourRequestData");  

    // 使用CompletableFuture表示异步检索结果  
    CompletableFuture<SearchResult> future = new CompletableFuture<>();  

    // 假设你有一个机制(如监听器、回调、或者直接操作某个Future对象)来在数据准备好后完成这个Future  
    // 这里只是模拟一下,实际中你需要根据具体实现来设置这个逻辑  
    new Thread(() -> {  
        try {  
            // 模拟检索耗时  
            Thread.sleep(5000);  
            SearchResult result = new SearchResult("Success", "Retrieved Data");  
            handleDataReceived(result); // 处理接收到的数据  
            future.complete(result); // 数据准备好后,完成Future  
        } catch (InterruptedException e) {  
            future.completeExceptionally(e); // 如果出错,则异常完成Future  
        }  
    }).start();  

    return future;  
}  

}
在Web端,你可以使用JavaScript的fetch API或者其他异步HTTP请求库(如axios)来调用/test11接口,并处理返回的结果。如果后端支持,你还可以使用WebSocket或者Server-Sent Events (SSE) 来实现服务端主动推送数据到客户端的功能。
注意:上面的代码只是一个简化的例子,你需要根据你的具体业务逻辑和框架配置来适配代码。例如,你可能需要配置RabbitMQ的消息队列、交换机、路由键等。此外,处理异步操作和错误处理需要更加细致的考虑,以确保系统的健壮性和稳定性。

pujitan978 2024-03-07
  • 举报
回复
@清风与酒都没有 感谢回复

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧