All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.scalecube.services.examples.services.Service2Impl Maven / Gradle / Ivy

package io.scalecube.services.examples.services;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.LockSupport;
import reactor.core.publisher.Mono;
import reactor.core.publisher.MonoSink;
import reactor.core.scheduler.Schedulers;

class Service2Impl implements Service2 {

  private static final long SLEEP_PERIOD_NS = 10000;

  @Override
  public Mono oneDelay(long interval) {
    return Mono.create(sink -> doWork(sink, interval))
        .subscribeOn(Schedulers.parallel())
        .log("oneDelay    |");
  }

  private void doWork(MonoSink sink, long interval) {
    AtomicBoolean isActive = new AtomicBoolean(true);
    sink.onCancel(() -> isActive.set(false));
    sink.onDispose(() -> isActive.set(false));

    long started = System.currentTimeMillis();

    sink.onRequest(
        r -> {
          while (isActive.get()) {
            long now = System.currentTimeMillis();

            if (now - started > interval) {
              sink.success(toResponse(now));
              return;
            }

            LockSupport.parkNanos(SLEEP_PERIOD_NS);
          }
        });
  }

  private String toResponse(long now) {
    String currentThread = Thread.currentThread().getName();
    final LocalDateTime time =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(now), ZoneId.systemDefault());
    return "|" + currentThread + "| response: " + time;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy