【问题标题】:Spring Integration DSL: how to make single-threaded caching channel?Spring Integration DSL:如何制作单线程缓存通道?
【发布时间】:2017-12-09 05:57:24
【问题描述】:

我有以下流程配置:

@Bean
public IntegrationFlow setupDatabaseFlow() {
    return IntegrationFlows.from(pubSubDatabaseRabbitOutput)
          // WHAT CHANNEL
            .handle((p, h) -> databaseActivator.recordToDatabase(p, h))
            .get();
}

我愿意在“WHAT CHANNEL”中插入一些频道,即

  • 缓存
  • 单线程
  • 在单独的线程中运行

在这里使用的最佳通道规范是什么?

【问题讨论】:

    标签: java spring multithreading spring-integration


    【解决方案1】:

    不确定用例是什么,但可以通过QueueChannelPollingConsumer 以及fixedDelay 策略来实现。

    1. QueueChannel 使用队列缓冲区(持久或内存中)来保存消息,直到它们被使用。用你的话说是 A-la 缓存。

    2. PollingConsumer 使用TaskScheduler 从队列中进行轮询,因此是单独的线程。

    3. 使用fixedDelay 策略可以确保下一个轮询任务在前一个完成之前不会开始。因此是单线程模型。

    如果你不喜欢在轮询任务之间休眠,最终使用事件驱动模型,你可以使用fixedDelay(-1),这样下一个轮询任务不会在前一个轮询任务之后休眠。当前轮询任务确实阻塞线程,直到队列中的值。

    更新

    关于此事的一些代码:

    .channel(c -> c.queue())
    .<Object>handle((p, h) -> databaseActivator.recordToDatabase(p, h), 
                e -> e.poller(p -> p.fixedDelay(0).maxMessagesPerPoll(1)))
    

    【讨论】:

    • 谢谢您,Artem,将该通道置于流中的表达方式是什么? :)
    • 在我的回答中查看更新。
    • 谢谢!虽然我的原因是:java.lang.IllegalArgumentException: period must not be negative at org.springframework.util.Assert.isTrue(Assert.java:92) ~[spring-core-4.3.9.RELEASE.jar:4.3. 9.发布]
    • 哦!对不起。对,那一定是0-1 我的意思是receiveTimeout()
    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2019-12-27
    相关资源
    最近更新 更多