Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   * Copyright 2014 Red Hat, Inc., and individual contributors
   * as indicated by the @author tags.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  *  Unless required by applicable law or agreed to in writing, software
  *  distributed under the License is distributed on an "AS IS" BASIS,
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
 
 package io.undertow.conduits;
 
 
 
Wrapper for read timeout. This should always be the first wrapper applied to the underlying channel.

Author(s):
Stuart Douglas
See also:
org.xnio.Options.READ_TIMEOUT
 
 
     private XnioExecutor.Key handle;
     private final StreamConnection connection;
     private volatile long expireTime = -1;
     private final OpenListener openListener;
 
     private static final int FUZZ_FACTOR = 50; //we add 50ms to the timeout to make sure the underlying channel has actually timed out
 
     private final Runnable timeoutCommand = new Runnable() {
         @Override
         public void run() {
              = null;
             if ( == -1) {
                 return;
             }
             long current = System.currentTimeMillis();
             if (current  < ) {
                 //timeout has been bumped, re-schedule
                  = .getIoThread().executeAfter(, ( - current) + .);
                 return;
             }
             ..tracef("Timing out channel %s due to inactivity");
             IoUtils.safeClose();
             if (.getSourceChannel().isReadResumed()) {
                 ChannelListeners.invokeChannelListener(.getSourceChannel(), .getSourceChannel().getReadListener());
             }
             if (.getSinkChannel().isWriteResumed()) {
                 ChannelListeners.invokeChannelListener(.getSinkChannel(), .getSinkChannel().getWriteListener());
             }
         }
     };
 
     public ReadTimeoutStreamSourceConduit(final StreamSourceConduit delegateStreamConnection connectionOpenListener openListener) {
         super(delegate);
         this. = connection;
         this. = openListener;
     }
 
     private void handleReadTimeout(final long retthrows IOException {
         if (!.isOpen()) {
             return;
         }
         if (ret == 0 &&  != null) {
             return;
         }
         Integer timeout = getTimeout();
         if (timeout == null || timeout <= 0) {
             return;
         }
         long currentTime = System.currentTimeMillis();
         long expireTimeVar = ;
         if (expireTimeVar != -1 && currentTime > expireTimeVar) {
             IoUtils.safeClose();
            throw new ClosedChannelException();
        }
         = currentTime + timeout;
        XnioExecutor.Key key = ;
        if (key == null) {
        }
    }
    @Override
    public long transferTo(final long positionfinal long countfinal FileChannel targetthrows IOException {
        long ret = super.transferTo(positioncounttarget);
        handleReadTimeout(ret);
        return ret;
    }
    @Override
    public long transferTo(final long countfinal ByteBuffer throughBufferfinal StreamSinkChannel targetthrows IOException {
        long ret = super.transferTo(countthroughBuffertarget);
        handleReadTimeout(ret);
        return ret;
    }
    @Override
    public long read(final ByteBuffer[] dstsfinal int offsetfinal int lengththrows IOException {
        long ret = super.read(dstsoffsetlength);
        handleReadTimeout(ret);
        return ret;
    }
    @Override
    public int read(final ByteBuffer dstthrows IOException {
        int ret = super.read(dst);
        handleReadTimeout(ret);
        return ret;
    }
    @Override
    public void awaitReadable() throws IOException {
        Integer timeout = getTimeout();
        if (timeout != null && timeout > 0) {
            super.awaitReadable(timeout + .);
        } else {
            super.awaitReadable();
        }
    }
    @Override
    public void awaitReadable(long timeTimeUnit timeUnitthrows IOException {
        Integer timeout = getTimeout();
        if (timeout != null && timeout > 0) {
            long millis = timeUnit.toMillis(time);
            super.awaitReadable(Math.min(millis, timeout + ), .);
        } else {
            super.awaitReadable(timetimeUnit);
        }
    }
    private Integer getTimeout() throws IOException {
        if ((timeout == null || timeout <= 0) && idleTimeout != null) {
            timeout = idleTimeout;
        } else if (timeout != null && idleTimeout != null && idleTimeout > 0) {
            timeout = Math.min(timeoutidleTimeout);
        }
        return timeout;
    }
New to GrepCode? Check out our FAQ X