幂等接收器-是否有等效于StreamListener的FilteringMessageListenerAdapter / RecordFilterStrategy

时间:2018-11-26 17:24:45

标签: spring-cloud-stream

我需要使用春季云流kafka绑定器实现幂等监听器。

我们如何包装StreamListener,以便在将消息委派给相应的处理程序之前应用必要的过滤/重复数据删除建议?

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在condition上使用@StreamListener;唯一的问题是,直到条件返回true时才转换有效负载。因此,您要么需要标题中的信息,要么就需要使用本机Kafka反序列化。

@SpringBootApplication
@EnableBinding(Sink.class)
public class So53486162Application {

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

    @StreamListener(target = Sink.INPUT, condition="@filter.shouldProcess(#root)")
    public void listen(String in) {
        System.out.println(in);
    }

    @Bean
    public ApplicationRunner runner(KafkaTemplate<byte[], byte[]> template) {
        return args -> {
            template.send("so53486162", "dontProcessThisOne".getBytes());
            template.send("so53486162", "processThisOne".getBytes());
        };
    }

}

@Component
class Filter {

    public boolean shouldProcess(Message<byte[]> in) {
        String string = new String(in.getPayload());
        System.out.println("Filtering: " + string);
        return !string.equals("dontProcessThisOne");
    }

}

Filtering: dontProcessThisOne
2018-11-26 13:06:56.729  WARN 25874 --- [container-0-C-1] .DispatchingStreamListenerMessageHandler : 
    Cannot find a @StreamListener matching for message with id: null
Filtering: processThisOne
processThisOne