【问题标题】:Struts2 - Delaying an action executionStruts2 - 延迟动作执行
【发布时间】:2015-06-22 12:53:03
【问题描述】:

我有 2 个不同的操作,我同时收到了来自同一主机的对这 2 个操作的响应。

我想将一个动作延迟 30 秒。 我尝试使用Thread.sleep(30000),但它似乎延迟了这两个动作。

这两个动作都是后台进程,因此我不能使用 ExecuteAndWaitInterceptor

以下是我要延迟的操作。

@Namespace(StrutsConstants.Namespace.PUBLIC)
public class CCAveDNHandlerAction extends  BaseRequestResponseAwareAction {

    private static Log log = LogFactory.getLog(CCAveDNHandlerAction.class);

    public String execute() throws ModuleException {

        log.info("CCAveDNHandlerAction ### Starting..");

        try {               
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

Struts2 文档说 2 个不同的请求在 2 个不同的线程中执行。

但在这种情况下,它不会发生。可能是因为 2 个请求来自同一主机。有没有办法强制一个动作在单独的上下文中执行?

这是工作流程。

  • 用户被重定向到外部支付网关页面。
  • 用户成功付款并重定向回预定义的 我的应用程序中的操作。
  • 同时支付网关发送另一个响应给另一个 我的应用程序的操作。(这是次要响应)
  • 我使用Thread.sleep 进行此操作,整个过程已暂停。
  • 我只想暂停次要响应。 我该怎么做?

【问题讨论】:

  • 你能发布你的代码的一些部分吗?
  • 用例是什么?你是如何执行你的行动的?
  • @AleksandrM :上面的代码是指用于处理服务器到服务器请求的操作。这用于保持付款确认。另一个操作处理从支付网关到我的应用程序端的重定向。
  • 您是否使用 Spring 来管理操作?如果是,请发布您的conf
  • 你能一步一步描述你的工作流程吗?

标签: java multithreading servlets struts2


【解决方案1】:

您可以使用 Timer 并执行 TimerTask 定义来调用您的操作。然后,您需要做的基本上就是为要调用的每个 timertask 制定一个时间表,从而调用您的操作。

更多信息请参阅 javadoc@ http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html

GL

【讨论】:

  • 现在我想了想,您也可以使用两个线程分别执行和等待每个任务,因为显然调用 Thread.sleep() 将暂停当前线程完成的所有操作,AFAIK没有办法解决这个问题......
  • Struts2 文档说 2 个不同的请求在 2 个不同的线程中执行。但在这种情况下,它没有发生。可能是因为 2 个请求来自同一主机。有没有办法强制一个动作在单独的上下文中执行?
猜你喜欢
  • 2012-03-29
  • 2013-02-22
  • 2011-01-25
  • 2018-02-25
  • 2011-09-23
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多