【问题标题】:struts2 Async Actionstruts2 异步操作
【发布时间】:2012-10-11 17:01:54
【问题描述】:

希望使用带有 Serlvet 3.0 异步支持的 Struts2。

我的第一种方法是只处理写入操作中的输出流并返回 null。然而,这会返回 404“资源不可用”。我正在尝试在 struts 操作中调整 Bosh servlet,使用 ServletRequestAware、ServletResponseAware 接口注入响应。

我正在使用 struts 过滤器调度程序。不完全确定这是否可行,但如果其他人设法让异步在 struts 操作中工作,那肯定会很高兴。也许这里有一个 AsyncResult 类型或其他魔法来完成这项工作。

【问题讨论】:

标签: struts2 servlet-3.0


【解决方案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 中获取 HttpServletRequestHttpServletResponse 并像在 servlet 中一样使用 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;
}

【讨论】:

  • 你试过了吗?我用 JMeter 对此进行了测试,性能没有任何改进,并且表现得像一个同步操作。这似乎行不通:(
  • 是的。在我的用例中,该操作是向潜在的许多目的地发送电子邮件,我不想在所有电子邮件都发送之前暂停响应呈现。使用AsyncContext 允许操作立即返回给用户,同时继续发送电子邮件。
  • 也许你用过ExecAndWait interceptor!正如我所研究的,AsyncContext 不会立即返回给用户,而是将当前线程返回到池中并在另一个线程中运行异步代码。完成后,它会从池中获取另一个线程以将响应发送回用户。即从用户的角度来看,它是同步的而不是异步的。我刚刚用 JMeter 测试了你上面的代码和一个Thread.sleep;当 usres、线程和连接超过它们的最大值时,我看不出结果有任何差异。
  • 有趣。是的,我只是查看了代码,它与上面显示的不同:我们在 try 块内立即调用 asyncContext.complete(),然后执行实际工作(根本不使用 finally 块) .
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2023-03-31
  • 2017-06-29
  • 2018-10-30
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多