1
votes

I am trying to set up an integration flow where an input channel is a queue that would act as a non-blocking queue. What I see now is that if I trigger a message processing from a Spring MVC Controller, if a message processing takes time, controller won't return and will wait for message handler (Service Activator) to complete.

Here's an integration configuration

@Bean(name = "createIssue.input")
MessageChannel queueInput() {
    return MessageChannels.queue(10)
            .get();
}

@Bean(name = PollerMetadata.DEFAULT_POLLER)
PollerMetadata poller() {
    return Pollers.fixedRate(100)
            .maxMessagesPerPoll(1)
            .get();
}

@Bean
IntegrationFlow createIssue() {
    return IntegrationFlows.from(queueInput())
            .split()
            .transform(mytransformer, "convert")
            .handle(myservice, "createIssue")
            .get();
}

myservice and mytransformer are just regular Spring beans.

I have a Spring MVC REST Controller that writes to the createIssue.input queue using a gateway in one of its GET handlers.

If I set a breapoint in myservice.createIssue() method, I can see that controller does not return from it's method, so an external service that triggered controller has to wait for my service to complete. What I am trying to achieve is to have an async processing queue where a gateway would just write a message into a queue and return immediately. How can I achieve that?

1

1 Answers

1
votes

You should use void Gateway there, which really acts as a "just send" component:

public interface Cafe {

    @Gateway(requestChannel="orders")
    void placeOrder(Order order);

}

And your .handle() in the end of IntegrationFlow should replies to the nullChannel or just doesn't return anything from the createIssue() method.