2012-06-23 2 views
5

Во-первых, вот ссылка, где я прочитал все, что я знаю, в настоящее время в отношении этого вопроса: http://docs.jboss.org/netty/3.2/api/org/jboss/netty/bootstrap/ServerBootstrap.html#bind%28%29Netty ServerBootstrap - асинхронная привязка?

Хотя явно не указано в документации, то казалось бы, что ServerBootstrap.bind синхронно - потому что он не возвращает ChannelFuture, а скорее канал. Если это так, то я не вижу никакого способа сделать асинхронную привязку, используя класс ServerBootstrap. Я что-то упустил или мне придется катить свое решение?

С наилучших пожеланиями

ответ

4

я в конечном итоге прокатками моей собственной реализации самозагрузки со следующим дополнением:

public ChannelFuture bindAsync(final SocketAddress localAddress) 
{ 
    if (localAddress == null) { 
     throw new NullPointerException("localAddress"); 
    } 
    final BlockingQueue<ChannelFuture> futureQueue = 
     new LinkedBlockingQueue<ChannelFuture>(); 
    ChannelHandler binder = new Binder(localAddress, futureQueue); 
    ChannelHandler parentHandler = getParentHandler(); 
    ChannelPipeline bossPipeline = pipeline(); 
    bossPipeline.addLast("binder", binder); 
    if (parentHandler != null) { 
     bossPipeline.addLast("userHandler", parentHandler); 
    } 
    getFactory().newChannel(bossPipeline); 
    ChannelFuture future = null; 
    boolean interrupted = false; 
    do { 
     try { 
      future = futureQueue.poll(Integer.MAX_VALUE, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      interrupted = true; 
     } 
    } while (future == null); 
    if (interrupted) { 
     Thread.currentThread().interrupt(); 
    } 
    return future; 
}