Home / Class/ FactorialClientHandler Class — netty Architecture

FactorialClientHandler Class — netty Architecture

Architecture documentation for the FactorialClientHandler class in FactorialClientHandler.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  6b74f961_c8cc_285b_9744_1b39fe5fb961["FactorialClientHandler"]
  c6f12a8e_5ce1_9888_919d_b05bbd65efda["FactorialClientHandler.java"]
  6b74f961_c8cc_285b_9744_1b39fe5fb961 -->|defined in| c6f12a8e_5ce1_9888_919d_b05bbd65efda
  811e1841_3d73_0136_ebd4_ad3e6c22770f["BigInteger()"]
  6b74f961_c8cc_285b_9744_1b39fe5fb961 -->|method| 811e1841_3d73_0136_ebd4_ad3e6c22770f
  cedf20d4_6466_7326_2041_a4953a67c61a["channelActive()"]
  6b74f961_c8cc_285b_9744_1b39fe5fb961 -->|method| cedf20d4_6466_7326_2041_a4953a67c61a
  82fc1041_d720_4eef_1ffb_b02eeed4d41f["channelRead0()"]
  6b74f961_c8cc_285b_9744_1b39fe5fb961 -->|method| 82fc1041_d720_4eef_1ffb_b02eeed4d41f
  9271ce0e_decd_28b1_ce56_2b1b0f234964["exceptionCaught()"]
  6b74f961_c8cc_285b_9744_1b39fe5fb961 -->|method| 9271ce0e_decd_28b1_ce56_2b1b0f234964
  8fdff1c9_9d1f_006d_dcc4_a9201ec18abb["sendNumbers()"]
  6b74f961_c8cc_285b_9744_1b39fe5fb961 -->|method| 8fdff1c9_9d1f_006d_dcc4_a9201ec18abb

Relationship Graph

Source Code

example/src/main/java/io/netty/example/factorial/FactorialClientHandler.java lines 34–104

public class FactorialClientHandler extends SimpleChannelInboundHandler<BigInteger> {

    private ChannelHandlerContext ctx;
    private int receivedMessages;
    private int next = 1;
    final BlockingQueue<BigInteger> answer = new LinkedBlockingQueue<BigInteger>();

    public BigInteger getFactorial() {
        boolean interrupted = false;
        try {
            for (;;) {
                try {
                    return answer.take();
                } catch (InterruptedException ignore) {
                    interrupted = true;
                }
            }
        } finally {
            if (interrupted) {
                Thread.currentThread().interrupt();
            }
        }
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        this.ctx = ctx;
        sendNumbers();
    }

    @Override
    public void channelRead0(ChannelHandlerContext ctx, final BigInteger msg) {
        receivedMessages ++;
        if (receivedMessages == FactorialClient.COUNT) {
            // Offer the answer after closing the connection.
            ctx.channel().close().addListener(future -> {
                boolean offered = answer.offer(msg);
                assert offered;
            });
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }

    private void sendNumbers() {
        // Do not send more than 4096 numbers.
        ChannelFuture future = null;
        for (int i = 0; i < 4096 && next <= FactorialClient.COUNT; i++) {
            future = ctx.write(Integer.valueOf(next));
            next++;
        }
        if (next <= FactorialClient.COUNT) {
            assert future != null;
            future.addListener(numberSender);
        }
        ctx.flush();
    }

    private final ChannelFutureListener numberSender = future -> {
        if (future.isSuccess()) {
            sendNumbers();
        } else {
            future.cause().printStackTrace();
            future.channel().close();
        }
    };
}

Frequently Asked Questions

What is the FactorialClientHandler class?
FactorialClientHandler is a class in the netty codebase, defined in example/src/main/java/io/netty/example/factorial/FactorialClientHandler.java.
Where is FactorialClientHandler defined?
FactorialClientHandler is defined in example/src/main/java/io/netty/example/factorial/FactorialClientHandler.java at line 34.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free