我需要使用春季云流kafka绑定器实现幂等监听器。
我们如何包装StreamListener,以便在将消息委派给相应的处理程序之前应用必要的过滤/重复数据删除建议?
谢谢。
答案 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