Esempio n. 1
0
  /** {@inheritDoc} */
  @Override
  public long read(final SelectionKey key) throws IOException {
    final DatagramChannel channel = (DatagramChannel) key.channel();
    final MessageBufferProducer<ByteBuffer> chnOut = getChannelOutput();
    final int start = receiveBuffer.position();
    final SocketAddress source = channel.receive(receiveBuffer);
    if (source == null) {
      return 0;
    }
    final int n = receiveBuffer.position() - start;

    limiter.receive(n);

    receiveBuffer.flip();
    while (codec.hasNext(receiveBuffer)) {
      try {
        final long sequence = chnOut.acquire();
        try {
          final ByteBuffer buffer = chnOut.get(sequence);
          buffer.clear();
          codec.get(receiveBuffer, buffer);
          buffer.flip();
          chnOut.attach(sequence, source);
        } finally {
          chnOut.release(sequence);
        }
      } catch (final InterruptedException e) {
        throw new IOException(e);
      }
    }
    if (receiveBuffer.remaining() > 0) {
      receiveBuffer.compact();
    } else {
      receiveBuffer.clear();
    }
    return n;
  }