我已经创建了一个REST控制器(在Spring Boot 2.2.2中),它调用一个“可调用”的服务类,如下所示:
@RestController
@RequestMapping("service")
public class ServiceController {
private Set<Invokable> services;
@Autowired
public ServiceController(Set<Invokable> services) {
this.services = services;
}
@GetMapping("invoke/{service}")
public void invoke(@PathVariable("service") String service) throws InterruptedException {
val invokable = services.stream().filter(c -> AopUtils.getTargetClass(c).getName().equals(service)).findFirst();
invokable.get().invoke();
}
}
这个
Invokable
接口方法已标记
Async
:
public interface Invokable {
@Async("taskExecutor")
void invoke();
}
其中一个实现如下所示:
@Service
@Transactional
public class EventListener implements Invokable {
private static boolean RUNNING = false;
private EventService eventService;
private List<EventProcessor> processors;
@Autowired
public EventListener(EventService eventService,
List<EventProcessor> processors) {
this.eventService = eventService;
this.processors = processors;
}
@Override
public void invoke() {
if (!RUNNING) {
RUNNING = true;
[...]
RUNNING = false;
}
}
}
上面可以看到,我通过使用
RUNNING
布尔值。这很好,但我不想自己实现。
以前我试过
lombok
):
@Override
@Synchronized
public void invoke() {
...
}
和
@Override
public synchronized void invoke() {
...
}
和
@Override
public void invoke() {
synchronized(this) {
...
}
}
但是,上面所有的这些似乎都允许同时调用多个方法。
我错过了明白什么吗
synchronized
是用来做的吗?
有没有一种更清洁的方法来实现上述目标而不亲自实施这一机制?