2012-10-11 235 views
4

尋求使用Struts2和Serlvet 3.0異步支持。struts2異步操作

我的第一種方法是在操作中寫入輸出流並返回null。然而這返回404「資源不可用」。我試圖在一個struts動作中使用一個Bosh servlet,使用ServletRequestAware,ServletResponseAware接口來注入響應。

我正在使用struts過濾器調度程序。不能完全確定這是否可行,但如果其他人設法在struts操作中使異步工作,那麼肯定會很開心。也許這是一個AsyncResult類型或其他一些魔術來使這個工作。

+0

檢查此[鏈接] [1]。它可以幫助你 [1]:http://stackoverflow.com/questions/11026542/get-json-data-from-struts/13527598#13527598 –

回答

4

確保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> 

然後從內行動取得HttpServletRequestHttpServletResponse和使用AsyncContext你將一個servlet中:

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; 
} 
+0

你試過嗎?我使用JMeter進行了測試,性能沒有任何改進,並且像同步操作一樣。這似乎不起作用:( –

+0

是的。在我的使用案例中,動作是發送一封電子郵件給潛在的許多目的地,並且我不希望在所有電子郵件發送之前阻止響應呈現。使用「AsyncContext」允許動作立即返回給用戶,同時繼續發送電子郵件 –

+0

也許你使用了'ExecAndWait攔截器'!正如我研究的那樣,'AsyncContext'不會立即返回給用戶,而是將當前線程返回給池並在另一個線程中運行異步代碼。當完成時,它從池中獲得另一個線程來發送響應給用戶,即在用戶的觀點中它是同步的而不是異步的,我剛剛用JMeter測試了你的上面的代碼和一個'Thread.sleep';我不能看看usres,線程和連接超出最大值的結果有什麼不同 –