Правильный способ заставить работать @Async с помощью ProxyFactory
Предположим, у нас есть интерфейс Актера:
public interface Actor {
...
void doAction(arg1, arg2, etc ...);
}
И у нас есть несколько реализаций:
@Async
void doAction(...) {
Теперь мы реализуем некоторую библиотеку с картой актеров, и она кодирует что-то вроде этого:
var actor = actorMap.get("actorName");
actor.doAction(...);
И @Async не работает, потому что конкретный актор - это не прокси, а реальный экземпляр. Но мы продолжаем бороться. Позволяет проксировать вызов:
ProxyFactory factory = new ProxyFactory(actor);
factory.addInterface(Actor.class);
factory.addAdvisor(new AsyncAnnotationAdvisor());
var ifaceActor = (Actor) factory.getProxy();
// this is a method call on the proxy!
ifaceActor.doTheAction(update, null, this, session, sender);
И это начинает волшебным образом работать, но я не уверен, что строка с factory.addAdvice() достаточно корректна. Возможно, есть более правильный способ получить AsyncAdvice, но мне не удалось его нагуглить. (И да, это пример кода, и я буду повторно использовать объект советника. Более того, я постараюсь сохранить прокси-объекты, а не создавать их постоянно.)