【问题标题】:spring-xd custom redis-sinkspring-xd 自定义 redis-sink
【发布时间】:2016-03-20 16:39:01
【问题描述】:

所以我认为我需要扩展 spring-xd 中提供的当前 redis-sink 以写入 redis Capped 列表,而不是创建一个新列表,但不幸的是它似乎变得更糟,因为我将不得不更深入地了解 spring - 集成并进一步回到 spring-data (spring-data-redis),因为整个 redis-sink 似乎基于 redis 上的通用 pub/sub 抽象 - 或者是否有某种类型的处理程序可以在消息后定义到达通道处理程序?

为了在我推送数据 redis 时获得“封顶列表的效果”,我需要执行 redis “推送”,然后执行此处所述的“rtrim” - http://redis.io/topics/data-types-intro。如果我要构建一个自定义的 spring-integration / spring-data 模块。我相信我在这里看到了对“ltrim”但不是“rtrim”操作的支持http://docs.spring.io/spring-data/redis/docs/1.7.0.RC1/api/

任何关于如何/从哪里开始或更简单方法的建议将不胜感激。

【问题讨论】:

    标签: spring-integration spring-xd spring-data-redis


    【解决方案1】:

    其实连Redis都没有这样的RTRIMcommand。我们不需要它,因为我们使用 LTRIM 的负索引达到了相同的行为:

    start 和 end 也可以是负数,表示距列表末尾的偏移量,其中 -1 是列表的最后一个元素,-2 是倒数第二个元素,依此类推。

    我认为你应该使用<redis:store-outbound-channel-adapter> 并在其配置中添加类似这样的内容:

    <int-redis:request-handler-advice-chain>
        <beans:bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
            <beans:property name="onSuccessExpression" value="#redisTemplate.boundListOps(${keyExpression}).trim(1, -1)"/>
        </beans:bean>
    </int-redis:request-handler-advice-chain>
    

    删除 Redis 列表中最旧的元素。

    【讨论】:

    • 对不起,你是对的,我把我的 Ls 和 Rs 弄混了。让我试试你的建议。这正是我想要避免重写自定义出站通道适配器的类型。我一直忘记如何/何时使用 SPEL 表达式。我会按照这里的说明来部署它github.com/spring-projects/spring-xd-samples/tree/master/…
    • 所以当我查看RedisQueueOutboundChannelAdapter 的源代码时,我看到默认的redis 操作是“左推”
    • 然后呢?这是完全不同的故事。该组件完全适用于类似队列的行为。虽然我们也可以在那里做同样的ltrim,但我不会从架构的角度混合关注点。
    • lpush 集合 1 lpush 集合 2 lpush 集合 3 lpush 集合 4 lpush 集合 5 lrange 集合 0 -1 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 我想删除最旧的元素,在这种情况下是 "1" 或第五个元素,而不是最新的元素。 ltrim 命令的工作方式似乎很困难。我绝对可以使用ltrim collection 0 -2 删除最旧的元素,但这不允许我构建保持集合的最大任意大小。
    • 所以我认为我真的需要指定 RedisQueueOutboundChannelAdapter 使用 rpush 命令而不是 lpush,然后使用 ltrim 命令,这样 redisTemplate 拼写看起来像 #redisTemplate.boundListOps(${keyExpression})。 trim(0, 5) 保留最新的 5 个元素。正确的?如果是这样,我如何更改 RedisQueueOutboundChannelAdapter 中的默认 leftPush 标志并覆盖提供的 redis:sink 以使用它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多