java - 将作业静默返回队列
问题描述
我有一个定义了作业队列的 RabbitMQ,我正在通过 Spring Framework 与 Java 一起使用它。我知道,如果我在处理从队列中收到的作业时在代码中的某处抛出异常,会将作业返回到队列中。但是,是否有其他方法可以将作业返回到队列,而不抛出异常,或者将作业“手动”返回到队列?
解决方案
解决方案可能取决于您使用的抽象:
- Spring Cloud Streams使用 Spring AMPQ
- Spring AMQP使用 RabbitMQ Java 客户端
- RabbitMQ Java 客户端
春天云流
我会使用处理消息并设置routingKeyExpression的Spring Cloud Stream Processor来做到这一点。
绑定:
=> theSourceQueue
=> myProcessor(message) consumes messages and setts routing key as a header
=> DestinationExchange
=> route 1 => theSourceQueue
=> route 2 => ?
春季 AMQP
import com.rabbitmq.client.Channel;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class Receiver {
@RabbitListener(queues = "my-messages")
public void receiveMessage(String payload, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) throws IOException {
System.out.println("Received message: `" + payload + "`, deliveryTag: " + deliveryTag);
channel.basicNack(deliveryTag, false, true);
}
}
RabbitMQ Java 客户端
您也可以转到较低层并使用否定确认和重新排队:
此示例通过对代理的一次调用拒绝两条消息(basicNack上的第二个参数是多个标志):
GetResponse gr1 = channel.basicGet("some.queue", false); GetResponse gr2 = channel.basicGet("some.queue", false); channel.basicNack(gr2.getEnvelope().getDeliveryTag(), true, true);
当一条消息被重新排队时,如果可能的话,它将被放置到它在队列中的原始位置。如果不是(由于多个消费者共享一个队列时来自其他消费者的并发传递和确认),则消息将被重新排队到更接近队列头的位置。
推荐阅读
- arduino - 串行命令后保持 LED 亮起
- php - sql查询太慢
- javascript - 在 ReactJS 中定义函数时,仅在括号中使用括号和花括号有什么区别?
- javascript - 如何修复套接字 io 中的 400 错误错误请求?
- c++ - 无法生成 Mandelbrot 矩阵以将其保存到 C++ 线程中的文件
- c# - 我无法反序列化我的 json api 上的可变属性日期
- java - 需要从文件中获取一行到队列中,而不是整个文件文本
- rest - 套接字可以代替 HTTP 请求吗?(套接字与 http)
- javascript - 如何修复 npm run dev 给出的错误?
- flutter - Flutter 和 WordPress Api,不是从网站获取图片,而是从 assets.image 获取