我有一个代码,如果线程失败,我将使用阻塞队列使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);
}
}
}
答案 0 :(得分:0)
不管注释如何,您需要做的“修复”问题是更改类的结构。
而不是在构造函数中初始化线程(因此是autostart)。您可以创建诸如start
,stop
,isRunning
之类的方法,并使用这些方法来处理线程。
保留对线程的引用以“监视”它。同样,从您的@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专用参考。)