首页 文章

在Spring Integration而不是ExecutorService中表示线程池

提问于
浏览
0

目前,我们的一个应用程序中存在类似于以下的代码:

@Component
public class ProcessRequestImpl {

   private ExecutorService executorService;

   public processRequest(...) {
      // code to pre-process request

      executorService.execute(new Runnable() {
         public void run() {
            ProcessRequestImpl.this.doWork(...);
         }
      }
   }

   private void doWork(...) {
      // register in external file that request is being processed
      // call external service to handle request
   } 

}

这样做的目的是创建一个对外部服务的请求队列 . 外部服务可能需要一些时间来处理每个传入请求 . 在处理完每个文件后,它将更新外部文件以注册已处理的特定请求 .

ProcessRequestImpl 本身是无状态的,因为所有状态都在构造函数中设置,并且没有对该状态的外部访问 . process() 方法由应用程序中的另一个组件调用 .

如果要在Spring Integration应用程序中实现,最好建议采用以下两种方法中的哪一种:

  • 保持上述代码不变 .

  • doWork() 提取到一个单独的 endpoints 中,将该 endpoints 配置为在通道上接收消息,并使用配置来实现多线程来代替执行程序服务 .

我们正在研究Spring Integration的一些原因如下:

  • 从代码本身中删除工作流逻辑,以便工作流和处理链在更高层次上显而易见 .

  • 简化每个类,增强可读性和可测试性 .

  • 尽可能避免线程化代码,并在配置中以更高的抽象级别定义 .

给出示例代码,可以使用Spring Integration实现这些目标 . 此外,DSL将实现这一目标的一个例子 .

谢谢

1 回答

  • 0

    就像是

    @Bean 
    public IntegrationFlow flow() {
        return IntegrationFlows.from(SomeGatewayInterface.class)
              .handle("someBean", "preProcess")
              .channel(MessageChannels.executor(someTaskExecutorBean())
              .handle("someBean", "doWork")
              .get();
    

    传递给gateway方法的参数成为 preprocess 方法的有效负载,它将返回一些成为消息有效负载的对象,该对象成为传递给 doWork 的参数 .

相关问题