Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring amqp-异步请求/响应场景中的消息关联_Java_Spring_Spring Integration_Messaging_Spring Amqp - Fatal编程技术网

Java Spring amqp-异步请求/响应场景中的消息关联

Java Spring amqp-异步请求/响应场景中的消息关联,java,spring,spring-integration,messaging,spring-amqp,Java,Spring,Spring Integration,Messaging,Spring Amqp,目前,我开发了一个小型爬虫/刮板应用程序,它分为两部分。第一部分(请求者)基于某种模式构建URL并将其发送给消费者(secound部分),消费者执行acutal scraping并返回结果。然后进一步处理结果,并可能将其发送到另一个队列,依此类推 因此,我认为在spring amqp项目中使用消息传递和RabbitMQ消息传递服务将所有请求排队是一个好主意。这样我就可以设置多个使用者,它们都会侦听请求队列。现在我使用convertAndSend从请求者发出异步请求 @Autowired priv

目前,我开发了一个小型爬虫/刮板应用程序,它分为两部分。第一部分(请求者)基于某种模式构建URL并将其发送给消费者(secound部分),消费者执行acutal scraping并返回结果。然后进一步处理结果,并可能将其发送到另一个队列,依此类推

因此,我认为在spring amqp项目中使用消息传递和RabbitMQ消息传递服务将所有请求排队是一个好主意。这样我就可以设置多个使用者,它们都会侦听请求队列。现在我使用convertAndSend从请求者发出异步请求

@Autowired
private RabbitTemplate messagingTemplate;

public void doMessaging(String url){
    ...
    messagingTemplate.convertAndSend(queueName, url);

}
并在MessageListener中接收结果,MessageListener侦听响应队列。到目前为止,一切正常,但我的问题是请求者的发送部分和接收部分是独立的,我不知道如何确保每个请求消息都有响应(就像使用ConvertSendReceive时一样)

所以我的问题是:这个问题有什么好的模式吗?或者我必须用一些correlationId缓存所有请求,并手动检查响应是否到达

更新:

基本上,我在寻找模式,因为spring amqp提供的convertAndSend()的异步性很好

我的场景更详细:我在图表中称为“requestor”的组件从数据库中读取一些可配置的值。基于这些信息,它创建一个对象,比如说“爬网运行”,它保存有关爬网活动的信息。在“阶段1”开始之后,请求者基于可配置值构建URL并将其发送到queue1。Queue1使用者废弃网页并将响应发送到response-Queue1

请求者监听response-queue1,获取结果并将新消息推送到request-queue2(“阶段2”)等

我的问题是:例如,我如何知道“爬网运行”的所有阶段都已关闭/完成,以存储有关此运行的一些元数据并将其关闭

一个想法可能是,为每个请求消息创建一个correlationId,将其存储在映射中,并在具有相同correlationId的响应到达时删除条目,但我认为这可能不是最好的做法。是否有任何建议的解决方案或模式来处理此异步请求-响应场景?

具有您需要的所有组件

具体的实现将取决于您的需求-您可以使用屏障挂起调用线程,直到收到应答为止,或者使用聚合器进行完全异步处理,例如,如果没有收到应答,聚合器可以发送错误消息

如果您能提供更多关于您确切要求的详细信息,我们可以帮助您开始

如果出于某种原因不想使用Spring集成,可以使用模板的
convertAndSend
变量,该变量接受
MessagePostProcessor
,以便设置相关id


您可以使用
@RabbitListener
接收回复,其中POJO方法获取转换的有效负载和相关id头。

听起来您遇到的问题不是RabbitMQ问题;相反,这是应用程序如何跟踪长期运行的任务的问题


从概念的角度来看,您需要跟踪某个地方的任务状态,因为这是您感兴趣的。RabbitMQ将不允许您查看排队的消息。因此,您需要在应用程序中有一个单独的组件来跟踪各种作业的状态。

您是在寻找一般的替代模式,还是在寻找
spring amqp
平台中处理相关请求和回复的内置组件?我更新了我的问题。也许现在更清楚一点了。非常感谢。你找到合适的答案了吗?我对你如何解决你的问题感兴趣。