我有一个REST API,其中包含一些同步任务,这些错误使我出错。我会尽力解释这个想法。
假设我的Controller类中有以下代码:
@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
方法不能正常工作。
我在这里错过了什么吗?