Есть ли способ получить обещание от ratpack ctx.next () - PullRequest
3 голосов
/ 30 апреля 2020

Я написал обработчик ratpack, который измеряет время выполнения цепочки обработчиков.

public class EndpointMetricsEmitter implements Handler {

  public static final String HANDLE_DURATION_METRIC = "HANDLE_DURATION_MILLIS";
  private final MetricContext baseContext;
  private MonitoringRegistry registry;

  public EndpointMetricsEmitter(MonitoringRegistry monitoringRegistry) {
    this.registry = monitoringRegistry;
    this.baseContext = MetricContext.newContext(REST);
  }

  @Override
  public void handle(Context ctx) throws Exception {
    Instant start = Instant.now();
    ctx.next();
    Instant end = Instant.now();
    long dur = Duration.between(start, end).toMillis();
    MetricContext endpointCtx = this.baseContext.withService(ctx.getPathBinding().getDescription());
    this.registry.timer(endpointCtx, HANDLE_DURATION_METRIC, dur);

  }

Проблема в том, что я понял, что ctx.next() - это асинхронный c метод, и он возвращает void.

есть ли способ вызвать функцию, когда возвращается последний обработчик цепочки?

спасибо

1 Ответ

0 голосов
/ 06 мая 2020

Один из способов сделать это с помощью атрибута ChannelHandlerContextMap api.

Что я хотел бы сделать, это создать некую статистику pojo, инициализировать ее в первом обработчике и обновить в своем конечный обработчик.

Преимущество этого заключается в том, что по желанию каждый обработчик в конвейере может отслеживать свою индивидуальную производительность и обновлять атрибут самостоятельно.

...