Java Code Examples for org.apache.catalina.tribes.io.ChannelData#setOptions()

The following examples show how to use org.apache.catalina.tribes.io.ChannelData#setOptions() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: TcpFailureDetector.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
protected boolean memberAlive(Member mbr, byte[] msgData,
                                     boolean sendTest, boolean readTest,
                                     long readTimeout, long conTimeout,
                                     int optionFlag) {
    //could be a shutdown notification
    if ( Arrays.equals(mbr.getCommand(),Member.SHUTDOWN_PAYLOAD) ) return false;

    try (Socket socket = new Socket()) {
        InetAddress ia = InetAddress.getByAddress(mbr.getHost());
        InetSocketAddress addr = new InetSocketAddress(ia, mbr.getPort());
        socket.setSoTimeout((int)readTimeout);
        socket.connect(addr, (int) conTimeout);
        if ( sendTest ) {
            ChannelData data = new ChannelData(true);
            data.setAddress(getLocalMember(false));
            data.setMessage(new XByteBuffer(msgData,false));
            data.setTimestamp(System.currentTimeMillis());
            int options = optionFlag | Channel.SEND_OPTIONS_BYTE_MESSAGE;
            if ( readTest ) options = (options | Channel.SEND_OPTIONS_USE_ACK);
            else options = (options & (~Channel.SEND_OPTIONS_USE_ACK));
            data.setOptions(options);
            byte[] message = XByteBuffer.createDataPackage(data);
            socket.getOutputStream().write(message);
            if ( readTest ) {
                int length = socket.getInputStream().read(message);
                return length > 0;
            }
        }//end if
        return true;
    } catch (SocketTimeoutException | ConnectException | NoRouteToHostException noop) {
        //do nothing, we couldn't connect
    } catch (Exception x) {
        log.error(sm.getString("tcpFailureDetector.failureDetection.failed", mbr),x);
    }
    return false;
}
 
Example 2
Source File: StaticMembershipInterceptor.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
protected void sendMemberMessage(Member[] members, byte[] message) throws ChannelException {
    if ( members == null || members.length == 0 ) return;
    ChannelData data = new ChannelData(true);
    data.setAddress(getLocalMember(false));
    data.setTimestamp(System.currentTimeMillis());
    data.setOptions(getOptionFlag());
    data.setMessage(new XByteBuffer(message, false));
    super.sendMessage(members, data, null);
}
 
Example 3
Source File: TcpPingInterceptor.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
protected void sendPingMessage(Member[] members) {
    if ( members == null || members.length == 0 ) return;
    ChannelData data = new ChannelData(true);//generates a unique Id
    data.setAddress(getLocalMember(false));
    data.setTimestamp(System.currentTimeMillis());
    data.setOptions(getOptionFlag());
    data.setMessage(new XByteBuffer(TCP_PING_DATA, false));
    try {
        super.sendMessage(members, data, null);
    }catch (ChannelException x) {
        log.warn("Unable to send TCP ping.",x);
    }
}
 
Example 4
Source File: NonBlockingCoordinator.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
public ChannelData createData(CoordinationMessage msg, MemberImpl local) {
    msg.write();
    ChannelData data = new ChannelData(true);
    data.setAddress(local);
    data.setMessage(msg.getBuffer());
    data.setOptions(Channel.SEND_OPTIONS_USE_ACK);
    data.setTimestamp(System.currentTimeMillis());
    return data;
}
 
Example 5
Source File: TcpPingInterceptor.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
protected void sendPingMessage(Member[] members) {
    if ( members == null || members.length == 0 ) return;
    ChannelData data = new ChannelData(true);//generates a unique Id
    data.setAddress(getLocalMember(false));
    data.setTimestamp(System.currentTimeMillis());
    data.setOptions(getOptionFlag());
    data.setMessage(new XByteBuffer(TCP_PING_DATA, false));
    try {
        super.sendMessage(members, data, null);
    }catch (ChannelException x) {
        log.warn("Unable to send TCP ping.",x);
    }
}
 
Example 6
Source File: NonBlockingCoordinator.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
public ChannelData createData(CoordinationMessage msg, MemberImpl local) {
    msg.write();
    ChannelData data = new ChannelData(true);
    data.setAddress(local);
    data.setMessage(msg.getBuffer());
    data.setOptions(Channel.SEND_OPTIONS_USE_ACK);
    data.setTimestamp(System.currentTimeMillis());
    return data;
}
 
Example 7
Source File: StaticMembershipInterceptor.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
protected void sendMemberMessage(Member[] members, byte[] message) throws ChannelException {
    if ( members == null || members.length == 0 ) return;
    ChannelData data = new ChannelData(true);
    data.setAddress(getLocalMember(false));
    data.setTimestamp(System.currentTimeMillis());
    data.setOptions(getOptionFlag());
    data.setMessage(new XByteBuffer(message, false));
    super.sendMessage(members, data, null);
}
 
Example 8
Source File: TcpPingInterceptor.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
protected void sendPingMessage(Member[] members) {
    if ( members == null || members.length == 0 ) return;
    ChannelData data = new ChannelData(true);//generates a unique Id
    data.setAddress(getLocalMember(false));
    data.setTimestamp(System.currentTimeMillis());
    data.setOptions(getOptionFlag());
    data.setMessage(new XByteBuffer(TCP_PING_DATA, false));
    try {
        super.sendMessage(members, data, null);
    }catch (ChannelException x) {
        log.warn(sm.getString("tcpPingInterceptor.ping.failed"),x);
    }
}
 
Example 9
Source File: NonBlockingCoordinator.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
public ChannelData createData(CoordinationMessage msg, Member local) {
    msg.write();
    ChannelData data = new ChannelData(true);
    data.setAddress(local);
    data.setMessage(msg.getBuffer());
    data.setOptions(Channel.SEND_OPTIONS_USE_ACK);
    data.setTimestamp(System.currentTimeMillis());
    return data;
}
 
Example 10
Source File: GroupChannel.java    From Tomcat7.0.67 with Apache License 2.0 4 votes vote down vote up
/**
 *
 * @param destination Member[] - destination.length > 0
 * @param msg Serializable - the message to send
 * @param options int - sender options, options can trigger guarantee levels and different interceptors to
 * react to the message see class documentation for the <code>Channel</code> object.<br>
 * @param handler - callback object for error handling and completion notification, used when a message is
 * sent asynchronously using the <code>Channel.SEND_OPTIONS_ASYNCHRONOUS</code> flag enabled.
 * @return UniqueId - the unique Id that was assigned to this message
 * @throws ChannelException - if an error occurs processing the message
 * @see org.apache.catalina.tribes.Channel
 */
@Override
public UniqueId send(Member[] destination, Serializable msg, int options, ErrorHandler handler) throws ChannelException {
    if ( msg == null ) throw new ChannelException("Cant send a NULL message");
    XByteBuffer buffer = null;
    try {
        if ( destination == null || destination.length == 0) throw new ChannelException("No destination given");
        ChannelData data = new ChannelData(true);//generates a unique Id
        data.setAddress(getLocalMember(false));
        data.setTimestamp(System.currentTimeMillis());
        byte[] b = null;
        if ( msg instanceof ByteMessage ){
            b = ((ByteMessage)msg).getMessage();
            options = options | SEND_OPTIONS_BYTE_MESSAGE;
        } else {
            b = XByteBuffer.serialize(msg);
            options = options & (~SEND_OPTIONS_BYTE_MESSAGE);
        }
        data.setOptions(options);
        //XByteBuffer buffer = new XByteBuffer(b.length+128,false);
        buffer = BufferPool.getBufferPool().getBuffer(b.length+128, false);
        buffer.append(b,0,b.length);
        data.setMessage(buffer);
        InterceptorPayload payload = null;
        if ( handler != null ) {
            payload = new InterceptorPayload();
            payload.setErrorHandler(handler);
        }
        getFirstInterceptor().sendMessage(destination, data, payload);
        if ( Logs.MESSAGES.isTraceEnabled() ) {
            Logs.MESSAGES.trace("GroupChannel - Sent msg:" + new UniqueId(data.getUniqueId()) + " at " +new java.sql.Timestamp(System.currentTimeMillis())+ " to "+Arrays.toNameString(destination));
            Logs.MESSAGES.trace("GroupChannel - Send Message:" + new UniqueId(data.getUniqueId()) + " is " +msg);
        }

        return new UniqueId(data.getUniqueId());
    }catch ( Exception x ) {
        if ( x instanceof ChannelException ) throw (ChannelException)x;
        throw new ChannelException(x);
    } finally {
        if ( buffer != null ) BufferPool.getBufferPool().returnBuffer(buffer);
    }
}
 
Example 11
Source File: TcpFailureDetector.java    From Tomcat7.0.67 with Apache License 2.0 4 votes vote down vote up
protected static boolean memberAlive(Member mbr, byte[] msgData,
                                     boolean sendTest, boolean readTest,
                                     long readTimeout, long conTimeout,
                                     int optionFlag) {
    //could be a shutdown notification
    if ( Arrays.equals(mbr.getCommand(),Member.SHUTDOWN_PAYLOAD) ) return false;

    Socket socket = new Socket();
    try {
        InetAddress ia = InetAddress.getByAddress(mbr.getHost());
        InetSocketAddress addr = new InetSocketAddress(ia, mbr.getPort());
        socket.setSoTimeout((int)readTimeout);
        socket.connect(addr, (int) conTimeout);
        if ( sendTest ) {
            ChannelData data = new ChannelData(true);
            data.setAddress(mbr);
            data.setMessage(new XByteBuffer(msgData,false));
            data.setTimestamp(System.currentTimeMillis());
            int options = optionFlag | Channel.SEND_OPTIONS_BYTE_MESSAGE;
            if ( readTest ) options = (options | Channel.SEND_OPTIONS_USE_ACK);
            else options = (options & (~Channel.SEND_OPTIONS_USE_ACK));
            data.setOptions(options);
            byte[] message = XByteBuffer.createDataPackage(data);
            socket.getOutputStream().write(message);
            if ( readTest ) {
                int length = socket.getInputStream().read(message);
                return length > 0;
            }
        }//end if
        return true;
    } catch ( SocketTimeoutException sx) {
        //do nothing, we couldn't connect
    } catch ( ConnectException cx) {
        //do nothing, we couldn't connect
    }catch (Exception x ) {
        log.error("Unable to perform failure detection check, assuming member down.",x);
    } finally {
        try {socket.close(); } catch ( Exception ignore ){}
    }
    return false;
}
 
Example 12
Source File: SocketNioSend.java    From Tomcat8-Source-Read with MIT License 4 votes vote down vote up
public static void main(String[] args) throws Exception {
    Selector selector = Selector.open();
    Member mbr = new MemberImpl("localhost", 9999, 0);
    ChannelData data = new ChannelData();
    data.setOptions(Channel.SEND_OPTIONS_BYTE_MESSAGE);
    data.setAddress(mbr);
    byte[] buf = new byte[8192 * 4];
    data.setMessage(new XByteBuffer(buf,false));
    buf = XByteBuffer.createDataPackage(data);
    int len = buf.length;
    BigDecimal total = new BigDecimal((double)0);
    BigDecimal bytes = new BigDecimal((double)len);
    NioSender sender = new NioSender();
    sender.setDestination(mbr);
    sender.setDirectBuffer(true);
    sender.setSelector(selector);
    sender.setTxBufSize(1024*1024);
    sender.connect();
    sender.setMessage(buf);
    System.out.println("Writing to 9999");
    long start = 0;
    double mb = 0;
    boolean first = true;
    int count = 0;
    DecimalFormat df = new DecimalFormat("##.00");
    while (count<100000) {
        if (first) {
            first = false;
            start = System.currentTimeMillis();
        }
        sender.setMessage(buf);
        int selectedKeys = 0;
        try {
            selectedKeys = selector.select(0);
        } catch (Exception e) {
            e.printStackTrace();
            continue;
        }

        if (selectedKeys == 0) {
            continue;
        }

        Iterator<SelectionKey> it = selector.selectedKeys().iterator();
        while (it.hasNext()) {
            SelectionKey sk = it.next();
            it.remove();
            try {
                int readyOps = sk.readyOps();
                sk.interestOps(sk.interestOps() & ~readyOps);
                if (sender.process(sk, false)) {
                    total = total.add(bytes);
                    sender.reset();
                    sender.setMessage(buf);
                    mb += ( (double) len) / 1024 / 1024;
                    if ( ( (++count) % 10000) == 0) {
                        long time = System.currentTimeMillis();
                        double seconds = ( (double) (time - start)) / 1000;
                        System.out.println("Throughput " + df.format(mb / seconds) + " MB/seconds, total "+mb+" MB, total "+total+" bytes.");
                    }
                }

            } catch (Throwable t) {
                t.printStackTrace();
                return;
            }
        }
        selector.selectedKeys().clear();
    }
    System.out.println("Complete, sleeping 15 seconds");
    Thread.sleep(15000);
}
 
Example 13
Source File: SocketNioSend.java    From Tomcat7.0.67 with Apache License 2.0 4 votes vote down vote up
public static void main(String[] args) throws Exception {
    Selector selector;
    synchronized (Selector.class) {
        // Selector.open() isn't thread safe
        // http://bugs.sun.com/view_bug.do?bug_id=6427854
        // Affects 1.6.0_29, fixed in 1.7.0_01
        selector = Selector.open();
    }
    Member mbr = new MemberImpl("localhost", 9999, 0);
    ChannelData data = new ChannelData();
    data.setOptions(Channel.SEND_OPTIONS_BYTE_MESSAGE);
    data.setAddress(mbr);
    byte[] buf = new byte[8192 * 4];
    data.setMessage(new XByteBuffer(buf,false));
    buf = XByteBuffer.createDataPackage(data);
    int len = buf.length;
    BigDecimal total = new BigDecimal((double)0);
    BigDecimal bytes = new BigDecimal((double)len);
    NioSender sender = new NioSender();
    sender.setDestination(mbr);
    sender.setDirectBuffer(true);
    sender.setSelector(selector);
    sender.setTxBufSize(1024*1024);
    sender.connect();
    sender.setMessage(buf);
    System.out.println("Writing to 9999");
    long start = 0;
    double mb = 0;
    boolean first = true;
    int count = 0;
    DecimalFormat df = new DecimalFormat("##.00");
    while (count<100000) {
        if (first) {
            first = false;
            start = System.currentTimeMillis();
        }
        sender.setMessage(buf);
        int selectedKeys = 0;
        try {
            selectedKeys = selector.select(0);
        } catch (Exception e) {
            e.printStackTrace();
            continue;
        }

        if (selectedKeys == 0) {
            continue;
        }

        Iterator<SelectionKey> it = selector.selectedKeys().iterator();
        while (it.hasNext()) {
            SelectionKey sk = it.next();
            it.remove();
            try {
                int readyOps = sk.readyOps();
                sk.interestOps(sk.interestOps() & ~readyOps);
                if (sender.process(sk, false)) {
                    total = total.add(bytes);
                    sender.reset();
                    sender.setMessage(buf);
                    mb += ( (double) len) / 1024 / 1024;
                    if ( ( (++count) % 10000) == 0) {
                        long time = System.currentTimeMillis();
                        double seconds = ( (double) (time - start)) / 1000;
                        System.out.println("Throughput " + df.format(mb / seconds) + " MB/seconds, total "+mb+" MB, total "+total+" bytes.");
                    }
                }

            } catch (Throwable t) {
                t.printStackTrace();
                return;
            }
        }
        selector.selectedKeys().clear();
    }
    System.out.println("Complete, sleeping 15 seconds");
    Thread.sleep(15000);
}
 
Example 14
Source File: GroupChannel.java    From tomcatsrc with Apache License 2.0 4 votes vote down vote up
/**
 *
 * @param destination Member[] - destination.length > 0
 * @param msg Serializable - the message to send
 * @param options int - sender options, options can trigger guarantee levels and different interceptors to
 * react to the message see class documentation for the <code>Channel</code> object.<br>
 * @param handler - callback object for error handling and completion notification, used when a message is
 * sent asynchronously using the <code>Channel.SEND_OPTIONS_ASYNCHRONOUS</code> flag enabled.
 * @return UniqueId - the unique Id that was assigned to this message
 * @throws ChannelException - if an error occurs processing the message
 * @see org.apache.catalina.tribes.Channel
 */
@Override
public UniqueId send(Member[] destination, Serializable msg, int options, ErrorHandler handler) throws ChannelException {
    if ( msg == null ) throw new ChannelException("Cant send a NULL message");
    XByteBuffer buffer = null;
    try {
        if ( destination == null || destination.length == 0) throw new ChannelException("No destination given");
        ChannelData data = new ChannelData(true);//generates a unique Id
        data.setAddress(getLocalMember(false));
        data.setTimestamp(System.currentTimeMillis());
        byte[] b = null;
        if ( msg instanceof ByteMessage ){
            b = ((ByteMessage)msg).getMessage();
            options = options | SEND_OPTIONS_BYTE_MESSAGE;
        } else {
            b = XByteBuffer.serialize(msg);
            options = options & (~SEND_OPTIONS_BYTE_MESSAGE);
        }
        data.setOptions(options);
        //XByteBuffer buffer = new XByteBuffer(b.length+128,false);
        buffer = BufferPool.getBufferPool().getBuffer(b.length+128, false);
        buffer.append(b,0,b.length);
        data.setMessage(buffer);
        InterceptorPayload payload = null;
        if ( handler != null ) {
            payload = new InterceptorPayload();
            payload.setErrorHandler(handler);
        }
        getFirstInterceptor().sendMessage(destination, data, payload);
        if ( Logs.MESSAGES.isTraceEnabled() ) {
            Logs.MESSAGES.trace("GroupChannel - Sent msg:" + new UniqueId(data.getUniqueId()) + " at " +new java.sql.Timestamp(System.currentTimeMillis())+ " to "+Arrays.toNameString(destination));
            Logs.MESSAGES.trace("GroupChannel - Send Message:" + new UniqueId(data.getUniqueId()) + " is " +msg);
        }

        return new UniqueId(data.getUniqueId());
    }catch ( Exception x ) {
        if ( x instanceof ChannelException ) throw (ChannelException)x;
        throw new ChannelException(x);
    } finally {
        if ( buffer != null ) BufferPool.getBufferPool().returnBuffer(buffer);
    }
}
 
Example 15
Source File: TcpFailureDetector.java    From tomcatsrc with Apache License 2.0 4 votes vote down vote up
protected static boolean memberAlive(Member mbr, byte[] msgData,
                                     boolean sendTest, boolean readTest,
                                     long readTimeout, long conTimeout,
                                     int optionFlag) {
    //could be a shutdown notification
    if ( Arrays.equals(mbr.getCommand(),Member.SHUTDOWN_PAYLOAD) ) return false;

    Socket socket = new Socket();
    try {
        InetAddress ia = InetAddress.getByAddress(mbr.getHost());
        InetSocketAddress addr = new InetSocketAddress(ia, mbr.getPort());
        socket.setSoTimeout((int)readTimeout);
        socket.connect(addr, (int) conTimeout);
        if ( sendTest ) {
            ChannelData data = new ChannelData(true);
            data.setAddress(mbr);
            data.setMessage(new XByteBuffer(msgData,false));
            data.setTimestamp(System.currentTimeMillis());
            int options = optionFlag | Channel.SEND_OPTIONS_BYTE_MESSAGE;
            if ( readTest ) options = (options | Channel.SEND_OPTIONS_USE_ACK);
            else options = (options & (~Channel.SEND_OPTIONS_USE_ACK));
            data.setOptions(options);
            byte[] message = XByteBuffer.createDataPackage(data);
            socket.getOutputStream().write(message);
            if ( readTest ) {
                int length = socket.getInputStream().read(message);
                return length > 0;
            }
        }//end if
        return true;
    } catch ( SocketTimeoutException sx) {
        //do nothing, we couldn't connect
    } catch ( ConnectException cx) {
        //do nothing, we couldn't connect
    }catch (Exception x ) {
        log.error("Unable to perform failure detection check, assuming member down.",x);
    } finally {
        try {socket.close(); } catch ( Exception ignore ){}
    }
    return false;
}
 
Example 16
Source File: GroupChannel.java    From Tomcat8-Source-Read with MIT License 4 votes vote down vote up
/**
 *
 * @param destination Member[] - destination.length &gt; 0
 * @param msg Serializable - the message to send
 * @param options sender options, options can trigger guarantee levels and different
 *                interceptors to react to the message see class documentation for the
 *                <code>Channel</code> object.<br>
 * @param handler - callback object for error handling and completion notification,
 *                  used when a message is sent asynchronously using the
 *                  <code>Channel.SEND_OPTIONS_ASYNCHRONOUS</code> flag enabled.
 * @return UniqueId - the unique Id that was assigned to this message
 * @throws ChannelException - if an error occurs processing the message
 * @see org.apache.catalina.tribes.Channel
 */
@Override
public UniqueId send(Member[] destination, Serializable msg, int options, ErrorHandler handler)
        throws ChannelException {
    if ( msg == null ) throw new ChannelException(sm.getString("groupChannel.nullMessage"));
    XByteBuffer buffer = null;
    try {
        if (destination == null || destination.length == 0) {
            throw new ChannelException(sm.getString("groupChannel.noDestination"));
        }
        ChannelData data = new ChannelData(true);//generates a unique Id
        data.setAddress(getLocalMember(false));
        data.setTimestamp(System.currentTimeMillis());
        byte[] b = null;
        if ( msg instanceof ByteMessage ){
            b = ((ByteMessage)msg).getMessage();
            options = options | SEND_OPTIONS_BYTE_MESSAGE;
        } else {
            b = XByteBuffer.serialize(msg);
            options = options & (~SEND_OPTIONS_BYTE_MESSAGE);
        }
        data.setOptions(options);
        //XByteBuffer buffer = new XByteBuffer(b.length+128,false);
        buffer = BufferPool.getBufferPool().getBuffer(b.length+128, false);
        buffer.append(b,0,b.length);
        data.setMessage(buffer);
        InterceptorPayload payload = null;
        if ( handler != null ) {
            payload = new InterceptorPayload();
            payload.setErrorHandler(handler);
        }
        getFirstInterceptor().sendMessage(destination, data, payload);
        if ( Logs.MESSAGES.isTraceEnabled() ) {
            Logs.MESSAGES.trace("GroupChannel - Sent msg:" + new UniqueId(data.getUniqueId()) +
                    " at " + new java.sql.Timestamp(System.currentTimeMillis()) + " to " +
                    Arrays.toNameString(destination));
            Logs.MESSAGES.trace("GroupChannel - Send Message:" +
                    new UniqueId(data.getUniqueId()) + " is " + msg);
        }

        return new UniqueId(data.getUniqueId());
    } catch (RuntimeException | IOException e) {
        throw new ChannelException(e);
    } finally {
        if ( buffer != null ) BufferPool.getBufferPool().returnBuffer(buffer);
    }
}
 
Example 17
Source File: SocketNioSend.java    From tomcatsrc with Apache License 2.0 4 votes vote down vote up
public static void main(String[] args) throws Exception {
    Selector selector;
    synchronized (Selector.class) {
        // Selector.open() isn't thread safe
        // http://bugs.sun.com/view_bug.do?bug_id=6427854
        // Affects 1.6.0_29, fixed in 1.7.0_01
        selector = Selector.open();
    }
    Member mbr = new MemberImpl("localhost", 9999, 0);
    ChannelData data = new ChannelData();
    data.setOptions(Channel.SEND_OPTIONS_BYTE_MESSAGE);
    data.setAddress(mbr);
    byte[] buf = new byte[8192 * 4];
    data.setMessage(new XByteBuffer(buf,false));
    buf = XByteBuffer.createDataPackage(data);
    int len = buf.length;
    BigDecimal total = new BigDecimal((double)0);
    BigDecimal bytes = new BigDecimal((double)len);
    NioSender sender = new NioSender();
    sender.setDestination(mbr);
    sender.setDirectBuffer(true);
    sender.setSelector(selector);
    sender.setTxBufSize(1024*1024);
    sender.connect();
    sender.setMessage(buf);
    System.out.println("Writing to 9999");
    long start = 0;
    double mb = 0;
    boolean first = true;
    int count = 0;
    DecimalFormat df = new DecimalFormat("##.00");
    while (count<100000) {
        if (first) {
            first = false;
            start = System.currentTimeMillis();
        }
        sender.setMessage(buf);
        int selectedKeys = 0;
        try {
            selectedKeys = selector.select(0);
        } catch (Exception e) {
            e.printStackTrace();
            continue;
        }

        if (selectedKeys == 0) {
            continue;
        }

        Iterator<SelectionKey> it = selector.selectedKeys().iterator();
        while (it.hasNext()) {
            SelectionKey sk = it.next();
            it.remove();
            try {
                int readyOps = sk.readyOps();
                sk.interestOps(sk.interestOps() & ~readyOps);
                if (sender.process(sk, false)) {
                    total = total.add(bytes);
                    sender.reset();
                    sender.setMessage(buf);
                    mb += ( (double) len) / 1024 / 1024;
                    if ( ( (++count) % 10000) == 0) {
                        long time = System.currentTimeMillis();
                        double seconds = ( (double) (time - start)) / 1000;
                        System.out.println("Throughput " + df.format(mb / seconds) + " MB/seconds, total "+mb+" MB, total "+total+" bytes.");
                    }
                }

            } catch (Throwable t) {
                t.printStackTrace();
                return;
            }
        }
        selector.selectedKeys().clear();
    }
    System.out.println("Complete, sleeping 15 seconds");
    Thread.sleep(15000);
}