当前位置: 首页>>代码示例>>Java>>正文


Java KeyAttachment.startWriteLatch方法代码示例

本文整理汇总了Java中org.apache.tomcat.util.net.NioEndpoint.KeyAttachment.startWriteLatch方法的典型用法代码示例。如果您正苦于以下问题:Java KeyAttachment.startWriteLatch方法的具体用法?Java KeyAttachment.startWriteLatch怎么用?Java KeyAttachment.startWriteLatch使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在org.apache.tomcat.util.net.NioEndpoint.KeyAttachment的用法示例。


在下文中一共展示了KeyAttachment.startWriteLatch方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。

示例1: write

import org.apache.tomcat.util.net.NioEndpoint.KeyAttachment; //导入方法依赖的package包/类
/**
 * Performs a blocking write using the bytebuffer for data to be written
 * If the <code>selector</code> parameter is null, then it will perform a busy write that could
 * take up a lot of CPU cycles.
 * @param buf ByteBuffer - the buffer containing the data, we will write as long as <code>(buf.hasRemaining()==true)</code>
 * @param socket SocketChannel - the socket to write data to
 * @param writeTimeout long - the timeout for this write operation in milliseconds, -1 means no timeout
 * @return int - returns the number of bytes written
 * @throws EOFException if write returns -1
 * @throws SocketTimeoutException if the write times out
 * @throws IOException if an IO Exception occurs in the underlying socket logic
 */
public int write(ByteBuffer buf, NioChannel socket, long writeTimeout)
        throws IOException {
    SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector());
    if ( key == null ) throw new IOException("Key no longer registered");
    KeyReference reference = keyReferenceQueue.poll();
    if (reference == null) {
        reference = new KeyReference();
    }
    KeyAttachment att = (KeyAttachment) key.attachment();
    int written = 0;
    boolean timedout = false;
    int keycount = 1; //assume we can write
    long time = System.currentTimeMillis(); //start the timeout timer
    try {
        while ( (!timedout) && buf.hasRemaining()) {
            if (keycount > 0) { //only write if we were registered for a write
                int cnt = socket.write(buf); //write the data
                if (cnt == -1)
                    throw new EOFException();
                written += cnt;
                if (cnt > 0) {
                    time = System.currentTimeMillis(); //reset our timeout timer
                    continue; //we successfully wrote, try again without a selector
                }
            }
            try {
                if ( att.getWriteLatch()==null || att.getWriteLatch().getCount()==0) att.startWriteLatch(1);
                poller.add(att,SelectionKey.OP_WRITE,reference);
                if (writeTimeout < 0) {
                    att.awaitWriteLatch(Long.MAX_VALUE,TimeUnit.MILLISECONDS);
                } else {
                    att.awaitWriteLatch(writeTimeout,TimeUnit.MILLISECONDS);
                }
            }catch (InterruptedException ignore) {
                Thread.interrupted();
            }
            if ( att.getWriteLatch()!=null && att.getWriteLatch().getCount()> 0) {
                //we got interrupted, but we haven't received notification from the poller.
                keycount = 0;
            }else {
                //latch countdown has happened
                keycount = 1;
                att.resetWriteLatch();
            }

            if (writeTimeout > 0 && (keycount == 0))
                timedout = (System.currentTimeMillis() - time) >= writeTimeout;
        } //while
        if (timedout)
            throw new SocketTimeoutException();
    } finally {
        poller.remove(att,SelectionKey.OP_WRITE);
        if (timedout && reference.key!=null) {
            poller.cancelKey(reference.key);
        }
        reference.key = null;
        keyReferenceQueue.add(reference);
    }
    return written;
}
 
开发者ID:liaokailin,项目名称:tomcat7,代码行数:73,代码来源:NioBlockingSelector.java

示例2: write

import org.apache.tomcat.util.net.NioEndpoint.KeyAttachment; //导入方法依赖的package包/类
/**
 * Performs a blocking write using the bytebuffer for data to be written
 * If the <code>selector</code> parameter is null, then it will perform a busy write that could
 * take up a lot of CPU cycles.
 * @param buf ByteBuffer - the buffer containing the data, we will write as long as <code>(buf.hasRemaining()==true)</code>
 * @param socket SocketChannel - the socket to write data to
 * @param writeTimeout long - the timeout for this write operation in milliseconds, -1 means no timeout
 * @return int - returns the number of bytes written
 * @throws EOFException if write returns -1
 * @throws SocketTimeoutException if the write times out
 * @throws IOException if an IO Exception occurs in the underlying socket logic
 */
public int write(ByteBuffer buf, NioChannel socket, long writeTimeout,MutableInteger lastWrite) throws IOException {
    SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector());
    if ( key == null ) throw new IOException("Key no longer registered");
    KeyReference reference = new KeyReference();
    KeyAttachment att = (KeyAttachment) key.attachment();
    int written = 0;
    boolean timedout = false;
    int keycount = 1; //assume we can write
    long time = System.currentTimeMillis(); //start the timeout timer
    try {
        while ( (!timedout) && buf.hasRemaining()) {
            if (keycount > 0) { //only write if we were registered for a write
                int cnt = socket.write(buf); //write the data
                if (lastWrite != null) lastWrite.set(cnt);
                if (cnt == -1)
                    throw new EOFException();
                written += cnt;
                if (cnt > 0) {
                    time = System.currentTimeMillis(); //reset our timeout timer
                    continue; //we successfully wrote, try again without a selector
                }
            }
            try {
                if ( att.getWriteLatch()==null || att.getWriteLatch().getCount()==0) att.startWriteLatch(1);
                poller.add(att,SelectionKey.OP_WRITE,reference);
                att.awaitWriteLatch(writeTimeout,TimeUnit.MILLISECONDS);
            }catch (InterruptedException ignore) {
                Thread.interrupted();
            }
            if ( att.getWriteLatch()!=null && att.getWriteLatch().getCount()> 0) {
                //we got interrupted, but we haven't received notification from the poller.
                keycount = 0;
            }else {
                //latch countdown has happened
                keycount = 1;
                att.resetWriteLatch();
            }

            if (writeTimeout > 0 && (keycount == 0))
                timedout = (System.currentTimeMillis() - time) >= writeTimeout;
        } //while
        if (timedout) 
            throw new SocketTimeoutException();
    } finally {
        poller.remove(att,SelectionKey.OP_WRITE);
        if (timedout && reference.key!=null) {
            poller.cancelKey(reference.key);
        }
        reference.key = null;
    }
    return written;
}
 
开发者ID:WhiteBearSolutions,项目名称:WBSAirback,代码行数:65,代码来源:NioBlockingSelector.java


注:本文中的org.apache.tomcat.util.net.NioEndpoint.KeyAttachment.startWriteLatch方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。