序列化netty的FullHttpRequest

Serialize netty's FullHttpRequest

我的 Java 项目中有一个 netty 服务器 运行,正在侦听请求。 Netty 在将请求交给处理程序之前在内部将请求转换为 FullHttpRequest 类型。现在在我的处理程序中,我正在尝试序列化 FullHttpRequest 因为我必须将它推送到 RabbtitMQ。但看起来它是不可序列化的:

due java.io.NotSerializableException: io.netty.handler.codec.http.DefaultFullHttpRequest
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.createTypeConversionException(BaseTypeConverterRegistry.java:566)
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:174)
    at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:99)
    ... 31 more
Caused by: org.apache.commons.lang3.SerializationException: java.io.NotSerializableException: io.netty.handler.codec.http.DefaultFullHttpRequest
    at org.apache.commons.lang3.SerializationUtils.serialize(SerializationUtils.java:139)
    at org.apache.commons.lang3.SerializationUtils.serialize(SerializationUtils.java:161)
    at com.company.myproject.util.RequestToByteArrayConverter.convertTo(RequestToByteArrayConverter.java:28)
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.doConvertTo(BaseTypeConverterRegistry.java:276)
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:165)
    ... 32 more

有几种方法可以解决这个问题。

  • 扩展 FullHttpRequest/Response 以实现可序列化。这很忙,因为您可能最终会写 read/write 解析相当多的 类。
  • 创建您自己的 FullHttpRequest/Response 影子 类,它从影子 类 复制有意义的位并且是可序列化的。然后写自己的适配器

我个人采用了影子方法。