目前我开发了一个小型履带/刮刀应用程序,它分为两部分。第一部分(请求者)基于某种模式构建URL并将其发送给消费者(secound部分),其执行acutal scraping并返回结果。然后进一步处理结果,并将其发送到另一个队列,依此类推。
所以我认为使用spring-amqp项目和RabbitMQ消息传递服务的消息传递来排队所有请求是个好主意。这样我就可以设置多个消费者,这些消费者都会监听请求队列。现在我使用convertAndSend从请求者发出异步请求
@Autowired
private RabbitTemplate messagingTemplate;
public void doMessaging(String url){
...
messagingTemplate.convertAndSend(queueName, url);
}
并在MessageListener中接收结果,该侦听器响应队列。到目前为止一切正常,但我的问题是请求者的发送部分和接收部分是独立的,我不知道如何确保我得到每个请求消息的响应(就像我使用convertSendAndReceive时一样)。
所以我的问题是:这个问题是否有任何好的模式,或者我是否必须使用一些correlationId缓存所有请求并手动检查响应是否到达?
更新
基本上我一直在寻找模式,因为spring-amqp提供的convertAndSend()的异步性很好。
我的场景更详细:我在diagramm中调用“requestor”的组件从数据库中读取一些可配置的值。基于这些信息,它创建了一个对象,比如说“爬行”,它包含有关爬行活动的信息。在“阶段1”开始之后,请求者根据可配置的值构建URL并将它们发送到queue1。 Queue1使用者废弃网页并将响应发送到response-queue1。
请求者侦听response-queue1,获取结果并将新消息推送到request-queue2(“阶段2”)等......
我的问题是:我怎么知道例如“抓取 - 运行”的所有阶段都被解决/完成以存储关于此次运行的一些元数据并关闭它?
一个想法可能是,为每个请求消息创建一个correlationId,将它存储在一个映射中,并在具有相同correlationId的响应到达时删除该条目,但我认为这可能不是最好的做法。是否有任何建议的解决方案或模式来处理此异步请求响应方案?
答案 0 :(得分:2)
Spring Integration Project包含您需要的所有组件。
确切的实现将取决于您的要求 - 您可以使用屏障暂停调用线程直到收到回复,或者使用聚合器进行完全异步处理,如果没有收到回复,聚合器可以发送错误消息,例如。
如果您可以提供有关确切要求的更多详细信息,我们可以帮助您入门。
如果您因某些原因不想使用Spring Integration,可以使用带convertAndSend
的{{1}}变体模板,以便设置相关ID。
您可以使用MessagePostProcessor
接收POJO方法获取转换后的有效负载和相关ID标头的回复。
答案 1 :(得分:0)
听起来你的问题不是RabbitMQ问题;相反,它是您的应用程序如何跟踪长期运行任务的问题。
从概念的角度来看,您需要在某处跟踪任务状态,因为这是您感兴趣的内容.RabbitMQ将不允许您查看排队的消息。因此,您需要在应用程序中使用单独的组件来跟踪那里的各种作业的状态。