Подкласс Netty Channel или использовать существующие - PullRequest
0 голосов
/ 21 декабря 2018

Мы становимся все более и более зависимыми от Netty и до недавнего времени использовали PureJavaCommChannel, реализацию OioChannel, построенную поверх PureJavaComm, которая в дальнейшем построена на JTermios.JTermios - это JNA-оболочка библиотек Posix C.

Для большего контроля над конфигурацией и производительностью последовательного порта у нас недавно возникла необходимость удалить слой PureJavaComm и напрямую использовать JTermios.

Каков наилучший способ передачи данных в / из реализации канала, получаемой / передаваемой посредством вызовов чтения / записи posix?Должен ли я создать подкласс одного из абстрактных типов каналов или использовать один из существующих конкретных каналов?В настоящее время я использую EmbededChannels как своего рода двухстороннюю очередь для этой цели, но я догадываюсь, что это немного злоупотребляет этим классом.Мысли? * * 1005

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Ну тогда пусть это будет пример наивного канала Oio.

public class StreamChannel extends OioByteStreamChannel {
    private final AtomicBoolean isInputShutdown = new AtomicBoolean(false);
    private final AtomicBoolean isOpen = new AtomicBoolean(true);

    private final InputStream input;
    private final OutputStream output;

    public StreamChannel(InputStream input, OutputStream output) {
        super(null);
        this.input = input;
        this.output = output;
    }

    @Override
    public boolean isOpen() {
        return isOpen.get();
    }

    @Override
    protected boolean isInputShutdown() {
        return isInputShutdown.get();
    }

    @Override
    protected ChannelFuture shutdownInput() {
        isInputShutdown.set(true);
        return this.newSucceededFuture();
    }

    @Override
    protected void doConnect(SocketAddress otherUnused, SocketAddress unused) throws Exception {
        activate(input, output);
    }

    @Override
    protected void doDisconnect() throws Exception {
        isOpen.set(false);
    }

    @Override
    protected void doBind(SocketAddress unused) throws Exception {
        throw new UnsupportedOperationException();
    }

    @Override
    protected SocketAddress localAddress0() {
        return null;
    }

    @Override
    protected SocketAddress remoteAddress0() {
        return null;
    }

    @Override
    public ChannelConfig config() {
        return new DefaultChannelConfig(this);
    }
}
0 голосов
/ 21 декабря 2018

В конце это звучит так, как будто вам лучше реализовать свой собственный «транспорт».В простейшем случае это будет подкласс AbstractChannel и реализация EventLoop / EventLoopGroup, которая работает с ним.

...