失败时如何重启线程

时间:2019-09-23 10:40:58

标签: java spring multithreading

我有一个代码,如果线程失败,我将使用阻塞队列使pub / sub异步,这将不占用我任何解决方法。

@Service
public abstract class AsyncPublisher<T> extends GeneralPublisher<T> {

    private final BlockingQueue<T> blockingQueue = new LinkedBlockingQueue<>();

    Logger LOGGER = LoggerFactory.getLogger(getClass());

    public AsyncPublisher() {
        new Thread(() -> {
            while (true) {
                try {
                    T t = blockingQueue.take();
                    super.publish(t);
                } catch (Throwable er) {
                    LOGGER.error("Error in AsyncPublisher in Thread", er);
                }

            }
        }).start();
    }

    public void publish(T t) {
        try {
            blockingQueue.put(t);
        } catch (Exception er) {
            LOGGER.error("Error in AsyncPublisher during publishing", er);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

不管注释如何,您需要做的“修复”问题是更改类的结构。 而不是在构造函数中初始化线程(因此是autostart)。您可以创建诸如startstopisRunning之类的方法,并使用这些方法来处理线程。

保留对线程的引用以“监视”它。同样,从您的@Service中,我相信您使用Spring。 Spring有一个生命周期(https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/Lifecycle.html)和smartlifecycle(https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/SmartLifecycle.html),您可以使用它们在上下文中插入您的类,并让spring监视它是否运行并重新启动它。

这种方法很常见(除了Spring和其他使用它的项目是Project-Reactor https://projectreactor.io/,它返回一个名为Displosable的项,该项具有函数isDisplosed来跟踪{{ 1}},您创建的stream是此处的Reactor专用参考。)