当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud@StreamListener条件已弃用替代方案是什么

丁恩
2023-03-14

我们有多个应用程序消费者收听同一个Kafka主题,生产者在向主题发送消息时设置消息头,以便特定实例可以评估消息头并处理消息。eg公司

@StreamListener(target=ITestSink.CHANNEL_NAME,condition="headers['franchiseName'] == 'sydney'")
public void fullfillOrder(@Payload TestObj message) {
    log.info("sydney order request received message is {}",message.getName());
}

在Spring Cloud Stream 3.0.0中,不推荐使用@StreamListener,我在函数中找不到与condition属性等效的属性。

有什么建议吗?

共有1个答案

晁璞
2023-03-14

虽然我也找不到功能方法的等效方法,但我有一个建议。

StreamListener注释条件并不能阻止应用程序在将消息传递给侦听器之前必须使用消息、读取消息头并过滤掉特定记录这一事实(fullfillOrder())。因此,可以安全地假设您正在使用与主题相关的所有消息(由Spring Cloud在后台为我们实现的事件接收器),但侦听器仅在header==sydney时执行。

如果有一种方法可以配置Spring Cloud使用的事件接收器(在命中侦听器之前丢弃消息),我建议对此进行研究。如果没有,将在进行任何处理之前过滤掉任何消息(非悉尼消息)。如果您熟悉Spring Cloud的功能性方法,可以这样看:

@Bean
public Consumer<Message<TestObj>> fulfillOrder() {
    return msg -> {
        // to get header - msg.getHeaders().get(key, valueType);
        // filter out bad messages
    }
}

@Bean
public Consumer<ConsumerRecord<?, TestObj>> fulfillOrder() {
    return msg -> {
        // msg.headers().lastHeader("franchiseName").value() -> filter em out
    }
}

其他:^my代码假设您正在通过spring-cloud-stream-binder-kafka将kafka客户端API与Spring Cloud stream集成。根据列出的标签,我将注意到Spring Cloud Stream有两个版本的Kafka绑定器-一个用于kafka客户端库,一个用于kafka流库。

在不考虑Spring云/框架的情况下,kafka streams中的高级别DSL不允许您访问标头,但低级别处理器API允许您访问标头。从这个示例来看,您似乎在利用客户端绑定器,而不是Spring-Cloud-Stream绑定器kafka streams。我还没有看到使用低级处理器API的spring cloud stream kafka streams binder的实现,所以我不知道这是否是目的所在。

 类似资料:
  • 有人知道是什么取代了Amazon DynamoDBClient吗?在留档里什么都找不到 包-com。亚马逊。服务。发电机BV2

  • 我正在将java应用程序从SpringBoot1.5迁移到SpringBoot2.2.3,这涉及到将Hibernate/Envers升级到5.4.10。最终的 现有代码调用AuditReader#getCurrentRevision(类revisionEntityClass,boolean persist),该类已被弃用,JavaDocs状态为使用RevisionListener,但这与我们需要获

  • 问题内容: 我们有一个类,其中包含应用程序的配置信息。它曾经是一个单身人士。经过一些体系结构审查后,我们被告知删除单例。我们确实看到了在单元测试中不使用单例的一些好处,因为我们可以一次测试所有不同的配置。 没有单例,我们必须在代码中的所有地方传递实例。变得太乱了,所以我们写了一个单例包装器。现在我们将相同的代码移植到PHP和.NET,我想知道是否有更好的模式可用于配置对象。 问题答案: 在谷歌测试

  • 问题内容: 的实例(根据手册到以前的版本)必须通过创建,现在已不适用。而且,如果我尝试直接实例化,则需要传递一个实例,该实例可以通过对进行简单的转换来获得,但也会被标记。我只能假设现在仅需要此功能,并且无法让嵌入式安装与服务器一起运行。我对吗?我能解决这个问题吗? 问题答案: 您可以覆盖并进行出价。

  • 我正在努力翻阅这本生锈的书。在“字符串”一章中,许多示例使用了_string(),我的编译器版本(rustc 1.0.0-dev)给出了以下警告 代码: 我从这个问题中了解到,这是因为API可能会更改,但我想知道如果我想转换字符串片段(str),我应该使用什么来代替它

  • 我最近发现是不推荐的。我们该怎么处理? 有什么替代方案吗?