用例:接收请求,对其进行处理,并在请求完成后通知某人。当进程出现错误以供日后重新处理时,将其放入另一个队列。
我需要一个API,该API可以接收有效负载并将其发送到队列(要处理的作业)。然后拾取消息并开始使用该有效负载来调用另一个Rest服务,并将该调用的响应放入新队列(已完成作业)中,然后另一个服务将选择该消息并通知另一个服务其完成。
因此,API POST将消息存储在一个队列中,对消息进行处理,然后将该消息的结果存储在另一个队列中。
我有一个带有两个绑定的应用程序,一个绑定用于空闲作业,一个绑定用于处理的作业。该应用程序按预期工作,但是当我引发异常时,spring尝试将消息重新处理3次后,它没有将任何消息发送到processing.default.errors,而是引发了异常:
由以下原因导致:org.springframework.messaging.MessageDeliveryException:无法将消息发送到通道“ processed.default.errors”;嵌套的异常是org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException:重试策略用尽
@Component
public interface JobBinding {
String INPUT = "jobs-in";
String OUTPUT = "jobs-out";
@Input(INPUT)
SubscribableChannel input();
@Output(OUTPUT)
MessageChannel output();
}
-
@Component
public interface ProcessedBinding {
String INPUT = "processed-in";
String OUTPUT = "processed-out";
@Input(INPUT)
SubscribableChannel input();
@Output(OUTPUT)
MessageChannel output();
}
我都启用了它们:
@EnableBinding({JobBinding.class, ProcessedBinding.class})
public class BindingsConfiguration {
}
然后我处理工作:
@Component
@Slf4j
public class JobProcessor {
@StreamListener(JobBinding.INPUT)
@SendTo(ProcessedBinding.OUTPUT)
public Message<Job> handleJob(@Payload Job job) {
log.info("Processing {}", job);
job.addMetadata("status", "processed");
return MessageBuilder.withPayload(job).build();
}
}
然后我就动弹了:
@Component
@Slf4j
public class DoneProcessor {
@StreamListener(ProcessedBinding.INPUT)
public void handleJob(@Payload Job job) {
log.info("Notifying {}", job);
throw new RuntimeException("puff");
}
}
我的application.properties如下:
spring.cloud.stream.bindings.jobs-out.destination=jobs
spring.cloud.stream.bindings.jobs-in.destination=jobs
spring.cloud.stream.bindings.jobs-in.group=default
spring.cloud.stream.bindings.processed-out.destination=processed
spring.cloud.stream.bindings.processed-in.destination=processed
spring.cloud.stream.bindings.processed-in.group=default
spring.cloud.stream.default.contentType=application/json
由于找不到解决方案,我尝试阅读Spring Stream Cloud的文档。队列应自动创建。