|
|
@@ -0,0 +1,72 @@
|
|
|
+package org.dromara.stream.callback;
|
|
|
+
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.stream.config.RabbitConfig;
|
|
|
+import org.springframework.amqp.core.ReturnedMessage;
|
|
|
+import org.springframework.amqp.rabbit.connection.CorrelationData;
|
|
|
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Rabbit回调
|
|
|
+ * @author JC
|
|
|
+ */
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+public class RabbitCallback implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback {
|
|
|
+
|
|
|
+ private static final int MAX_RETRY_COUNT = 3;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RabbitTemplate rabbitTemplate;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void confirm(CorrelationData correlationData, boolean ack, String cause) {
|
|
|
+ if (ack) {
|
|
|
+ log.info("消息发送成功: {}", correlationData);
|
|
|
+ } else {
|
|
|
+ log.error("消息发送失败: {}, 原因: {}", correlationData, cause);
|
|
|
+ handleFailedMessage(correlationData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void returnedMessage(ReturnedMessage returnedMessage) {
|
|
|
+ log.error("消息返回: ReplyCode: {}, ReplyText: {}, Exchange: {}, RoutingKey: {}, Message: {}",
|
|
|
+ returnedMessage.getReplyCode(),
|
|
|
+ returnedMessage.getReplyText(),
|
|
|
+ returnedMessage.getExchange(),
|
|
|
+ returnedMessage.getRoutingKey(),
|
|
|
+ returnedMessage.getMessage());
|
|
|
+ retrySendMessage(returnedMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void handleFailedMessage(CorrelationData correlationData) {
|
|
|
+ int retryCount = getRetryCount(correlationData);
|
|
|
+ if (retryCount < MAX_RETRY_COUNT) {
|
|
|
+ retryCount++;
|
|
|
+ log.info("正在重试发送消息: {}, 当前重试次数: {}", correlationData, retryCount);
|
|
|
+ retrySend(correlationData);
|
|
|
+ } else {
|
|
|
+ log.error("消息发送失败超过最大重试次数: {}", correlationData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private int getRetryCount(CorrelationData correlationData) {
|
|
|
+ // 这里可以实现获取重试次数的逻辑,比如从数据库或缓存中获取
|
|
|
+ // 为了简单起见,这里返回0
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void retrySend(CorrelationData correlationData) {
|
|
|
+ String messageContent = correlationData.getId();
|
|
|
+ rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_NAME, RabbitConfig.ROUTING_KEY, messageContent, correlationData);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void retrySendMessage(ReturnedMessage returnedMessage) {
|
|
|
+ log.info("正在重试发送返回的消息: {}", returnedMessage.getMessage());
|
|
|
+ rabbitTemplate.convertAndSend(returnedMessage.getExchange(), returnedMessage.getRoutingKey(), returnedMessage.getMessage());
|
|
|
+ }
|
|
|
+}
|