gpt4 book ai didi

multithreading - 监听器线程死亡时如何在不重新启动服务器的情况下失去与服务器的连接

转载 作者:行者123 更新时间:2023-12-03 12:52:43 24 4
gpt4 key购买 nike

我正在尝试通过轮询来监听RabbitMQ队列。但是由于网络问题,如果到队列的连接一旦丢失,则线程会静默死掉,连接就会关闭,一切都会关闭。但这是一项后台任务,我们直到队列真正变大并开始发出通知时才知道。

有人可以帮我正常关闭线程吗(我想我已经通过仔细处理catch子句中的异常来做到这一点)。但是我不知道如何重新启动已停止的线程。

有没有一种方法可以重新启动已停止线程的新实例。

PS:我正在使用@postconstruct实例化线程,并在容器加载所有bean之后不久调用init线程。

最佳答案

在我看来,您没有进行适当的异常处理。您说“线程默默消失”,但这在Java中不会发生。我将审核您的异常(exception)情况,并注意以下问题:

  • 注意方法上的throws Exception。这掩盖了种种邪恶。方法通常应枚举其引发的异常。
  • 如果一个异常引发了太多不同类型的异常,则表明它太大。考虑将其拆分为多个较小的方法。或者在方法内部处理特定的异常,然后抛出一个异常。
  • 尝试使用小的try/catch块,如果可能的话,捕获单个异常。不要使用try { ... } catch (Exception e) { ... }封闭大量代码。这再次掩盖了邪恶。
  • 如果您捕获到异常,请确保您不只是盲目地继续。如果这是后台线程,则可能应该退出或重新启动套接字或...
  • 确保正确报告所有异常。每个catch块都应该做一些异常(exception)的事情。 e.printStackTrace()可能有效,但是通常会按顺序提供有关该问题的更多信息。

  • But I don't know how to re-start a stopped thread.



    您不重新启动已停止的线程,而是启动另一个线程。如果根本不应该关闭线程,则需要重新打开套接字或重新启动其 RabbitMQ连接。同样,它是关于适当的异常处理的。我不知道 RabbitMQ,但是类似下面的伪代码可能会有所帮助:
    public void run() {
    while (!shutdown) {
    Connection conn = null;
    try {
    conn = rabbitMq.start();
    processQueue(conn);
    } catch (IOException e) {
    // TODO: log the exception here
    } finally {
    // make sure we close the connection
    if (conn != null) { conn.close(); }
    }
    try {
    // we sleep here to not spin if the RabbitMQ host goes down
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    Thread.currentThread.interrupt();
    // bail if someone interrupts us
    return;
    }
    }

    祝你好运。

    关于multithreading - 监听器线程死亡时如何在不重新启动服务器的情况下失去与服务器的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9851804/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com