Правильный способ заставить работать @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, но мне не удалось его нагуглить. (И да, это пример кода, и я буду повторно использовать объект советника. Более того, я постараюсь сохранить прокси-объекты, а не создавать их постоянно.)

0 ответов

Другие вопросы по тегам