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

io.scalecube.transport.netty.tcp.TcpReceiver Maven / Gradle / Ivy

There is a newer version: 2.7.0.rc
Show newest version
package io.scalecube.transport.netty.tcp;

import io.netty.channel.ChannelOption;
import io.scalecube.cluster.transport.api.TransportConfig;
import io.scalecube.transport.netty.Receiver;
import io.scalecube.transport.netty.TransportImpl.ReceiverContext;
import reactor.core.publisher.Mono;
import reactor.netty.DisposableServer;
import reactor.netty.tcp.TcpServer;

public final class TcpReceiver implements Receiver {

  private final TransportConfig config;

  TcpReceiver(TransportConfig config) {
    this.config = config;
  }

  @Override
  public Mono bind() {
    return Mono.deferContextual(context -> Mono.just(context.get(ReceiverContext.class)))
        .flatMap(
            context ->
                newTcpServer(context)
                    .handle((in, out) -> in.receive().retain().doOnNext(context::onMessage).then())
                    .bind()
                    .cast(DisposableServer.class));
  }

  private TcpServer newTcpServer(ReceiverContext context) {
    return TcpServer.create()
        .runOn(context.loopResources())
        .port(config.port())
        .childOption(ChannelOption.TCP_NODELAY, true)
        .childOption(ChannelOption.SO_KEEPALIVE, true)
        .childOption(ChannelOption.SO_REUSEADDR, true)
        .doOnChannelInit(
            (connectionObserver, channel, remoteAddress) ->
                new TcpChannelInitializer(config.maxFrameLength())
                    .accept(connectionObserver, channel));
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy