#java #multithreading #spring-boot #performance #java-8
Вопрос:
У меня есть запланированный метод с целочисленными значениями с условиями, а также длинными значениями для проверки этих условий, Мой код работает, однако я хотел бы сделать потокобезопасным для длинных значений, Я нашел AtomicInteger, но я не знаю, как применить его к своему коду;
Мой код ниже;
Файл Yaml;
listenForInfo: 20000
listenForWarn: 30000
listenForError: 40000
listenScheduled: 1000
Мой основной код;
@Value("${listenForInfo}")
private int listenForInfo;
@Value("${listenForWarn}")
private int listenForWarn;
@Value("${listenForError}")
private int listenForError;
private long lastReceivedMessage = System.nanoTime();
@KafkaListener(topics = "#{'${kafka.topic}'}", groupId = "#{'${kafka.groupid}'}")
public void consume(String message, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) Integer partition,
@Header(KafkaHeaders.OFFSET) Long offset, Acknowledgment ack) {
logger.info("offset = {} ", offset);
logger.info("partition = {} ", partition);
logger.info("kafka Message : {}", message);
lastReceivedMessage = System.nanoTime();
try {
service.processMessage(message, ack, null);
} catch (ParseException e) {
logger.error(e.getMessage());
}
}
@Scheduled(fixedDelayString = "${listenScheduled}", initialDelay = 1000)
private void distanceBetweenLastReceivedMessageAndCurrentTime() {
long currentTime = (System.nanoTime() - lastReceivedMessage) / 1000000;
logger.info("current time : {}", currentTime);
if (currentTime >= listenForInfo amp;amp; currentTime < listenForWarn) {
EventUtil.publishEvent("event info ", EventSeverityStatus.INFO, EventTypeStatus.CUSTOM, null);
}
if (currentTime >= listenForWarn amp;amp; currentTime < listenForError) {
EventUtil.publishEvent("event warn ", EventSeverityStatus.WARN, EventTypeStatus.CUSTOM, null);
}
if (currentTime >= listenForError) {
EventUtil.publishEvent("event error ", EventSeverityStatus.ERROR, EventTypeStatus.CUSTOM, null);
}
}
Комментарии:
1. Нужно больше объяснений для > Я хотел бы сделать потокобезопасным для длинных значений
2. Спасибо, что я отредактировал
3. в чем проблема, которую вы пытаетесь решить? Я не думаю, что использование AtomicInteger или AtomicLong что-нибудь здесь исправит
4. Есть ли какая-либо причина
currentTime
, по которой это не локальная переменная?5. Таким образом, вы ожидаете ответов относительно потокобезопасности вашей программы, не показывая соответствующие части?