Вызов синхронизированного метода из ExecutorService не работает должным образом - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть REST API с некоторыми синхронизированными задачами, которые дают мне ошибки.Я попытаюсь объяснить идею.

Предположим, у меня есть следующий код в моем классе контроллера:

@Qualifier("serviceA")
@Autowired
private UpdateService updateServiceA; // connected to host A

@Qualifier("serviceB")
@Autowired
private UpdateService updateServiceB; // connected to host B

@Autowired
private ExecutorService myExecutorService;

// one of my endpoints calls update method below

public void update(Object x) {
   myExecutorService.submit(() -> {
      updateServiceA.remove(x); // remove x on host A
      updateServiceB.remove(x); // remove x on host B
   }
}

А в классе UpdateServiceImpl у меня есть следующее:

public class UpdateServiceImpl implements UpdateService {

   public synchronized void remove(Object x) {
     // 1. find x
     // 2. if x exists, remove it
     // Response response = elasticSearch.performRequest(...)
   }

}

И bean-компоненты настроены в классе конфигурации следующим образом:

@Bean
public ExecutorService executorService() {
    return Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
}

@Qualifier("serviceA")
@Bean
public UpdateService getUpdateService() {
    return new UpdateServiceImpl();
}

@Qualifier("serviceB")
@Bean
public UpdateService getUpdateService() {
    return new UpdateServiceImpl();
}

Бэкэнд - ElasticSearch.Метод удаления просто выполняет операцию удаления.

Время от времени я вижу в своих журналах, что запись найдена, но когда она пытается удалить ее, она больше не существует.У меня такое ощущение, что другой поток (?) Тем временем уже удалил объект.Я не понимаю, почему метод synchronized не работает должным образом.

Я что-то здесь упускаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...