I am using KafkaConsumer 0.10 Java api. I want to consume from a specific partition and specific offset. I looked up and found that there is a seek method but its throwing an exception. Anyone had a similar use case or solution ?
Code:
KafkaConsumer<String, byte[]> consumer = new KafkaConsumer<>(consumerProps);
consumer.seek(new TopicPartition("mytopic", 1), 4);
Exception
java.lang.IllegalStateException: No current assignment for partition mytopic-1
at org.apache.kafka.clients.consumer.internals.SubscriptionState.assignedState(SubscriptionState.java:251)
at org.apache.kafka.clients.consumer.internals.SubscriptionState.seek(SubscriptionState.java:276)
at org.apache.kafka.clients.consumer.KafkaConsumer.seek(KafkaConsumer.java:1135)
at xx.xxx.xxx.Test.main(Test.java:182)
Before you can seek()
you first need to subscribe()
to a topic or assign()
partition of a topic to the consumer. Also keep in mind, that subscribe()
and assign()
are lazy -- thus, you also need to do a "dummy call" to poll()
before you can use seek()
.
Note: as of Kafka 2.0, the new
poll(Duration timeout)
is async and it's not guaranteed that you have a complete assignment whenpoll
returns. Thus, you might need to check your assignment before usingseek()
and alsopoll
again to refresh the assignment. (Cf. KIP-266 for details)
If you use subscribe()
, you use group management: thus, you can start multiple consumers using the same group.id
and all partitions of the topic will be assigned evenly over all consumers within the group automatically (each partition will get assigned to a single consumer in the group).
If you want to read specific partitions, you need to use manual assignment via assign()
. This allows you to do any assignment you want.
Btw: KafkaConsumer
has a very long an detailed class JavaDoc including examples. It's worth to read it.