Search in sources :

Example 6 with NioSelectedKeySet

use of org.agrona.nio.NioSelectedKeySet in project aeron by real-logic.

the class HackSelectReceiveSendUdpPong method run.

private void run() throws IOException {
    final InetSocketAddress sendAddress = new InetSocketAddress("localhost", Common.PONG_PORT);
    final ByteBuffer buffer = ByteBuffer.allocateDirect(Configuration.MTU_LENGTH_DEFAULT);
    final DatagramChannel receiveChannel = DatagramChannel.open();
    Common.init(receiveChannel);
    receiveChannel.bind(new InetSocketAddress("localhost", Common.PING_PORT));
    final DatagramChannel sendChannel = DatagramChannel.open();
    Common.init(sendChannel);
    final Selector selector = Selector.open();
    final NioSelectedKeySet keySet = Common.keySet(selector);
    final ToIntFunction<SelectionKey> handler = (key) -> {
        try {
            buffer.clear();
            receiveChannel.receive(buffer);
            final long receivedSequenceNumber = buffer.getLong(0);
            final long receivedTimestamp = buffer.getLong(SIZE_OF_LONG);
            buffer.clear();
            buffer.putLong(receivedSequenceNumber);
            buffer.putLong(receivedTimestamp);
            buffer.flip();
            sendChannel.send(buffer, sendAddress);
        } catch (final IOException ex) {
            ex.printStackTrace();
        }
        return 1;
    };
    receiveChannel.register(selector, OP_READ, null);
    final AtomicBoolean running = new AtomicBoolean(true);
    SigInt.register(() -> running.set(false));
    while (true) {
        while (selector.selectNow() == 0) {
            if (!running.get()) {
                return;
            }
            ThreadHints.onSpinWait();
        }
        keySet.forEach(handler);
    }
}
Also used : ThreadHints(org.agrona.hints.ThreadHints) SelectionKey(java.nio.channels.SelectionKey) DatagramChannel(java.nio.channels.DatagramChannel) Selector(java.nio.channels.Selector) ToIntFunction(java.util.function.ToIntFunction) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) IOException(java.io.IOException) InetSocketAddress(java.net.InetSocketAddress) SigInt(org.agrona.concurrent.SigInt) ByteBuffer(java.nio.ByteBuffer) SIZE_OF_LONG(org.agrona.BitUtil.SIZE_OF_LONG) Configuration(io.aeron.driver.Configuration) NioSelectedKeySet(org.agrona.nio.NioSelectedKeySet) OP_READ(java.nio.channels.SelectionKey.OP_READ) SelectionKey(java.nio.channels.SelectionKey) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) NioSelectedKeySet(org.agrona.nio.NioSelectedKeySet) InetSocketAddress(java.net.InetSocketAddress) DatagramChannel(java.nio.channels.DatagramChannel) IOException(java.io.IOException) ByteBuffer(java.nio.ByteBuffer) Selector(java.nio.channels.Selector)

Aggregations

NioSelectedKeySet (org.agrona.nio.NioSelectedKeySet)6 IOException (java.io.IOException)4 InetSocketAddress (java.net.InetSocketAddress)4 DatagramChannel (java.nio.channels.DatagramChannel)4 Selector (java.nio.channels.Selector)4 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)4 Configuration (io.aeron.driver.Configuration)2 ByteBuffer (java.nio.ByteBuffer)2 SelectionKey (java.nio.channels.SelectionKey)2 OP_READ (java.nio.channels.SelectionKey.OP_READ)2 ToIntFunction (java.util.function.ToIntFunction)2 SIZE_OF_LONG (org.agrona.BitUtil.SIZE_OF_LONG)2 SigInt (org.agrona.concurrent.SigInt)2 ThreadHints (org.agrona.hints.ThreadHints)2