producer.setRetryTimesWhenSendAsyncFailed(3);
都知道通过设置,尝试是在MQClientAPIImpl 中完成
其重试是通过MQClientAPIImpl的onExceptionImpl方法来实现,它会先判断重试次数,然后重新调用sendMessageAsync方法进行重试,调用过程中出现异常会根据异常类型再次执行onExceptionImpl方法
源码博客
我们来分析一下
异步重试也是不会选择其他Broker的,该策略无法保证消息不丢失。异步又是效率优先,所以很多大拿都是
// 指定异步发送失败后不进行重试发送
producer.setRetryTimesWhenSendAsyncFailed(0);
所以我这边推荐的做法是
但是有些犟牛或者有些需求就要,再试试一定要成功,自定义。
Message msg = new Message("Test_Topic", "add","key1", "hello".getBytes(RemotingHelper.DEFAULT_CHARSET));producer.send(msg, new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {System.out.println("sendResult.getSendStatus() = " + sendResult.getSendStatus());}@Overridepublic void onException(Throwable throwable) {while (true){try {System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"again");SendResult send = producer.send(msg);if(send.getSendStatus().equals(SendStatus.SEND_OK)){System.out.println("success");break;}System.out.println("error" + send);} catch (Exception e) {System.out.println("同步发送失败,继续"+e.getMessage());}}}});
亲测可用