2017-09-26 41 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的,因为它会导致数据损坏。 –