use of io.zeebe.client.event.impl.TopicSubscriberGroup in project zeebe by zeebe-io.
the class PollableTopicSubscriptionTest method shouldPollEventsWhileModifyingSubscribers.
@Test
public void shouldPollEventsWhileModifyingSubscribers() throws InterruptedException {
// given
final int subscriberKey = 456;
broker.stubTopicSubscriptionApi(subscriberKey);
final ControllableHandler handler = new ControllableHandler();
final TopicSubscriberGroup subscription = (TopicSubscriberGroup) client.topics().newPollableSubscription(clientRule.getDefaultTopicName()).name("hohoho").open();
final RemoteAddress clientAddress = broker.getReceivedCommandRequests().get(0).getSource();
broker.pushTopicEvent(clientAddress, subscriberKey, 1, 1);
// event is received
waitUntil(() -> subscription.size() == 1);
final AtomicReference<Throwable> failure = new AtomicReference<>();
final Thread poller = new Thread(() -> subscription.poll(handler));
poller.setUncaughtExceptionHandler((thread, throwable) -> failure.set(throwable));
poller.start();
waitUntil(() -> handler.isWaiting());
// closing the subscriber, triggering reopen request
broker.closeTransport();
waitUntil(() -> subscription.numActiveSubscribers() == 0);
// when continuing event handling
handler.disableWait();
handler.signal();
// then the concurrent modification of subscribers did not affect the poller
poller.join(Duration.ofSeconds(10).toMillis());
assertThat(failure.get()).isNull();
// make the reopen request time out immediately so
// that the client can close without waiting for the timeout
clientRule.getClock().addTime(Duration.ofSeconds(60));
}
use of io.zeebe.client.event.impl.TopicSubscriberGroup in project zeebe by zeebe-io.
the class TopicSubscriptionTest method shouldCloseClientAfterSubscriptionCloseIsCalled.
@Test
public void shouldCloseClientAfterSubscriptionCloseIsCalled() throws Exception {
// given
broker.stubTopicSubscriptionApi(0L);
final ResponseController responseController = broker.onControlMessageRequest((r) -> r.messageType() == ControlMessageType.REMOVE_TOPIC_SUBSCRIPTION).respondWith().data().allOf((r) -> r.getData()).done().registerControlled();
final TopicSubscription foo = client.topics().newSubscription(clientRule.getDefaultTopicName()).handler(DO_NOTHING).name("foo").open();
final ActorFuture<Void> future = ((TopicSubscriberGroup) foo).closeAsync();
waitUntil(() -> broker.getReceivedControlMessageRequests().stream().filter(r -> r.messageType() == ControlMessageType.REMOVE_TOPIC_SUBSCRIPTION).count() == 1);
final Thread closingThread = new Thread(client::close);
closingThread.start();
// when
responseController.unblockNextResponse();
// then
closingThread.join();
waitUntil(() -> future.isDone());
assertThat(future).isDone();
}
use of io.zeebe.client.event.impl.TopicSubscriberGroup in project zeebe by zeebe-io.
the class PartitionedTopicSubscriptionTest method shouldCloseSuccessfulSubscriptionIfAnotherSubscriptionCannotBeOpened.
@Test
public void shouldCloseSuccessfulSubscriptionIfAnotherSubscriptionCannotBeOpened() throws Exception {
// given
final int subscriberKey1 = 456;
broker1.stubTopicSubscriptionApi(subscriberKey1);
final ResponseController responseController = broker2.onExecuteCommandRequest(EventType.SUBSCRIBER_EVENT, "SUBSCRIBE").respondWithError().errorCode(ErrorCode.REQUEST_PROCESSING_FAILURE).errorData("foo").registerControlled();
// assuming that subscription to broker 1 is successful
final TopicSubscriptionBuilderImpl builder = (TopicSubscriptionBuilderImpl) client.topics().newSubscription(TOPIC).handler(new RecordingEventHandler()).name("hohoho");
final Future<TopicSubscriberGroup> groupFuture = builder.buildSubscriberGroup();
waitUntil(() -> getOpenSubscriptionRequests(broker1).size() == 1);
// when
// triggering the error response and continuing
responseController.unblockNextResponse();
// then
waitUntil(() -> groupFuture.isDone());
assertFailed(groupFuture);
final List<ControlMessageRequest> closeRequestsBroker1 = getCloseSubscriptionRequests(broker1);
assertThat(closeRequestsBroker1).hasSize(1);
assertThat(closeRequestsBroker1.get(0).getData().get("subscriberKey")).isEqualTo(subscriberKey1);
}
use of io.zeebe.client.event.impl.TopicSubscriberGroup in project zeebe by zeebe-io.
the class SubscriptionManager method openTopicSubscription.
@SuppressWarnings({ "rawtypes", "unchecked" })
public ActorFuture<TopicSubscriberGroup> openTopicSubscription(TopicSubscriptionSpec spec) {
final CompletableActorFuture<TopicSubscriberGroup> future = new CompletableActorFuture<>();
actor.call(() -> {
final TopicSubscriberGroup group = new TopicSubscriberGroup(actor, client, this, spec);
topicSubscribers.addGroup(group);
group.open((CompletableActorFuture) future);
});
return future;
}
use of io.zeebe.client.event.impl.TopicSubscriberGroup in project zeebe by zeebe-io.
the class TopicSubscriptionTest method shouldCloseSubscriptionWhileOpeningSubscriber.
@Test
public void shouldCloseSubscriptionWhileOpeningSubscriber() {
// given
final int subscriberKey = 123;
broker.stubTopicSubscriptionApi(0L);
final ResponseController responseController = broker.onExecuteCommandRequest(EventType.SUBSCRIBER_EVENT, "SUBSCRIBE").respondWith().key(subscriberKey).event().allOf((r) -> r.getCommand()).put("state", "SUBSCRIBED").done().registerControlled();
final TopicSubscriptionBuilderImpl builder = (TopicSubscriptionBuilderImpl) client.topics().newSubscription(clientRule.getDefaultTopicName()).handler(DO_NOTHING).name("foo");
final Future<TopicSubscriberGroup> future = builder.buildSubscriberGroup();
waitUntil(() -> broker.getReceivedCommandRequests().stream().filter(r -> r.eventType() == EventType.SUBSCRIBER_EVENT && "SUBSCRIBE".equals(r.getCommand().get("state"))).count() == 1);
final Thread closingThread = new Thread(client::close);
closingThread.start();
final SubscriptionManager subscriptionManager = ((ZeebeClientImpl) client).getSubscriptionManager();
waitUntil(() -> subscriptionManager.isClosing());
// when
responseController.unblockNextResponse();
// then
waitUntil(() -> future.isDone());
assertThat(future).isDone();
final Optional<ControlMessageRequest> closeRequest = broker.getReceivedControlMessageRequests().stream().filter(c -> c.messageType() == ControlMessageType.REMOVE_TOPIC_SUBSCRIPTION).findFirst();
assertThat(closeRequest).isPresent();
final ControlMessageRequest request = closeRequest.get();
assertThat(request.getData()).containsEntry("subscriberKey", subscriberKey);
}
Aggregations