public JsonMessageBatch(String id, ByteBuffer buffer, Subscription subscription, Clock clock) { this(id, buffer, subscription.getBatchSubscriptionPolicy().getBatchSize(), subscription.getBatchSubscriptionPolicy().getBatchTime(), clock, subscription.getHeaders()); }
public JsonMessageBatch(String id, ByteBuffer buffer, Subscription subscription, Clock clock) { this(id, buffer, subscription.getBatchSubscriptionPolicy().getBatchSize(), subscription.getBatchSubscriptionPolicy().getBatchTime(), clock, subscription.getHeaders()); }
@Override public MessageBatch createBatch(Subscription subscription) { try { ByteBuffer buffer = bufferPool.allocate(subscription.getBatchSubscriptionPolicy().getBatchVolume()); switch (subscription.getContentType()) { case JSON: return new JsonMessageBatch(randomUUID().toString(), buffer, subscription, clock); case AVRO: default: throw new UnsupportedOperationException("Batching is not supported yet for contentType " + subscription.getContentType()); } } catch (InterruptedException e) { throw new InternalProcessingException(e); } }
@Override public MessageBatch createBatch(Subscription subscription) { try { ByteBuffer buffer = bufferPool.allocate(subscription.getBatchSubscriptionPolicy().getBatchVolume()); switch (subscription.getContentType()) { case JSON: return new JsonMessageBatch(randomUUID().toString(), buffer, subscription, clock); case AVRO: default: throw new UnsupportedOperationException("Batching is not supported yet for contentType " + subscription.getContentType()); } } catch (InterruptedException e) { throw new InternalProcessingException(e); } }
public boolean subscriptionHasRetryOnError() { if (subscription.isBatchSubscription()) { return subscription.getBatchSubscriptionPolicy().isRetryClientErrors(); } else { return subscription.getSerialSubscriptionPolicy().isRetryClientErrors(); } }
@Override public void consume(Runnable signalsInterrupt) { Optional<MessageBatch> inflight = Optional.empty(); try { logger.debug("Trying to create new batch [subscription={}].", subscription.getQualifiedName()); signalsInterrupt.run(); MessageBatchingResult result = receiver.next(subscription, signalsInterrupt); inflight = of(result.getBatch()); inflight.ifPresent(batch -> { logger.debug("Delivering batch [subscription={}].", subscription.getQualifiedName()); offerInflightOffsets(batch); deliver(signalsInterrupt, batch, createRetryer(batch, subscription.getBatchSubscriptionPolicy())); offerCommittedOffsets(batch); logger.debug("Finished delivering batch [subscription={}]", subscription.getQualifiedName()); }); result.getDiscarded().forEach(m -> monitoring.markDiscarded(m, subscription, "too large")); } finally { logger.debug("Cleaning batch [subscription={}]", subscription.getQualifiedName()); inflight.ifPresent(this::clean); } }
@Override public void consume(Runnable signalsInterrupt) { Optional<MessageBatch> inflight = Optional.empty(); try { logger.debug("Trying to create new batch [subscription={}].", subscription.getQualifiedName()); signalsInterrupt.run(); MessageBatchingResult result = receiver.next(subscription, signalsInterrupt); inflight = of(result.getBatch()); inflight.ifPresent(batch -> { logger.debug("Delivering batch [subscription={}].", subscription.getQualifiedName()); offerInflightOffsets(batch); deliver(signalsInterrupt, batch, createRetryer(batch, subscription.getBatchSubscriptionPolicy())); offerCommittedOffsets(batch); logger.debug("Finished delivering batch [subscription={}]", subscription.getQualifiedName()); }); result.getDiscarded().forEach(m -> monitoring.markDiscarded(m, subscription, "too large")); } finally { logger.debug("Cleaning batch [subscription={}]", subscription.getQualifiedName()); inflight.ifPresent(this::clean); } }
private void deliver(Runnable signalsInterrupt, MessageBatch batch, Retryer<MessageSendingResult> retryer) { try (Timer.Context timer = hermesMetrics.subscriptionLatencyTimer(subscription).time()) { retryer.call(() -> { signalsInterrupt.run(); return sender.send( batch, subscription.getEndpoint(), subscription.getEndpointAddressResolverMetadata(), subscription.getBatchSubscriptionPolicy().getRequestTimeout() ); }); } catch (Exception e) { logger.error("Batch was rejected [batch_id={}, subscription={}].", batch.getId(), subscription.getQualifiedName(), e); monitoring.markDiscarded(batch, subscription, e.getMessage()); } }
private void deliver(Runnable signalsInterrupt, MessageBatch batch, Retryer<MessageSendingResult> retryer) { try (Timer.Context timer = hermesMetrics.subscriptionLatencyTimer(subscription).time()) { retryer.call(() -> { signalsInterrupt.run(); return sender.send( batch, subscription.getEndpoint(), subscription.getEndpointAddressResolverMetadata(), subscription.getBatchSubscriptionPolicy().getRequestTimeout() ); }); } catch (Exception e) { logger.error("Batch was rejected [batch_id={}, subscription={}].", batch.getId(), subscription.getQualifiedName(), e); monitoring.markDiscarded(batch, subscription, e.getMessage()); } }