Search code examples
spring-integrationspring-integration-dslspring-retry

some problem with my Spring Integration flow


I'm using spring boot 2.3.0 version with Spring Integration 5.3.0 and somehow I'm not able to get the below code working.The app starts up, no errors but when control comes to the nextChannelFlow() method, nothing is happening or printed. Can someone please tell me what I'm missing. Any help is appreciated. Thanks.

@Configuration
@EnableIntegration
@EnableRetry
    Class MyIntegrationFlow
    .
    .

    @Bean
    public IntegrationFlow upstreamFlow(){
    return IntegrationFlows.from(someChannel())
    .handle(srcDirectory(), "receive")                               
    .filter(onlyCsvfiles())                    
    .handle(targetDirectory())// returns a FileWritingMessageHandler
    .channel(nextChannel())     //this is downstream                            
    .get();
    }

@Bean
    public MessageHandler targetDirectory() throws IOException {
        FileWritingMessageHandler handler = new FileWritingMessageHandler(targetFolder.getFile());
        handler.setExpectReply(false);
        return handler;
    }   

    @Bean
    public DirectChannel nextChannel(){
    return new DirectChannel();
    }

    @Bean
    public IntegrationFlow nextChannelFlow() {
//the below is that last line that gets printed in console. After this line, nothing gets printed and I see no errors too.
        System.out.println("inside nextChannel method ");

        return IntegrationFlows.from (nextChannel()) 
                .handle((GenericHandler<String>) (payload, headers) -> {
                    System.out.println("inside handle 1");
                    callSomeMethod();
                    System.out.println("inside handle 2");
                    return payload;                 
                })
                .log(Level.INFO, new LiteralExpression("came out of handle.")) //was trying to see if I can see any logs/errors at this line , but nothing displayed.
                .channel(checkXFBFlowChannel())//control doesn't go to this channel as well.
                .get();
    }   

    @Retryable(value={IllegalStateException.class}, maxAttempts=5,backoff=@Backoff(delay=3000))
    public void callSomeMethod() {
        System.out.println("simulate sample retry method");        
        throw new IllegalStateException() ;                  
    }

Solution

  • .handle(returns MessageHandler)
    

    If it is a plain MessageHandler, then indeed nothing going to happen after it. It returns nothing (void), so no reply to go on through the flow after that. Consider to use a handle(GenericHandler) instead.