package com.hdl.sdk.connect.socket; 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(); } } }