struts2 Асинхронное действие

Хотите использовать Struts2 с поддержкой Serlvet 3.0 Async.

Мой первый подход заключался в том, чтобы просто обработать запись в выходной поток в действии и вернуть значение null. Однако это возвращается с ошибкой 404 «ресурс недоступен». Я пытаюсь адаптировать сервлет Bosh внутри действия struts, используя интерфейсы ServletRequestAware, ServletResponseAware для ввода ответа.

Я использую диспетчер фильтров struts. Не совсем уверен, выполнимо ли это, но был бы счастлив, если бы кому-то еще удалось заставить асинхронную работу в действии struts. Возможно, здесь есть тип AsyncResult или какая-то другая магия, чтобы заставить эту работу работать.


person speajus    schedule 11.10.2012    source источник
comment
Проверить это [ссылка] [1]. Это может вам помочь [1]: stackoverflow .com / questions / 11026542 / get-json-data-from-struts /.   -  person Prabhakar Manthena    schedule 26.11.2012


Ответы (1)


Убедитесь, что фильтр struts разрешает асинхронность. Вот как это выглядит в файле web.xml:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
    <async-supported>true</async-supported>
</filter>

Затем из Action получить HttpServletRequest и HttpServletResponse и использовать AsyncContext, как в сервлете:

public String execute() {
  HttpServletRequest req = ServletActionContext.getRequest();
  HttpServletResponse res = ServletActionContext.getResponse();

  final AsyncContext asyncContext = req.startAsync(req, res);
  asyncContext.start(new Runnable() {
    @Override
    public void run() {
      try {
        // doing some work asynchronously ...
      }
      finally {
        asyncContext.complete();
      }
    }
  });

  return Action.SUCCESS;
}
person Brice Roncace    schedule 14.07.2014
comment
Вы пробовали это? Я тестировал это с помощью JMeter, и нет никаких улучшений в производительности и ведет себя как действие синхронизации. Кажется, это не работает :( - person Yasser Zamani; 29.08.2017
comment
да. В моем варианте использования действие отправляло электронное письмо потенциально многим адресатам, и я не хотел задерживать рендеринг ответа до тех пор, пока все электронные письма не будут отправлены. Использование AsyncContext позволило немедленно вернуться к действию для пользователя, продолжая отправлять электронные письма. - person Brice Roncace; 31.08.2017
comment
Может, вы использовали ExecAndWait interceptor! Как я изучал, AsyncContext не возвращается немедленно пользователю, а возвращает текущий поток в пул и запускает асинхронный код в другом потоке. По завершении он получает другой поток из пула для отправки ответа пользователю. то есть с точки зрения пользователя это синхронно, а не асинхронно. Я только что протестировал ваш приведенный выше код и Thread.sleep в нем с помощью JMeter; Я не видел никакой разницы в результате, когда usres, потоки и соединения превышают свой максимум. - person Yasser Zamani; 01.09.2017
comment
Интересно. Да, я только что посмотрел на код, и он отличается от того, что показано выше: мы вызываем asyncContext.complete() сразу в блоке try, а затем выполняем фактическую работу (и вообще не используем блок finally). - person Brice Roncace; 01.09.2017