目录
学习目标:通过本章节的学习,要了解两种推送方式的区别、回调的内部实现和回调结果的处理时机以及失败重试的内部实现是怎么样的。
udp推送服务类(UdpPushService)
public class UdpPushService implements ApplicationContextAware, ApplicationListener<ServiceChangeEvent> {
//提供同步和异步的udp发送功能
//提供可回调和重试 也可提供不可靠的发送功能
private final UdpConnector udpConnector;
/**
* Push Data without callback.
*
* @param subscriber subscriber
* @param serviceInfo service info
*/
public void pushDataWithoutCallback(Subscriber subscriber, ServiceInfo serviceInfo) {
String serviceName = subscriber.getServiceName();
try {
//组装数据体
AckEntry ackEntry = prepareAckEntry(subscriber, serviceInfo);
....
udpConnector.sendData(ackEntry);
} catch (Exception e) {
}
}
/**
* Push Data with callback.
*
* @param subscriber subscriber
* @param serviceInfo service info
* @param pushCallBack callback
*/
public void pushDataWithCallback(Subscriber subscriber, ServiceInfo serviceInfo,
PushCallBack pushCallBack) {
String serviceName = subscriber.getServiceName();
try {
AckEntry ackEntry = prepareAckEntry(subscriber, serviceInfo);
udpConnector.sendDataWithCallback(ackEntry, pushCallBack);
} catch (Exception e) {
....
}
}
private AckEntry prepareAckEntry(Subscriber subscriber, ServiceInfo serviceInfo) {
InetSocketAddress socketAddress = new InetSocketAddress(subscriber.getIp(),
subscriber.getPort());
long lastRefTime = System.nanoTime();
return prepareAckEntry(socketAddress,
prepareHostsData(JacksonUtils.toJson(serviceInfo)), lastRefTime);
}
private static AckEntry prepareAckEntry(PushClient client, Map<String, Object> data,
long lastRefTime) {
return prepareAckEntry(client.getSocketAddr(), data, lastRefTime);
}
//设置lastRefTime属性根据ip port 构成AckEntry 的key
//
private static AckEntry prepareAckEntry(InetSocketAddress socketAddress, Map<String,
Object> data, long lastRefTime) {
data.put("lastRefTime", lastRefTime);
String dataStr = JacksonUtils.toJson(data);
....
// 把map转成bytes
byte[] dataBytes = dataStr.getBytes(StandardCharsets.UTF_8);
dataBytes = compressIfNecessary(dataBytes);
return prepareAckEntry(socketAddress, dataBytes, data, lastRefTime);
....
}
private static AckEntry prepareAckEntry(PushClient client, byte[] dataBytes,
Map<String, Object> data,
long lastRefTime) {
return prepareAckEntry(client.getSocketAddr(), da