Spring-Integration:QueueChannel

时间:2017-10-27 11:05:34

标签: java asynchronous spring-integration gateway

简短摘要:

我想将消息发送到队列并让多个线程处理此消息。应用程序应该只是将消息异步发送到网关,但是当队列已满时应该被阻止。此外,我想将交付传递给Queue多线程。我的问题是我的队列永远不会阻塞并占用更多的消息,然后它的实际大小是

1 个答案:

答案 0 :(得分:2)

我不确定你的意思是“不阻止”。这对我来说很好......

@SpringBootApplication
public class So46973604Application {

    private final Logger LOGGER = LoggerFactory.getLogger(So46973604Application.class);

    public static void main(String[] args) {
        SpringApplication.run(So46973604Application.class, args).close();
    }

    @Bean
    ApplicationRunner runner(Gate gate) {
        return args -> {
            for (int i = 0; i < 20; i++) {
                gate.send("foo");
                LOGGER.info("Sent " + i);
            }
        };
    }

    @Bean
    QueueChannel channel() {
        return new QueueChannel(10);
    }

    @ServiceActivator(inputChannel = "channel", poller = @Poller(fixedDelay = "0"))
    public void handle(String in) throws InterruptedException {
        Thread.sleep(1_000);
    }

    @MessagingGateway(defaultRequestChannel = "channel")
    public interface Gate {

        void send(String out);

    }

}

前10个是立即发送的,然后是每秒一个,因为阻塞等待队列空间。

如果要阻止来电者,为什么觉得需要异步网关?