我正在尝试根据应用程序中消息处理的状态来控制对kafka主题的偏移提交。如果消息成功,则可以提交偏移量。为此,我尝试在方法中获取标头,以便可以手动确认消息
spring:
cloud:
stream:
default:
contentType: application/json
default-binder: binder1-kafka
bindings:
myChannel:
binder: binder1-kafka
destination: my_topic
content-type: text/plain
consumer:
autoCommitOffset: false
outChannel:
binder: binder2-kafka
destination: my_topic
content-type: text/plain
consumer:
autoCommitOffset: false
binders:
#Connection config to different clusters
binder1-kafka:
type: kafka
defaultCandidate: true
environment:
spring:
cloud:
stream:
kafka:
binder:
brokers: some-url1:9092
binder2-kafka:
type: kafka
defaultCandidate: false
environment:
spring:
cloud:
stream:
kafka:
binder:
brokers: some-url2:9092
但是在将侦听器用作
时@StreamListener(target = IBrokerChannel.myChannel )
public void handlePayload(@Payload MyPayload payload, @Headers Map<String, Object> headers) {
Acknowledgment acknowledgment= (Acknowledgment) headers.get("kafka_acknowledgment"); // acknowledgment object is always null.
acknowledgment.acknowledge();
}
acknowledgment
始终为null
。我正在使用kafka生产者cli将消息发送到主题。 spring-boot
的版本为1.5.10.RELEASE
答案 0 :(得分:2)
您在配置属性定义中缺少kafka
分支。一定是这样的:
spring:
cloud:
stream:
default-binder: kafka
kafka:
bindings:
myChannel:
consumer:
autoCommitOffset: false
答案 1 :(得分:1)
对我来说很好...
@SpringBootApplication
@EnableBinding(Sink.class)
public class So51159949Application {
public static void main(String[] args) {
SpringApplication.run(So51159949Application.class, args);
}
@Bean
public ApplicationRunner runner(KafkaTemplate<byte[], byte[]> template) {
return args -> {
template.send("so51159949", "foo".getBytes());
};
}
@StreamListener(Sink.INPUT)
public void in(String in, @Headers MessageHeaders headers) {
System.out.println(in);
System.out.println(headers);
Acknowledgment ack = headers.get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
ack.acknowledge();
}
}
和
spring:
cloud:
stream:
bindings:
input:
group: so51159949
destination: so51159949
kafka:
bindings:
input:
consumer:
auto-commit-offset: false
和
foo
{kafka_offset=2, kafka_consumer=org.apache.kafka.clients.consumer.KafkaConsumer@4ad39b5f, deliveryAttempt=1, kafka_timestampType=CREATE_TIME, kafka_receivedMessageKey=null, kafka_receivedPartitionId=0, kafka_receivedTopic=so51159949, kafka_receivedTimestamp=1530643662028, kafka_acknowledgment=Acknowledgment for ConsumerRecord(topic = so51159949, partition = 0, offset = 2, CreateTime = 1530643662028, serialized key size = -1, serialized value size = 3, headers = RecordHeaders(headers = [], isReadOnly = false), key = null, value = [B@700c9aa9), contentType=application/json}