【发布时间】:2021-07-05 23:02:09
【问题描述】:
您好,我有一个应用程序计算时间并据此引发事件。我想使用 longadder 或任何合适的方法使我的应用程序具有线程安全性。
下面是我的班级;
@Autowired
EventListenerConfiguration eventListenerConfiguration;
private volatile long lastReceivedMessage = System.currentTimeMillis();
public void consume(String message) Integer partition,
(Headers.OFFSET) Long offset, Acknowledgment ack) {
lastReceivedMessage = System.currentTimeMillis();
try {
seervice.processMessage(message, ack, null);
} catch (ParseException e) {
logger.error(e.getMessage());
}
}
@Scheduled(fixedDelayString = "${listenScheduled}", initialDelay = 100000)
private void distanceBetweenLastReceivedMessageAndCurrentTime() {
long currentTime = System.currentTimeMillis() - lastReceivedMessage;
if (currentTime >= EventListenerConfiguration .getTotalMilliSecondTimeForError()) {
EventUtil.publishEvent(THROW_ERROR_EVENT, EventSeverityStatus.ERROR, EventTypeStatus.CUSTOM, null);
} else (currentTime >= EventListenerConfiguration.getTotalMilliSecondTimeForWarn()) {
EventUtil.publishEvent(THROW_WARN_EVENT, EventSeverityStatus.WARN, EventTypeStatus.CUSTOM, null);
}
}
所以基本上如何在不改变 longAdder 的情况下转换我的代码并执行 currentTime-lastReceiveMessage
谢谢
【问题讨论】:
-
你好@John deltana,看起来你正在使用 Spring 应用程序来调用你的代码。您提到它不是以线程安全的方式运行的。了解观察到的行为是有帮助的。在提出解决方案之前,我们可能需要更多背景信息。
-
感谢您的重播,我只是想防止我的事件在我必须用我的 yml 设置的计时器上被破坏我也尝试了 volatile 方法,如果这对这种情况有帮助的话
标签: java spring multithreading java-8 thread-safety