Home / Class/ MessageToMessageEncoder Class — netty Architecture

MessageToMessageEncoder Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  5de88c7e_af22_af85_54c4_7537ccd3bd88["MessageToMessageEncoder"]
  9655be85_0d7a_0c2b_182b_c7368a3cbb3f["MessageToMessageEncoder.java"]
  5de88c7e_af22_af85_54c4_7537ccd3bd88 -->|defined in| 9655be85_0d7a_0c2b_182b_c7368a3cbb3f
  6fc7b564_4add_0cda_6eb5_31d0770a8bbb["MessageToMessageEncoder()"]
  5de88c7e_af22_af85_54c4_7537ccd3bd88 -->|method| 6fc7b564_4add_0cda_6eb5_31d0770a8bbb
  4b14cfce_c60b_3d25_a814_63dd23ee14f7["acceptOutboundMessage()"]
  5de88c7e_af22_af85_54c4_7537ccd3bd88 -->|method| 4b14cfce_c60b_3d25_a814_63dd23ee14f7
  2e6c2add_abce_1e65_fc06_6fd8d0a1f4d5["write()"]
  5de88c7e_af22_af85_54c4_7537ccd3bd88 -->|method| 2e6c2add_abce_1e65_fc06_6fd8d0a1f4d5
  68a434ac_b99b_038a_3645_f543bca82280["writeVoidPromise()"]
  5de88c7e_af22_af85_54c4_7537ccd3bd88 -->|method| 68a434ac_b99b_038a_3645_f543bca82280
  859182f4_3b42_644a_4f64_af2ebd8f2c1b["writePromiseCombiner()"]
  5de88c7e_af22_af85_54c4_7537ccd3bd88 -->|method| 859182f4_3b42_644a_4f64_af2ebd8f2c1b
  a517d4ee_a59c_55f0_5218_fedc7b1ab3c7["encode()"]
  5de88c7e_af22_af85_54c4_7537ccd3bd88 -->|method| a517d4ee_a59c_55f0_5218_fedc7b1ab3c7

Relationship Graph

Source Code

codec-base/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java lines 53–156

public abstract class MessageToMessageEncoder<I> extends ChannelOutboundHandlerAdapter {

    private final TypeParameterMatcher matcher;

    /**
     * Create a new instance which will try to detect the types to match out of the type parameter of the class.
     */
    protected MessageToMessageEncoder() {
        matcher = TypeParameterMatcher.find(this, MessageToMessageEncoder.class, "I");
    }

    /**
     * Create a new instance
     *
     * @param outboundMessageType   The type of messages to match and so encode
     */
    protected MessageToMessageEncoder(Class<? extends I> outboundMessageType) {
        matcher = TypeParameterMatcher.get(outboundMessageType);
    }

    /**
     * Returns {@code true} if the given message should be handled. If {@code false} it will be passed to the next
     * {@link ChannelOutboundHandler} in the {@link ChannelPipeline}.
     */
    public boolean acceptOutboundMessage(Object msg) throws Exception {
        return matcher.match(msg);
    }

    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        CodecOutputList out = null;
        try {
            if (acceptOutboundMessage(msg)) {
                out = CodecOutputList.newInstance();
                @SuppressWarnings("unchecked")
                I cast = (I) msg;
                try {
                    encode(ctx, cast, out);
                } catch (Throwable th) {
                    ReferenceCountUtil.safeRelease(cast);
                    PlatformDependent.throwException(th);
                }
                ReferenceCountUtil.release(cast);

                if (out.isEmpty()) {
                    throw new EncoderException(
                            StringUtil.simpleClassName(this) + " must produce at least one message.");
                }
            } else {
                ctx.write(msg, promise);
            }
        } catch (EncoderException e) {
            throw e;
        } catch (Throwable t) {
            throw new EncoderException(t);
        } finally {
            if (out != null) {
                try {
                    final int sizeMinusOne = out.size() - 1;
                    if (sizeMinusOne == 0) {
                        ctx.write(out.getUnsafe(0), promise);
                    } else if (sizeMinusOne > 0) {
                        // Check if we can use a voidPromise for our extra writes to reduce GC-Pressure
                        // See https://github.com/netty/netty/issues/2525
                        if (promise == ctx.voidPromise()) {
                            writeVoidPromise(ctx, out);
                        } else {
                            writePromiseCombiner(ctx, out, promise);
                        }
                    }
                } finally {
                    out.recycle();
                }
            }
        }
    }

    private static void writeVoidPromise(ChannelHandlerContext ctx, CodecOutputList out) {
        final ChannelPromise voidPromise = ctx.voidPromise();
        for (int i = 0; i < out.size(); i++) {
            ctx.write(out.getUnsafe(i), voidPromise);

Frequently Asked Questions

What is the MessageToMessageEncoder class?
MessageToMessageEncoder is a class in the netty codebase, defined in codec-base/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java.
Where is MessageToMessageEncoder defined?
MessageToMessageEncoder is defined in codec-base/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java at line 53.

Analyze Your Own Codebase

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

Try Supermodel Free