我有一个使用消息并检查一些内部条件的方法。如果验证失败,我想拒绝该消息并将其放回队列,以便稍后到达消费者。
我在Reactive Messaging for MicroProfile或SmallRye Reactive Messaging中找不到用于发送否定确认并重新排队消息的特殊API。我所能做的就是使用Acknowledgment.Strategy.MANUAL
而不是调用message.ack()
。这样,消息将保留在队列中,但不会重新排队-使用者方法不会再收到此消息。我的代码:
@Incoming("my-queue")
@Acknowledgment(Acknowledgment.Strategy.MANUAL)
public CompletionStage<Void> getMessage(Message<String> message) {
if (!someCondition()) {
// validation fails. reject and requeue the message
return CompletableFuture.completedFuture(null);
} else {
process(message.getPayload());
return message.ack();
}
}
如何正确重新排队消息?