refactored

This commit is contained in:
YevhenBondarenko 2020-05-02 13:34:11 +03:00
parent eedb383845
commit 06c3caf082
5 changed files with 52 additions and 26 deletions

View File

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.queue.pubsub; package org.thingsboard.server.queue.pubsub;
import com.google.api.gax.rpc.AlreadyExistsException;
import com.google.cloud.pubsub.v1.SubscriptionAdminClient; import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.cloud.pubsub.v1.SubscriptionAdminSettings; import com.google.cloud.pubsub.v1.SubscriptionAdminSettings;
import com.google.cloud.pubsub.v1.TopicAdminClient; import com.google.cloud.pubsub.v1.TopicAdminClient;
@ -24,9 +25,9 @@ import com.google.pubsub.v1.ListSubscriptionsRequest;
import com.google.pubsub.v1.ListTopicsRequest; import com.google.pubsub.v1.ListTopicsRequest;
import com.google.pubsub.v1.ProjectName; import com.google.pubsub.v1.ProjectName;
import com.google.pubsub.v1.ProjectSubscriptionName; import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.Subscription; import com.google.pubsub.v1.Subscription;
import com.google.pubsub.v1.Topic; import com.google.pubsub.v1.Topic;
import com.google.pubsub.v1.TopicName;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.queue.TbQueueAdmin; import org.thingsboard.server.queue.TbQueueAdmin;
@ -103,7 +104,10 @@ public class TbPubSubAdmin implements TbQueueAdmin {
@Override @Override
public void createTopicIfNotExists(String partition) { public void createTopicIfNotExists(String partition) {
ProjectTopicName topicName = ProjectTopicName.of(pubSubSettings.getProjectId(), partition); TopicName topicName = TopicName.newBuilder()
.setTopic(partition)
.setProject(pubSubSettings.getProjectId())
.build();
if (topicSet.contains(topicName.toString())) { if (topicSet.contains(topicName.toString())) {
createSubscriptionIfNotExists(partition, topicName); createSubscriptionIfNotExists(partition, topicName);
@ -121,13 +125,18 @@ public class TbPubSubAdmin implements TbQueueAdmin {
} }
} }
try {
topicAdminClient.createTopic(topicName); topicAdminClient.createTopic(topicName);
topicSet.add(topicName.toString());
log.info("Created new topic: [{}]", topicName.toString()); log.info("Created new topic: [{}]", topicName.toString());
} catch (AlreadyExistsException e) {
log.info("[{}] Topic already exist.", topicName.toString());
} finally {
topicSet.add(topicName.toString());
}
createSubscriptionIfNotExists(partition, topicName); createSubscriptionIfNotExists(partition, topicName);
} }
private void createSubscriptionIfNotExists(String partition, ProjectTopicName topicName) { private void createSubscriptionIfNotExists(String partition, TopicName topicName) {
ProjectSubscriptionName subscriptionName = ProjectSubscriptionName subscriptionName =
ProjectSubscriptionName.of(pubSubSettings.getProjectId(), partition); ProjectSubscriptionName.of(pubSubSettings.getProjectId(), partition);
@ -153,9 +162,14 @@ public class TbPubSubAdmin implements TbQueueAdmin {
setAckDeadline(subscriptionBuilder); setAckDeadline(subscriptionBuilder);
setMessageRetention(subscriptionBuilder); setMessageRetention(subscriptionBuilder);
try {
subscriptionAdminClient.createSubscription(subscriptionBuilder.build()); subscriptionAdminClient.createSubscription(subscriptionBuilder.build());
subscriptionSet.add(subscriptionName.toString());
log.info("Created new subscription: [{}]", subscriptionName.toString()); log.info("Created new subscription: [{}]", subscriptionName.toString());
} catch (AlreadyExistsException e) {
log.info("[{}] Subscription already exist.", subscriptionName.toString());
} finally {
subscriptionSet.add(subscriptionName.toString());
}
} }
private void setAckDeadline(Subscription.Builder builder) { private void setAckDeadline(Subscription.Builder builder) {

View File

@ -134,6 +134,11 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo
if (!subscribed) { if (!subscribed) {
subscriptionNames = partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.toSet()); subscriptionNames = partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.toSet());
subscriptionNames.forEach(admin::createTopicIfNotExists); subscriptionNames.forEach(admin::createTopicIfNotExists);
if (consumerExecutor != null) {
consumerExecutor.shutdown();
}
consumerExecutor = Executors.newFixedThreadPool(subscriptionNames.size()); consumerExecutor = Executors.newFixedThreadPool(subscriptionNames.size());
messagesPerTopic = pubSubSettings.getMaxMessages() / subscriptionNames.size(); messagesPerTopic = pubSubSettings.getMaxMessages() / subscriptionNames.size();
subscribed = true; subscribed = true;

View File

@ -124,8 +124,8 @@ public class TbPubSubProducerTemplate<T extends TbQueueMsg> implements TbQueuePr
publisherMap.put(topic, publisher); publisherMap.put(topic, publisher);
return publisher; return publisher;
} catch (IOException e) { } catch (IOException e) {
log.error("Failed to create topic [{}].", topic, e); log.error("Failed to create Publisher for the topic [{}].", topic, e);
throw new RuntimeException("Failed to create topic.", e); throw new RuntimeException("Failed to create Publisher for the topic.", e);
} }
} }

View File

@ -59,13 +59,11 @@ function PubSubProducer() {
const topicList = await pubSubClient.getTopics(); const topicList = await pubSubClient.getTopics();
if (topicList) {
if (topicList) { if (topicList) {
topicList[0].forEach(topic => { topicList[0].forEach(topic => {
topics.push(getName(topic.name)); topics.push(getName(topic.name));
}); });
} }
}
const subscriptionList = await pubSubClient.getSubscriptions(); const subscriptionList = await pubSubClient.getSubscriptions();
@ -100,23 +98,32 @@ function PubSubProducer() {
async function createTopic(topic) { async function createTopic(topic) {
if (!topics.includes(topic)) { if (!topics.includes(topic)) {
try {
await pubSubClient.createTopic(topic); await pubSubClient.createTopic(topic);
topics.push(topic);
logger.info('Created new Pub/Sub topic: %s', topic); logger.info('Created new Pub/Sub topic: %s', topic);
} catch (e) {
logger.info('Pub/Sub topic already exists');
}
topics.push(topic);
} }
await createSubscription(topic) await createSubscription(topic)
} }
async function createSubscription(topic) { async function createSubscription(topic) {
if (!subscriptions.includes(topic)) { if (!subscriptions.includes(topic)) {
try {
await pubSubClient.createSubscription(topic, topic, { await pubSubClient.createSubscription(topic, topic, {
topic: topic, topic: topic,
subscription: topic, subscription: topic,
ackDeadlineSeconds: queueProps['ackDeadlineInSec'], ackDeadlineSeconds: queueProps['ackDeadlineInSec'],
messageRetentionDuration: {seconds: queueProps['messageRetentionInSec']} messageRetentionDuration: {seconds: queueProps['messageRetentionInSec']}
}); });
subscriptions.push(topic);
logger.info('Created new Pub/Sub subscription: %s', topic); logger.info('Created new Pub/Sub subscription: %s', topic);
} catch (e) {
logger.info('Pub/Sub subscription already exists.');
}
subscriptions.push(topic);
} }
} }

View File

@ -95,7 +95,7 @@
<snakeyaml.version>1.25</snakeyaml.version> <snakeyaml.version>1.25</snakeyaml.version>
<struts.version>1.3.10</struts.version> <struts.version>1.3.10</struts.version>
<amazonaws.sqs.version>1.11.747</amazonaws.sqs.version> <amazonaws.sqs.version>1.11.747</amazonaws.sqs.version>
<pubsub.client.version>1.84.0</pubsub.client.version> <pubsub.client.version>1.105.0</pubsub.client.version>
<azure-servicebus.version>3.2.0</azure-servicebus.version> <azure-servicebus.version>3.2.0</azure-servicebus.version>
<passay.version>1.5.0</passay.version> <passay.version>1.5.0</passay.version>
<ua-parser.version>1.4.3</ua-parser.version> <ua-parser.version>1.4.3</ua-parser.version>