【问题标题】:Java Quit class functionJava Quit 类函数
【发布时间】:2021-11-04 04:11:57
【问题描述】:

我有问题。我创建了这个类,它使用 Binance 打开一个 websocket 流:

public class AccountStream extends Driver {

    private Integer agentId;
    private String API_KEY;
    private String SECRET;
    private String listenKey;
    private Order newOrder;

    private String LOG_FILE_PATH;

    public AccountStream(Integer agentId) {
        this.agentId = agentId;

        // Load binance config
        HashMap<String, String> binanceConfig = MainDriver.getBinanceConfig(agentId);
        API_KEY = binanceConfig.get("api_key");
        SECRET = binanceConfig.get("secret");

        startAccountEventStreaming();
        setConnectionCheckScheduler();

    }

    private void startAccountEventStreaming() {

        BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(API_KEY, SECRET);
        BinanceApiRestClient client = factory.newRestClient();

        // First, we obtain a listenKey which is required to interact with the user data stream
        listenKey = client.startUserDataStream();

       // Then, we open a new web socket client, and provide a callback that is called on every update
        BinanceApiWebSocketClient webSocketClient = factory.newWebSocketClient();
        
        // Listen for changes in the account
        webSocketClient.onUserDataUpdateEvent(listenKey, response -> {

            System.out.println(response);
            
        });

        // Ping the datastream every 30 minutes to prevent a timeout
        ScheduledExecutorService keepAliveUserDataStreamPool = Executors.newScheduledThreadPool(1);
        Runnable pingUserDataStream = () -> {
            client.keepAliveUserDataStream(listenKey);
        };
        keepAliveUserDataStreamPool.scheduleWithFixedDelay(pingUserDataStream, 0, 30, TimeUnit.MINUTES);

    }


    private void setConnectionCheckScheduler() {
        ScheduledExecutorService checkConnectionPool = Executors.newScheduledThreadPool(1);
        Runnable checkConnectionTask = () -> {
            if (!MainDriver.connected) {
                // DESTORY ENTIRE CLASS HERE
            }
        };
        checkConnectionPool.scheduleWithFixedDelay(checkConnectionTask, 0, 1, TimeUnit.SECONDS);
    }

}

现在setConnectionCheckScheduler() 安排检查特定变量,如果程序失去与 Internet 的连接,该变量将设置为 true,但该函数还必须阻止代码继续 ping API。实际上我想做某种return 来退出整个类代码,所以我需要创建一个新的类实例来再次启动 API 流。

如何从Runnable checkConnectionTask 中取消该类中的所有代码(实际上是销毁该类)?

【问题讨论】:

标签: java binance


【解决方案1】:

基本上你需要关闭/清理资源/正在运行的线程并从头开始运行逻辑,将启动逻辑包装到单独的方法并添加一个进行清理会有所帮助:

    private void start() {
        startAccountEventStreaming();
        setConnectionCheckScheduler();
    }

    private void shutdown() {
        // possibly more code to make sure resources closed gracefully
        webSocketClient.close();
        keepAliveUserDataStreamPool.shutdown();
        checkConnectionPool.shutdown();
    }

    private void restart() {
        shutdown();
        start();
    }

所以你只需在你的检查器中调用重启:

        Runnable checkConnectionTask = () -> {
            if (!MainDriver.connected) {
                restart();
            }
        };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2021-08-04
    相关资源
    最近更新 更多