@Override public void onSubscriptionAssigned(SubscriptionName subscriptionName) { Subscription subscription = subscriptionsCache.getSubscription(subscriptionName); logger.info("Scheduling assignment consumer for {}", subscription.getQualifiedName()); assignmentExecutor.execute(() -> { logger.info("Assigning consumer for {}", subscription.getQualifiedName()); supervisor.assignConsumerForSubscription(subscription); logger.info("Consumer assigned for {}", subscription.getQualifiedName()); }); }
@Override public void onSubscriptionAssigned(SubscriptionName subscriptionName) { Subscription subscription = subscriptionsCache.getSubscription(subscriptionName); logger.info("Scheduling assignment consumer for {}", subscription.getQualifiedName()); assignmentExecutor.execute(() -> { logger.info("Assigning consumer for {}", subscription.getQualifiedName()); supervisor.assignConsumerForSubscription(subscription); logger.info("Consumer assigned for {}", subscription.getQualifiedName()); }); }
@Override public void tearDown() { consuming = false; if (receiver != null) { receiver.stop(); } else { logger.info("No batch receiver to stop [subscription={}].", subscription.getQualifiedName()); } }
public UnsupportedContentTypeException(Subscription subscription) { super(String.format( "Unsupported content type %s for subscription %s", subscription.getContentType(), subscription.getQualifiedName() )); }
private HttpClient getHttpClient(Subscription subscription) { if (subscription.isHttp2Enabled()) { return tryToGetHttp2Client(subscription); } else { logger.info("Using http/1.1 for {}.", subscription.getQualifiedName()); return httpClient; } }
@Override public void initialize() { logger.info("Consumer: preparing message receiver for subscription {}", subscription.getQualifiedName()); initializeMessageReceiver(); sender.initialize(); rateLimiter.initialize(); consumerAuthorizationHandler.createSubscriptionHandler(subscription.getQualifiedName()); }
@Override public void handleSuccess(Message message, Subscription subscription, MessageSendingResult result) { if (shouldHandle(subscription)) { getSubscriptionHandler(subscription.getQualifiedName()).ifPresent(OAuthSubscriptionHandler::handleSuccess); } }
@Override public void handleFailed(Message message, Subscription subscription, MessageSendingResult result) { if (shouldHandle(subscription)) { getSubscriptionHandler(subscription.getQualifiedName()).ifPresent(h -> h.handleFailed(subscription, result)); } }
@Override public void updateSubscription(Subscription newSubscription) { logger.info("Updating consumer for subscription {}", subscription.getQualifiedName()); inflightSemaphore.setMaxPermits(calculateInflightSize(newSubscription)); rateLimiter.updateSubscription(newSubscription); sender.updateSubscription(newSubscription); messageReceiver.update(newSubscription); consumerAuthorizationHandler.updateSubscription(newSubscription.getQualifiedName()); this.subscription = newSubscription; }
@Override public void assignConsumerForSubscription(Subscription subscription) { try { Signal start = Signal.of(Signal.SignalType.START, subscription.getQualifiedName(), subscription); backgroundProcess.accept(start); if (subscription.getState() == PENDING) { subscriptionRepository.updateSubscriptionState(subscription.getTopicName(), subscription.getName(), ACTIVE); } } catch (RuntimeException e) { logger.error("Error during assigning subscription {} to consumer", subscription.getQualifiedName(), e); } }
public void handleFailed(Subscription subscription, MessageSendingResult result) { SubscriptionName subscriptionName = subscription.getQualifiedName(); if (shouldTryRefreshingToken(subscriptionName, result)) { if (rateLimiter.tryAcquire()) { logger.info("Refreshing token for subscription {}", subscriptionName); rateLimiter.reduceRate(); executorService.schedule(() -> accessTokens.refreshToken(subscriptionName), 0, TimeUnit.MILLISECONDS); } } }
@Override public void onSubscriptionChanged(Subscription subscription) { if (workTracker.isAssignedTo(subscription.getQualifiedName(), consumerId())) { logger.info("Updating subscription {}", subscription.getName()); supervisor.updateSubscription(subscription); } }
@Override public void start() { for(String groupName : groupRepository.listGroupNames()) { for(String topicName : topicRepository.listTopicNames(groupName)) { for(Subscription subscription : subscriptionRepository.listSubscriptions(new TopicName(groupName, topicName))) { subscriptions.put(subscription.getQualifiedName(), subscription); } } } } }
@Override public void updateSubscription(Subscription modifiedSubscription) { ensureSubscriptionExists(modifiedSubscription.getTopicName(), modifiedSubscription.getName()); logger.info("Updating subscription {}", modifiedSubscription.getQualifiedName()); overwrite(paths.subscriptionPath(modifiedSubscription), modifiedSubscription); }
/** * Try to keep shutdown order the same as initialization so nothing will left to clean up when error occurs during initialization */ @Override public void tearDown() { messageReceiver.stop(); sender.shutdown(); rateLimiter.shutdown(); consumerAuthorizationHandler.removeSubscriptionHandler(subscription.getQualifiedName()); }
@Test public void shouldReturnAllAssignments() { // given Subscription s1 = forceAssignment(anySubscription()); Subscription s2 = forceAssignment(anySubscription()); // when SubscriptionAssignmentView assignments = workTracker.getAssignments(); // then assertThat(assignments.getSubscriptions()).containsOnly(s1.getQualifiedName(), s2.getQualifiedName()); assertThat(workTracker.isAssignedTo(s1.getQualifiedName(), supervisorId)).isTrue(); assertThat(workTracker.isAssignedTo(s2.getQualifiedName(), supervisorId)).isTrue(); }
public static SubscriptionPartitionOffset subscriptionPartitionOffset(PartitionOffset partitionOffset, Subscription subscription) { return new SubscriptionPartitionOffset( new SubscriptionPartition( partitionOffset.getTopic(), subscription.getQualifiedName(), partitionOffset.getPartition() ), partitionOffset.getOffset() ); }
@Test public void shouldDropAssignmentAndEmptySubscriptionNode() { // given Subscription sub = forceAssignment(anySubscription()); // when workTracker.dropAssignment(sub); wait.untilZookeeperPathNotExists(basePath, sub.getQualifiedName().toString()); // then assertThat(workTracker.isAssignedTo(sub.getQualifiedName(), supervisorId)).isFalse(); }
private Subscription dropAssignment(Subscription sub) { workTracker.dropAssignment(sub); wait.untilZookeeperPathNotExists(basePath, sub.getQualifiedName().toString(), supervisorId); return sub; } }
@Test public void shouldApplyAssignmentChangesCreatingNewNodesInZookeeper() { // given Subscription s1 = anySubscription(); SubscriptionAssignmentView view = stateWithSingleAssignment(s1); // when workTracker.apply(subscriptionAssignmentRegistry.createSnapshot(), view); // then wait.untilZookeeperPathIsCreated(basePath, s1.getQualifiedName().toString(), supervisorId); }