2017-09-26 16 views
0

在我們的項目,我們在不同Controller小號一些異步請求,這是由不同的執行者經營,其中一些執行者之間共享的,有些是專門針對一些執行者。如何分配異步執行每個控制器

通過異步請求的意思是這樣的:該方法返回DeferredResult,這是由任務由一些執行運行填補。

目前,它們中的一些將大量數據(不會存儲在RAM中)直接從方法參數寫入OutputStream,這是我們想要防止的,因爲它似乎會導致數據損壞。

唯一的一個我發現這樣做合適的方式是從控制器的方法返回StreamingResponseBody。但在這種情況下,我不能分配一些特定的執行者,它將執行給定執行者的任務。我可以通過設立我自己的asyncBean來改變普通的執行者,但是這隻給我一個執行者,而我想要多個執行者執行各種任務。

+0

做不到。「這似乎導致數據損壞」。你的意思是你不明白爲什麼從異步方法寫入輸出流會導致垃圾? – Kayaman

+0

@Kayaman我想我是。這就是我現在正在解決的問題。儘管除了生產服務器的繁忙時間之外,它幾乎可以一直運行。 –

+0

那麼你使用異步方法,異步請求或兩者? – Kayaman

回答

0

如果你想要的任何行動不同的執行者,你可以通過包裝返回調用內WebAsyncTask

@Controller 
public class MyWebController3 { 

    @RequestMapping("/test3") 
    public 
    @ResponseBody 
    WebAsyncTask<String> handleRequest (HttpServletRequest r) { 
     System.out.println("asyncSupported: " + r.isAsyncSupported()); 
     System.out.println(Thread.currentThread().getName()); 

     Callable<String> callable =() -> { 
      System.out.println(Thread.currentThread().getName()); 
      return "WebAsyncTask test"; 
     }; 

     //Use any task executor here 
     ConcurrentTaskExecutor t = new ConcurrentTaskExecutor(
        Executors.newFixedThreadPool(1)); 

     return new WebAsyncTask<>(10000L, t, callable); 
    } 
} 

欲瞭解更多信息herehere

+0

這正是我在後解釋說:在第一種情形,我不能有一個以上的遺囑執行人,並在第二個(這幾乎就像我們現在就這樣做),我沒有權利寫OutputStream的,因爲它會導致數據損壞。 –