use of com.rabbitmq.stream.impl.Utils.ClientFactory in project rabbitmq-stream-java-client by rabbitmq.
the class ProducersCoordinatorTest method init.
@BeforeEach
void init() {
Client.ClientParameters clientParameters = new Client.ClientParameters() {
@Override
public Client.ClientParameters shutdownListener(Client.ShutdownListener shutdownListener) {
ProducersCoordinatorTest.this.shutdownListener = shutdownListener;
return super.shutdownListener(shutdownListener);
}
@Override
public Client.ClientParameters metadataListener(Client.MetadataListener metadataListener) {
ProducersCoordinatorTest.this.metadataListener = metadataListener;
return super.metadataListener(metadataListener);
}
};
mocks = MockitoAnnotations.openMocks(this);
when(environment.locator()).thenReturn(locator);
when(environment.locatorOperation(any())).thenCallRealMethod();
when(environment.clientParametersCopy()).thenReturn(clientParameters);
when(environment.addressResolver()).thenReturn(address -> address);
when(trackingConsumer.stream()).thenReturn("stream");
when(client.declarePublisher(anyByte(), isNull(), anyString())).thenReturn(new Response(Constants.RESPONSE_CODE_OK));
coordinator = new ProducersCoordinator(environment, ProducersCoordinator.MAX_PRODUCERS_PER_CLIENT, ProducersCoordinator.MAX_TRACKING_CONSUMERS_PER_CLIENT, type -> "producer-connection", clientFactory);
}
use of com.rabbitmq.stream.impl.Utils.ClientFactory in project rabbitmq-stream-java-client by rabbitmq.
the class UtilsTest method exactNodeRetryClientFactoryShouldRetryUntilConditionOk.
@Test
@SuppressWarnings("unchecked")
void exactNodeRetryClientFactoryShouldRetryUntilConditionOk() {
Client client = mock(Client.class);
ClientFactory cf = mock(ClientFactory.class);
when(cf.client(any())).thenReturn(client);
Predicate<Client> condition = mock(Predicate.class);
when(condition.test(any())).thenReturn(false).thenReturn(false).thenReturn(true);
Client result = new ExactNodeRetryClientFactory(cf, condition, Duration.ofMillis(1)).client(ClientFactoryContext.fromParameters(new ClientParameters()));
assertThat(result).isEqualTo(client);
verify(cf, times(3)).client(any());
verify(client, times(2)).close();
}
use of com.rabbitmq.stream.impl.Utils.ClientFactory in project rabbitmq-stream-java-client by rabbitmq.
the class ConsumersCoordinatorTest method shouldRetryUntilGettingExactNodeWithAdvertisedHostNameClientFactoryAndNotExactNodeOnFirstTime.
@Test
void shouldRetryUntilGettingExactNodeWithAdvertisedHostNameClientFactoryAndNotExactNodeOnFirstTime() {
ClientFactory cf = context -> Utils.connectToAdvertisedNodeClientFactory(context.key(), clientFactory, Duration.ofMillis(1)).client(context);
ConsumersCoordinator c = new ConsumersCoordinator(environment, ConsumersCoordinator.MAX_SUBSCRIPTIONS_PER_CLIENT, type -> "consumer-connection", cf);
when(locator.metadata("stream")).thenReturn(metadata(null, replica()));
when(clientFactory.client(any())).thenReturn(client);
when(client.subscribe(subscriptionIdCaptor.capture(), anyString(), any(OffsetSpecification.class), anyInt(), anyMap())).thenReturn(new Client.Response(Constants.RESPONSE_CODE_OK));
when(client.serverAdvertisedHost()).thenReturn("foo").thenReturn(replica().get(0).getHost());
when(client.serverAdvertisedPort()).thenReturn(42).thenReturn(replica().get(0).getPort());
c.subscribe(consumer, "stream", OffsetSpecification.first(), null, NO_OP_SUBSCRIPTION_LISTENER, (offset, message) -> {
});
verify(clientFactory, times(2)).client(any());
verify(client, times(1)).subscribe(anyByte(), anyString(), any(OffsetSpecification.class), anyInt(), anyMap());
}
use of com.rabbitmq.stream.impl.Utils.ClientFactory in project rabbitmq-stream-java-client by rabbitmq.
the class ConsumersCoordinatorTest method shouldRemoveClientSubscriptionManagerFromPoolIfEmptyAfterMetadataUpdate.
@Test
void shouldRemoveClientSubscriptionManagerFromPoolIfEmptyAfterMetadataUpdate() throws Exception {
BackOffDelayPolicy delayPolicy = fixedWithInitialDelay(ms(50), ms(50));
when(environment.topologyUpdateBackOffDelayPolicy()).thenReturn(delayPolicy);
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
when(environment.scheduledExecutorService()).thenReturn(scheduledExecutorService);
when(consumer.isOpen()).thenReturn(true);
when(locator.metadata("stream")).thenReturn(metadata(null, replicas().subList(0, 1)));
when(clientFactory.client(any())).thenReturn(client);
when(client.subscribe(subscriptionIdCaptor.capture(), anyString(), any(OffsetSpecification.class), anyInt(), anyMap())).thenReturn(new Client.Response(Constants.RESPONSE_CODE_OK));
int extraSubscriptionCount = ConsumersCoordinator.MAX_SUBSCRIPTIONS_PER_CLIENT / 5;
int subscriptionCount = ConsumersCoordinator.MAX_SUBSCRIPTIONS_PER_CLIENT + extraSubscriptionCount;
IntStream.range(0, subscriptionCount).forEach(i -> {
coordinator.subscribe(consumer, "stream", OffsetSpecification.first(), null, NO_OP_SUBSCRIPTION_LISTENER, (offset, message) -> {
});
});
// the extra is allocated on another client from the same pool
verify(clientFactory, times(2)).client(any());
verify(client, times(subscriptionCount)).subscribe(anyByte(), anyString(), any(OffsetSpecification.class), anyInt(), anyMap());
List<ConsumersPoolInfo> info = MonitoringTestUtils.extract(coordinator);
assertThat(info).hasSize(1).element(0).extracting(pool -> pool.consumerCount()).isEqualTo(subscriptionCount);
// let's kill the first client connection
metadataListeners.get(0).handle("stream", Constants.RESPONSE_CODE_STREAM_NOT_AVAILABLE);
Thread.sleep(delayPolicy.delay(0).toMillis() * 5);
info = MonitoringTestUtils.extract(coordinator);
assertThat(info).hasSize(1).element(0).extracting(pool -> pool.consumerCount()).isEqualTo(subscriptionCount);
// the MAX consumers must have been re-allocated to the existing client and a new one
// let's add a new subscription to make sure we are still using the same pool
coordinator.subscribe(consumer, "stream", OffsetSpecification.first(), null, NO_OP_SUBSCRIPTION_LISTENER, (offset, message) -> {
});
verify(clientFactory, times(2 + 1)).client(any());
verify(client, times(subscriptionCount + ConsumersCoordinator.MAX_SUBSCRIPTIONS_PER_CLIENT + 1)).subscribe(anyByte(), anyString(), any(OffsetSpecification.class), anyInt(), anyMap());
info = MonitoringTestUtils.extract(coordinator);
assertThat(info).hasSize(1).element(0).extracting(pool -> pool.consumerCount()).isEqualTo(subscriptionCount + 1);
}
use of com.rabbitmq.stream.impl.Utils.ClientFactory in project rabbitmq-stream-java-client by rabbitmq.
the class ConsumersCoordinatorTest method shouldGetExactNodeImmediatelyWithAdvertisedHostNameClientFactoryAndExactNodeOnFirstTime.
@Test
void shouldGetExactNodeImmediatelyWithAdvertisedHostNameClientFactoryAndExactNodeOnFirstTime() {
ClientFactory cf = context -> Utils.connectToAdvertisedNodeClientFactory(context.key(), clientFactory, Duration.ofMillis(1)).client(context);
ConsumersCoordinator c = new ConsumersCoordinator(environment, ConsumersCoordinator.MAX_SUBSCRIPTIONS_PER_CLIENT, type -> "consumer-connection", cf);
when(locator.metadata("stream")).thenReturn(metadata(null, replica()));
when(clientFactory.client(any())).thenReturn(client);
when(client.subscribe(subscriptionIdCaptor.capture(), anyString(), any(OffsetSpecification.class), anyInt(), anyMap())).thenReturn(new Client.Response(Constants.RESPONSE_CODE_OK));
when(client.serverAdvertisedHost()).thenReturn(replica().get(0).getHost());
when(client.serverAdvertisedPort()).thenReturn(replica().get(0).getPort());
c.subscribe(consumer, "stream", OffsetSpecification.first(), null, NO_OP_SUBSCRIPTION_LISTENER, (offset, message) -> {
});
verify(clientFactory, times(1)).client(any());
verify(client, times(1)).subscribe(anyByte(), anyString(), any(OffsetSpecification.class), anyInt(), anyMap());
}
Aggregations