Правильный способ настройки обработчиков в методе getPipeline () - PullRequest
0 голосов
/ 26 декабря 2011

Может кто-нибудь предложить лучший / правильный способ настройки обработчиков в методе getPipeline (). Когда клиент отправляет сообщение на сервер, оно состоит из пользовательских объектов, которые содержат данные, требуемые сервером. Я настроил обработчики, как показано ниже:

public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = pipeline();

SSLEngine engine = SecureSslContextFactory.getServerContext().createSSLEngine();
engine.setUseClientMode(false);

pipeline.addLast("ssl", new SslHandler(engine));

pipeline.addLast("decoder", new ObjectDecoder());
pipeline.addLast("encoder", new ObjectEncoder());

pipeline.addLast("pipelineExecutor", new ExecutionHandler(pipelineExecutor));

// and then business logic.
pipeline.addLast("handler", new SecureServerHandler());

return pipeline;
}

Когда я компилирую с использованием Netty 3.2.7 Final, я получаю следующее предупреждение:

Предупреждение (78,33): ObjectDecoder () в org.jboss.netty.handler.codec.serialization.ObjectDecoder объявлен устаревшим

Когда клиент отправляет сообщение, я получаю следующую ошибку во время выполнения:

ВНИМАНИЕ: Неожиданное исключение из нисходящего потока.
java.io.InvalidClassException: не удалось прочитать дескриптор класса
at java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1567)
at java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1496)
at java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject (ObjectInputStream.java:351)
в org.jboss.netty.handler.codec.serialization.ObjectDecoder.decode (ObjectDecoder.java:129)
в org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode (FrameDecoder.java:282)
в org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived (FrameDecoder.java:216)
на org.jboss.netty.channel.Channels.fireMessageReceived (Channels.java:302)
в org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived (FrameDecoder.java:321)
в org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode (FrameDecoder.java:299)
в org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived (FrameDecoder.java:216)
на org.jboss.netty.channel.Channels.fireMessageReceived (Channels.java:274)
на org.jboss.netty.channel.Channels.fireMessageReceived (Channels.java:261)
в org.jboss.netty.channel.socket.nio.NioWorker.read (NioWorker.java:351)
в org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys (NioWorker.java:282)
на org.jboss.netty.channel.socket.nio.NioWorker.run (NioWorker.java:202)
в java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908)
at java.lang.Thread.run (Thread.java:619)

1 Ответ

0 голосов
/ 29 декабря 2011

Ваша проблема может быть такой же, как следующий вопрос: Как реализовать ObjectDecoder (ClassResolver) в Netty 3.2.7 .

Попробуйте создать экземпляр ObjectDecoder как new ObjectDecoder(ClassResolvers.weakCachingConcurrentResolver(null)), чтобы избавиться от предупреждения.

Если ваш класс не загружается, попробуйте указать загрузчик классов. Смотри http://markmail.org/message/4ftws33dxehbzbwd.

Надеюсь, это поможет.

...