Лучший способ отправки непрерывных данных в Java с использованием Netty - PullRequest
1 голос
/ 21 июля 2011

Я планирую использовать Netty для разработки TCP-сервера. Когда клиент подключается, я должен немедленно начать прокачку XML данные клиенту постоянно ... в течение нескольких часов / дней. Это так просто.

Итак, я переопределяю метод channelConnected и отправляю данные из этого метода, верно? ... это здорово.

Я буду использовать следующую ChannelFactory

ChannelFactory factory =
    new NioServerSocketChannelFactory(
            Executors.newCachedThreadPool(),
            Executors.newCachedThreadPool());

NioServerSocketChannelFactory документация гласит

Рабочий поток выполняет неблокирующее чтение и запись для одного или нескольких каналов в неблокирующем режиме.

Хорошо.

В соответствии с действующим пунктом 51 Java: Не зависит от планировщика потока , я хочу, чтобы рабочий поток выполнил «единицу работы», а затем завершил / возвратил.

Таким образом, в моем случае, хотя я должен отправлять данные непрерывно, я хочу отправить некоторый кусок (скажем, 1 МБ), а затем выполнить (единицу выполненной работы), чтобы рабочий поток мог вернуться. Тогда я пришлю еще 1 МБ.

Ниже приведен пример из официального руководства Netty ЗДЕСЬ .
Я полагаю, что вопрос в этом случае, если бы мне пришлось безоговорочно продолжать посылать время клиенту, как бы я это сделал, учитывая каждый отправить как единицу работы.

Один из способов сделать это - просто положить цикл while и выполнить Thread.Sleep. Любой другой путь?

    package org.jboss.netty.example.time;

    public class TimeServerHandler extends SimpleChannelHandler {

        @Override
        public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
            Channel ch = e.getChannel();

            ChannelBuffer time = ChannelBuffers.buffer(4);
            time.writeInt(System.currentTimeMillis() / 1000);

            ChannelFuture f = ch.write(time);

            f.addListener(new ChannelFutureListener() {
                public void operationComplete(ChannelFuture future) {
                    Channel ch = future.getChannel();
                    ch.close();
                }
            });
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
            e.getCause().printStackTrace();
            e.getChannel().close();
        }
    }

1 Ответ

2 голосов
/ 14 ноября 2011

Выполнение while / sleep будет работать, но не будет в супермасштабируемом стиле Netty.Это будет программирование потокового соединения.

Вместо этого запланируйте периодическое задание для исполнителя, который записывает сообщение в канал.

...