2017-04-02 2 views
0

Ich benutze netty 4.1.9 auf einem Server, der XML-Nachrichten von einem Netty-Client empfängt. Der Client kann die XML-Nachricht an den Server senden. Auf der Server-Seite muss ich jedoch in der Lage sein, sie als eine einzige xml-Nachricht (nicht eine Reihe von Bytes) zu dekodieren. Ich schaute auf den XML-Frame-Decoder, konnte aber nicht den besten Ansatz finden. Würde es schätzen, in die richtige Richtung zu zeigen.mit Netty 4.1.9 für XML-Nachrichtenverarbeitung

Initializer:

@Override 
    public void initChannel(SocketChannel ch) throws Exception { 
     log.info("init channel called"); 
     ChannelPipeline pipeline = ch.pipeline(); 
     //add decoder for combining bytes for xml message 
     pipeline.addLast("decoder", new XmlMessageDecoder()); 

     // handler for business logic. 
     pipeline.addLast("handler", new XmlServerHandler()); 
} 

war ich nicht in der Lage den XML-Frame-Decodierer zu verwenden. Wenn ich versuche, den XML-Frame-Decoder im mxl-Message-Decoder zu erweitern, bekomme ich den Kompilierungsfehler "Es gibt keinen Standardkonstruktor in xmlframedecoder".

Antwort

0

Ich endete mit dem XmlFrameDecoder in meinem Kanalinitialisierer und seine Ausgabe wurde an den Handler übergeben, wo ich die XML-Nachricht aus dem ByteBuf lesen konnte.

initializer

@Override 
public void initChannel(SocketChannel ch) throws Exception { 
    ChannelPipeline pipeline = ch.pipeline(); 

    // idle state handler 
    pipeline.addLast("idleStateHandler", new IdleStateHandler(60, 
      30, 0)); 
    pipeline.addLast("myHandler", new IdleHandler()); 

    //add decoder for combining bytes for xml message 
    pipeline.addLast("decoder", new XmlFrameDecoder(1048576)); 

    // handler for business logic. 
    pipeline.addLast("handler", new ServerReceiverHandler()); 

Handler

public class ServerReceiverHandler erweitert ChannelInboundHandlerAdapter {

ChannelHandlerContext ctx; 

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
    final ByteBuf buffer = (ByteBuf)msg; 
    //prints out String representation of xml doc 
    log.info("read : {}" + buffer.toString((CharsetUtil.UTF_8))); 
    ReferenceCountUtil.release(msg); 
}