子类 Netty Channel 或使用现有的
Subclass Netty Channel or use existing
我们越来越依赖 Netty,直到最近才开始依赖 PureJavaCommChannel,这是一个建立在 PureJavaComm 之上的 OioChannel 实现,它进一步建立在 JTermios 之上。 JTermios 是 Posix C 库的 JNA 包装器。
需要更多地控制串行端口的配置和性能,我们最近需要删除 PureJavaComm 层并直接使用 JTermios。
通过 posix read/write 调用将数据传入和传出通道实现 sourced/sunk 的最佳方式是什么?我应该 subclass 抽象通道类型之一还是使用现有的具体通道之一?为此,我目前正在使用 EmbededChannels 作为一种双向队列,但我的直觉是,这有点误用 class。想法?
最后听起来您最好实施您的自定义 "transport"。在最简单的情况下,这将是 AbstractChannel
的子 class 和与之一起使用的 EventLoop
/ EventLoopGroup
实现。
那么让这成为一个简单的 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);
}
}
我们越来越依赖 Netty,直到最近才开始依赖 PureJavaCommChannel,这是一个建立在 PureJavaComm 之上的 OioChannel 实现,它进一步建立在 JTermios 之上。 JTermios 是 Posix C 库的 JNA 包装器。
需要更多地控制串行端口的配置和性能,我们最近需要删除 PureJavaComm 层并直接使用 JTermios。
通过 posix read/write 调用将数据传入和传出通道实现 sourced/sunk 的最佳方式是什么?我应该 subclass 抽象通道类型之一还是使用现有的具体通道之一?为此,我目前正在使用 EmbededChannels 作为一种双向队列,但我的直觉是,这有点误用 class。想法?
最后听起来您最好实施您的自定义 "transport"。在最简单的情况下,这将是 AbstractChannel
的子 class 和与之一起使用的 EventLoop
/ EventLoopGroup
实现。
那么让这成为一个简单的 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);
}
}