【问题标题】:How to add date condition in @StreamListener如何在@StreamListener 中添加日期条件
【发布时间】:2019-06-26 05:51:45
【问题描述】:

假设,我能够通过 Kafka 或 RabbitMQ 发送消息并使用 @StreamListener 使用它们。

Binders 是为 content-type = 'application/json' 配置的,所以我想可以在有效负载上添加条件。

我的要求是仅当字段的日期早于 now() 时才获取元素。当此条件为真时,将消耗所有其他元素。

例如,我希望是这样的:

@StreamListener(value = INPUT, condition = "data.startDate > now()")
public void onMessage(@Payload Data data) { 
    // ...
}

第一个问题是我收到错误:EL1008E: 在“byte[]”类型的对象上找不到属性或字段“startDate” - 可能不是公共的或无效的?

【问题讨论】:

    标签: spring-boot spring-cloud spring-cloud-stream


    【解决方案1】:

    这是正确的,因为有效负载没有转换为任何类型,而是以其原始形式存在,即byte[]。请参阅this section 特别是“条件上下文中的内容类型协商” 小节。

    但是,对于您的情况,您可以简单地将表达式修改为 new String(payload)....,知道在转换之前它始终是 byte[]

    【讨论】:

    • 谢谢奥列格。该部分没有详细说明如何从有效负载中写入条件。为什么要解析 byte[] mysefl ?我可以使用 JSOn 解析为 String,然后解析为 Object,但这似乎有点麻烦!此外,由于我提到的错误,即使使用字符串条件,一个简单的示例也不起作用。我添加了示例以进行说明。
    • 好吧,那是因为我们不会自动假设用户总是想要一个字符串,所以直到我们知道它是原始类型,因此byte[]。此外,您的示例实际上在我发布的文档中进行了解释。在我们知道我们将要调用这个处理程序之前,我们不可能转换为Data 对象。也就是说,我确实觉得可能需要进行更多澄清,因此会尝试更新文档
    • 确实,你是对的。这就是我刚刚在文档中读到的内容。再次感谢。
    【解决方案2】:

    我认为答案在文档中并且符合 Oleg 的答案

    那是因为你正在测试的东西在 你期望的状态。那是因为消息的有效载荷不是 尚未从有线格式 (byte[]) 转换为所需的类型。在 换句话说,它还没有经过类型转换过程 在第 10 章,内容类型协商中进行了描述。

    因此,除非您使用评估原始数据的 SPeL 表达式(例如 例如,字节数组中第一个字节的值),使用消息 基于标头的表达式(例如条件 = "headers['type']=='dog'")。

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 2015-03-23
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多