单向
单向发送其实就是部分同步发送的实现,所不同的是单向发送在发送以后,虽然已经获取了发送结果,但是不对发送结果进行判断。而同步发送时会对发送结果进行判断,若发送失败会启用重试机制。
//发送消息获取发送结果
sendResult = this.sendKernelImpl(msg, mq, communicationMode, sendCallback, topicPublishInfo, timeout - costTime);
../部分代码省略
switch (communicationMode) {
case ONEWAY:
//单向发送不做任何判断,返回空
return null;
case SYNC:
//同步发送会检查发送结果,是否开启重试机制
if (sendResult.getSendStatus() != SendStatus.SEND_OK) {
if (this.defaultMQProducer.isRetryAnotherBrokerWhenNotStoreOK()) {
continue;
}
}
../部分代码省略
}
异步
异步发送采用的是异步回调模式,RemotingClient中设置了 InvokeCallback的回调。同样在该回调中也设置了重试机制与故障延迟机制,若成功则会调用SendCallback#onSuccess,失败则会调用SendCallback#onException。
同步
同步发送就是正常的请求响应模式,只不过同步发送在获取发送结果时会对发送结果的状态进行诊断,若不符合要求即启用重试机制,并且故障延迟机制开启的话也会同步使用。最大程度来保证消息的成功发送。
Request
//todo request部分暂时省略,等后续回溯的时候再补充。