package com.hdl.sdk.connect;
|
|
import android.text.TextUtils;
|
|
import com.hdl.sdk.common.event.EventDispatcher;
|
import com.hdl.sdk.common.event.EventListener;
|
import com.hdl.sdk.common.utils.ThreadToolUtils;
|
import com.hdl.sdk.connect.bean.LinkRequest;
|
import com.hdl.sdk.socket.SocketBoot;
|
|
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
/**
|
* Created by Tong on 2021/11/11.
|
*/
|
public class HdlSocketHelper {
|
|
private static final Long DEF_SEND_TIMEOUT = 1000L;
|
private static final int DEF_MAX_RETRY = 4;
|
private static final int DEF_SEND_ONE = 1;
|
|
private final Long sendAwaitTime;
|
private final int maxRetry;
|
|
private final SocketBoot boot;
|
private final LinkRequest linkRequest;
|
private final EventListener eventListener;
|
|
private final AtomicInteger sendNumber;
|
|
private final AtomicBoolean isSend = new AtomicBoolean();
|
|
private final HdlSocketListener listener;
|
|
private ScheduledExecutorService sendThread;
|
|
public interface HdlSocketListener {
|
void onSucceed(Object msg);
|
|
void onFailure();
|
}
|
|
private HdlSocketHelper(Long sendAwaitTime, int maxRetry, SocketBoot boot, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
|
this.sendAwaitTime = sendAwaitTime;
|
this.maxRetry = maxRetry;
|
this.boot = boot;
|
this.linkRequest = linkRequest;
|
this.listener = listener;
|
this.sendNumber = new AtomicInteger(0);
|
eventListener = new EventListener() {
|
@Override
|
public void onMessage(Object msg) {
|
isSend.set(true);
|
if (listener != null) {
|
listener.onSucceed(msg);
|
}
|
if (sendThread != null) {
|
sendThread.shutdownNow();
|
}
|
EventDispatcher.getInstance().remove(eventListener);
|
}
|
};
|
EventDispatcher.getInstance().register(observeTopic, eventListener);
|
}
|
|
public static void send(SocketBoot boot, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener, Long sendAwaitTime, int maxRetry) {
|
if (TextUtils.isEmpty(observeTopic)) {
|
observeTopic = linkRequest.getTopic() + "_reply";
|
}
|
HdlSocketHelper socketHelper = new HdlSocketHelper(sendAwaitTime, maxRetry, boot, linkRequest, observeTopic, listener);
|
socketHelper.resend();
|
}
|
|
public static void send(SocketBoot boot, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
|
send(boot, linkRequest, observeTopic, listener, DEF_SEND_TIMEOUT, DEF_MAX_RETRY);
|
}
|
|
|
public static void send(SocketBoot boot, LinkRequest linkRequest, HdlSocketListener listener) {
|
send(boot, linkRequest, "", listener, DEF_SEND_TIMEOUT, DEF_MAX_RETRY);
|
}
|
|
public static void sendOne(SocketBoot boot, LinkRequest linkRequest, HdlSocketListener listener) {
|
send(boot, linkRequest, "", listener, DEF_SEND_TIMEOUT, DEF_SEND_ONE);
|
}
|
|
private void resend() {
|
getSendThread().scheduleWithFixedDelay(new Runnable() {
|
@Override
|
public void run() {
|
if ((sendNumber.get() < maxRetry + 2) || !isSend.get()) {
|
try {
|
if (sendNumber.get() < maxRetry + 1) {
|
if (boot != null) {
|
boot.sendMsg(linkRequest.getSendBytes());
|
}
|
sendNumber.set(sendNumber.get() + 1);
|
} else {
|
notifyFailure();
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
sendNumber.set(sendNumber.get() + 1);
|
} finally {
|
if (sendNumber.get() > maxRetry + 1 && !isSend.get()) {
|
notifyFailure();
|
}
|
}
|
}
|
}
|
}, sendAwaitTime, sendAwaitTime, TimeUnit.MILLISECONDS);
|
}
|
|
public ScheduledExecutorService getSendThread() {
|
if (sendThread == null) {
|
sendThread = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
|
}
|
return sendThread;
|
}
|
|
|
private void notifyFailure() {
|
if (sendThread != null) {
|
sendThread.shutdownNow();
|
}
|
if (listener != null) {
|
listener.onFailure();
|
}
|
}
|
}
|