import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.AsyncContext;
import org.apache.coyote.ActionCode;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.MutableInteger;
/**
*
* @author fhanik
@Override
public void complete() {
- // TODO SERVLET3 - async
- doInternalComplete(false);
+ if (state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING)) {
+ // TODO SERVLET3 - async
+ AtomicBoolean dispatched = new AtomicBoolean(false);
+ request.coyoteRequest.action(ActionCode.ACTION_ASYNC_COMPLETE,dispatched);
+ if (!dispatched.get()) doInternalComplete(false);
+ }
}
@Override
public void doInternalDispatch() throws ServletException, IOException {
if (this.state.compareAndSet(AsyncState.TIMING_OUT, AsyncState.DISPATCHED)) {
+ boolean listenerInvoked = false;
for (AsyncListenerWrapper listener : listeners) {
listener.fireOnTimeout();
+ listenerInvoked = true;
+ }
+ if (!listenerInvoked) {
+ ((HttpServletResponse)servletResponse).setStatus(500);
}
+ doInternalComplete(true);
} else if (this.state.compareAndSet(AsyncState.DISPATCHING, AsyncState.DISPATCHED)) {
if (this.dispatch!=null) {
try {
}catch (Exception x) {
log.error("",x);
}
- request.coyoteRequest.action(ActionCode.ACTION_ASYNC_COMPLETE,null);
recycle();
+
} else {
throw new IllegalStateException("Complete illegal. Invalid state:"+state.get());
}
import java.net.InetAddress;
import java.nio.channels.SelectionKey;
import java.util.StringTokenizer;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
async = true;
} else if (actionCode == ActionCode.ACTION_ASYNC_COMPLETE) {
//TODO SERVLET3 - async
+ AtomicBoolean dispatch = (AtomicBoolean)param;
asyncClose = true;
RequestInfo rp = request.getRequestProcessor();
- if ( rp.getStage() != org.apache.coyote.Constants.STAGE_SERVICE ) //async handling
- socket.getPoller().cometInterest(socket);
+ if ( rp.getStage() != org.apache.coyote.Constants.STAGE_SERVICE ) { //async handling
+ dispatch.set(true);
+ endpoint.processSocket(this.socket, SocketStatus.STOP, true);
+ }
} else if (actionCode == ActionCode.ACTION_ASYNC_SETTIMEOUT) {
//TODO SERVLET3 - async
if (param==null) return;