Browse Source

Race condition fix

pull/2714/head
Andrii Shvaika 7 years ago
parent
commit
09d8823205
  1. 26
      common/queue/src/main/java/org/thingsboard/server/queue/kafka/TbKafkaConsumerTemplate.java
  2. 2
      docker/docker-compose.yml

26
common/queue/src/main/java/org/thingsboard/server/queue/kafka/TbKafkaConsumerTemplate.java

@ -81,14 +81,24 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueCon
@Override @Override
public void subscribe() { public void subscribe() {
partitions = Collections.singleton(new TopicPartitionInfo(topic, null, null, true)); consumerLock.lock();
subscribed = false; try {
partitions = Collections.singleton(new TopicPartitionInfo(topic, null, null, true));
subscribed = false;
} finally {
consumerLock.unlock();
}
} }
@Override @Override
public void subscribe(Set<TopicPartitionInfo> partitions) { public void subscribe(Set<TopicPartitionInfo> partitions) {
this.partitions = partitions; consumerLock.lock();
subscribed = false; try {
this.partitions = partitions;
subscribed = false;
} finally {
consumerLock.unlock();
}
} }
@Override @Override
@ -100,13 +110,11 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueCon
log.debug("Failed to await subscription", e); log.debug("Failed to await subscription", e);
} }
} else { } else {
consumerLock.lock();
try { try {
consumerLock.lock();
if (!subscribed) { if (!subscribed) {
List<String> topicNames = partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.toList()); List<String> topicNames = partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.toList());
topicNames.forEach(admin::createTopicIfNotExists); topicNames.forEach(admin::createTopicIfNotExists);
consumer.unsubscribe();
consumer.subscribe(topicNames); consumer.subscribe(topicNames);
subscribed = true; subscribed = true;
} }
@ -132,8 +140,8 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueCon
@Override @Override
public void commit() { public void commit() {
consumerLock.lock();
try { try {
consumerLock.lock();
consumer.commitAsync(); consumer.commitAsync();
} finally { } finally {
consumerLock.unlock(); consumerLock.unlock();
@ -142,8 +150,8 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueCon
@Override @Override
public void unsubscribe() { public void unsubscribe() {
consumerLock.lock();
try { try {
consumerLock.lock();
if (consumer != null) { if (consumer != null) {
consumer.unsubscribe(); consumer.unsubscribe();
consumer.close(); consumer.close();

2
docker/docker-compose.yml

@ -28,7 +28,7 @@ services:
ZOO_SERVERS: server.1=zookeeper:2888:3888;zookeeper:2181 ZOO_SERVERS: server.1=zookeeper:2888:3888;zookeeper:2181
kafka: kafka:
restart: always restart: always
image: "wurstmeister/kafka:2.12-2.2.1" image: "wurstmeister/kafka:2.12-2.3.0"
ports: ports:
- "9092:9092" - "9092:9092"
env_file: env_file:

Loading…
Cancel
Save