我有一个API,它使用netty打开到tcp服务器的客户端连接。服务器可以随时向客户端发送数据。我面临以下情况:
这就是我的期望:
这是我的连接方法的概述(显然有一个更大的API):
```
public FIXClient connect(String host, int port) throws Throwable {
...
ChannelPipeline pipe = org.jboss.netty.channel.Channels.pipeline(...);
ChannelFactory factory = new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
ClientBootstrap bootstrap = new ClientBootstrap(factory);
bootstrap.setPipeline(pipe);
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("keepAlive", true);
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
//forcing the connect call to block
//don't want clients to deal with async connect calls
future.awaitUninterruptibly();
if(future.isSuccess()){
this.channel = future.getChannel();
//channel.getCloseFuture();//TODO notifies whenever channel closes
}
else{
throw future.getCause();//wrap this in a more specific exception
}
return this;
}
```
答案 0 :(得分:2)
这与netty无关......如果你从那里调用它,你需要确保你的“主”方法不存在。否则就是容器的工作..
答案 1 :(得分:2)
有几种方法可以做到这一点,但我观察到的一件事就是用这段代码:
ChannelFactory factory = new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
...如果你成功连接,你的JVM一定不会自动关闭它,直到你强制它(如杀戮)或你在你的频道工厂调用releaseExternalResources()。这是因为:
所以我不确定你是否正确诊断了这个问题。话虽如此,我建议你这样处理任务:
我希望这有用。