【问题标题】:Representing thread pooling in Spring Integration rather than ExecutorService在 Spring Integration 中表示线程池而不是 ExecutorService
【发布时间】:2018-03-09 15:16:40
【问题描述】:

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

@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 应用程序中实现,最好推荐以下两种方法中的哪一种:

  1. 保持上述代码不变。
  2. 提取doWork(),到一个单独的端点中,配置该端点在通道上接收消息,并使用配置来代替执行器服务实现多线程。

我们关注 Spring Integration 的一些原因如下:

  1. 从代码本身中删除工作流逻辑,使工作流和处理链在更高级别上显而易见。
  2. 简化每个类,增强可读性和可测试性。
  3. 尽可能避免线程化代码,并在配置中的更高抽象级别对其进行定义。

鉴于示例代码,是否可以使用 Spring Integration 实现这些目标。此外,实现这一目标的 DSL 示例是什么。

谢谢

【问题讨论】:

    标签: spring-integration spring-integration-dsl


    【解决方案1】:

    类似

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      相关资源
      最近更新 更多