单向

单向发送其实就是部分同步发送的实现,所不同的是单向发送在发送以后,虽然已经获取了发送结果,但是不对发送结果进行判断。而同步发送时会对发送结果进行判断,若发送失败会启用重试机制。

  1. //发送消息获取发送结果
  2. sendResult = this.sendKernelImpl(msg, mq, communicationMode, sendCallback, topicPublishInfo, timeout - costTime);
  3. ../部分代码省略
  4. switch (communicationMode) {
  5. case ONEWAY:
  6. //单向发送不做任何判断,返回空
  7. return null;
  8. case SYNC:
  9. //同步发送会检查发送结果,是否开启重试机制
  10. if (sendResult.getSendStatus() != SendStatus.SEND_OK) {
  11. if (this.defaultMQProducer.isRetryAnotherBrokerWhenNotStoreOK()) {
  12. continue;
  13. }
  14. }
  15. ../部分代码省略
  16. }

异步

异步发送采用的是异步回调模式,RemotingClient中设置了 InvokeCallback的回调。同样在该回调中也设置了重试机制与故障延迟机制,若成功则会调用SendCallback#onSuccess,失败则会调用SendCallback#onException。

同步

同步发送就是正常的请求响应模式,只不过同步发送在获取发送结果时会对发送结果的状态进行诊断,若不符合要求即启用重试机制,并且故障延迟机制开启的话也会同步使用。最大程度来保证消息的成功发送。

Request

//todo request部分暂时省略,等后续回溯的时候再补充。