Spring Integration Executor Channel使用注释代码示例

时间:2018-05-25 19:09:16

标签: spring spring-integration executor

我的系统图已附上。

System Diagram

流程如何工作:

spring integration flow从C:\上的json文件读取输入并执行2个操作:

  1. 存储到数据库

  2. 通知/打印给用户

  3. 重要标准:

    我希望商店进入数据库流程独立于业务逻辑(打印到/通知用户),即数据库exception/DB的成功不应影响通知用户。

    同样,通知用户不应该影响数据库流。

    我浏览并发现我必须使用执行程序渠道将商店委托给DB'到另一个线程。

    我无法找到执行通道的代码示例。 我只需要基于注释的代码,因为所有其他类都是基于注释的

    我需要什么:ExecutorChannel的代码示例 - 基于注释。

    2中的代码(从文件中读取json并将其发送到DB,自定义业务逻辑)

    @Bean
    public IntegrationFlow readFromJSONFile() {
        return IntegrationFlows
                .from("/path/to/File")
                .transform("Transformer to convert to Bean")
                .wireTap(
                        flow -> flow.handle(msg -> logger
                                .info("Message sent to common channel: " + msg.getPayload())))
                                .channel("Common Channel Name")
                                .get();
        }
    

    4里面的代码:

    @Bean
        public IntegrationFlow sendToDb() {
    
        return IntegrationFlows
                .from("Common Channel Name")
                .handle("DAO Impl to store into DB") // I THINK THE MESSAGE SHOULD BE SENT TO AN EXECUTOR CHANNEL TO PROCESS ON A SEPARATE THREAD
                .get();
        }
    

    5中的代码:

    @Bean
    public IntegrationFlow sendToBusinessLogictoNotifyUser() {
    
        return IntegrationFlows
                .from("Common Channel Name")
                .handle("Business Logic Class name")
                                .get();
        }       
    

    当前行为:如果存在数据库异常,则通知用户也会失败。相反,我希望它能够安静地记录下来。

      

    注意:我只需要注释示例。

1 个答案:

答案 0 :(得分:1)

您真的不需要ExecutorChannel - 只需在发布/订阅频道设置ignoreFailurestrue即可...

/**
 * Specify whether failures for one or more of the handlers should be
 * ignored. By default this is <code>false</code> meaning that an Exception
 * will be thrown whenever a handler fails. To override this and suppress
 * Exceptions, set the value to <code>true</code>.
 * @param ignoreFailures true if failures should be ignored.
 */
public void setIgnoreFailures(boolean ignoreFailures) {

如果要在数据库存储上记录或以其他方式处理异常,可以向执行数据库存储的组件添加ExpressionEvaluatingRequesthandlerAdvice

如果您真的需要ExecutorChannelDSL section of the reference manual has an example

.channel(MessageChannels.executor("executorChannel", this.taskExecutor))