2012-10-24 36 views
0

我想在java ee中使用java nio。 但我不知道该怎么做。 我需要在服务器部署之后java.nio.selector总是监听端口并处理套接字连接。 我尝试在那里做:在java ee中使用java nio

@Singleton 
@Lock(LockType.READ) 
public class TaskManager { 

    private static final int LISTENINGPORT; 

    static { 
     LISTENINGPORT = ConfigurationSettings.getConfigureSettings().getListeningPort(); 
    } 

    private ArrayList<ServerCalculationInfo> serverList; 

    public TaskManager() { 
     serverList = new ArrayList<ServerCalculationInfo>(); 
     select(); 
    } 

    @Asynchronous 
    public void select() { 
     try { 
      ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); 
      Selector selector = Selector.open(); 
      serverSocketChannel.configureBlocking(false); 
      serverSocketChannel.socket().bind(new InetSocketAddress(LISTENINGPORT)); 
      serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); 

      while (true) { 
       try { 
        selector.select(); 
       } catch (IOException ex) { 
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex); 
        break; 
       } 
       Iterator it = selector.selectedKeys().iterator(); 
       while (it.hasNext()) { 
        SelectionKey selKey = (SelectionKey) it.next(); 
        it.remove(); 
        try { 
         processSelectionKey(serverSocketChannel, selKey); 
        } catch (IOException e) { 
         serverList.remove(serverCalculationInfo); 
        } 
       } 
      } 

     } catch (IOException e) { 
      Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, e); 
     } catch (Exception e) { 
      Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, e); 
     } 
    } 
} 

它不能正常工作。该过程在部署期间挂起,只有在重新启动Glassfish后才能重新部署应用程序。 我该怎么办?

回答

1

如果从@PostConstructor调用@Asynchronous的方法是否能够正常工作:

@PostConstruct 
public void postTaskManager() { 
    serverList = new ArrayList<ServerCalculationInfo>(); 
    select(); 
} 

,而不是从构造函数中调用它。 但类必须没有@Startup注释。