当 API 响应不是 200 时,我需要对消息进行死信处理。 消息最初不是发送到主队列,我需要直接将消息发送到死信。
遇到 deadLetter() 方法,但参数应为“ServiceBusReceiverClient”类型,并且无法手动转换为 ServiceBusReceiverClient 类型,因为构造函数是私有的。 有没有什么有效的方法可以通过Java应用程序直接对消息进行死信处理? 该队列还用于发送其他有效消息,因此无法实现一些适用于所有消息的配置更改。
正如您提到的,我们可以先将消息发送到队列,然后这些消息将发送到死信队列。
代码:
import com.azure.messaging.servicebus.*;
import com.azure.messaging.servicebus.models.*;
import java.util.List;
public class ServiceBus {
private static final String SERVICE_BUS_CONNECTION_STRING = "<conec_string>";
private static final String QUEUE_NAME = "<queue_name>";
public static void main(String[] args) {
sendMessageToQueue();
int responseCode = 404;
if (responseCode != 200) {
moveMessageToDeadLetterQueue();
}
}
private static void sendMessageToQueue() {
ServiceBusSenderClient sender = new ServiceBusClientBuilder()
.connectionString(SERVICE_BUS_CONNECTION_STRING)
.sender()
.queueName(QUEUE_NAME)
.buildClient();
ServiceBusMessage message = new ServiceBusMessage("Hi Kamali");
sender.sendMessage(message);
System.out.println("Sent message to queue");
sender.close();
}
private static void moveMessageToDeadLetterQueue() {
ServiceBusReceiverClient receiver = new ServiceBusClientBuilder()
.connectionString(SERVICE_BUS_CONNECTION_STRING)
.receiver()
.queueName(QUEUE_NAME)
.buildClient();
Iterable<ServiceBusReceivedMessage> receivedMessages = receiver.receiveMessages(1);
for (ServiceBusReceivedMessage receivedMessage : receivedMessages) {
receiver.deadLetter(receivedMessage);
System.out.println("Moved message to dead-letter queue");
}
receiver.close();
}
}
输出:
运行成功如下,
消息首先发送到主队列,如下所示,
并且,快速将该消息发送到死信队列,如下所示。