use of org.apache.hc.core5.http.nio.command.ShutdownCommand in project httpcomponents-core by apache.
the class AbstractH2StreamMultiplexer method processPendingCommands.
private void processPendingCommands() throws IOException, HttpException {
while (streamMap.size() < remoteConfig.getMaxConcurrentStreams()) {
final Command command = ioSession.poll();
if (command == null) {
break;
}
if (command instanceof ShutdownCommand) {
final ShutdownCommand shutdownCommand = (ShutdownCommand) command;
if (shutdownCommand.getType() == CloseMode.IMMEDIATE) {
for (final Iterator<Map.Entry<Integer, H2Stream>> it = streamMap.entrySet().iterator(); it.hasNext(); ) {
final Map.Entry<Integer, H2Stream> entry = it.next();
final H2Stream stream = entry.getValue();
stream.cancel();
}
streamMap.clear();
connState = ConnectionHandshake.SHUTDOWN;
} else {
if (connState.compareTo(ConnectionHandshake.ACTIVE) <= 0) {
final RawFrame goAway = frameFactory.createGoAway(processedRemoteStreamId, H2Error.NO_ERROR, "Graceful shutdown");
commitFrame(goAway);
connState = streamMap.isEmpty() ? ConnectionHandshake.SHUTDOWN : ConnectionHandshake.GRACEFUL_SHUTDOWN;
}
}
break;
} else if (command instanceof PingCommand) {
final PingCommand pingCommand = (PingCommand) command;
final AsyncPingHandler handler = pingCommand.getHandler();
pingHandlers.add(handler);
final RawFrame ping = frameFactory.createPing(handler.getData());
commitFrame(ping);
} else if (command instanceof ExecutableCommand) {
final int streamId = generateStreamId();
final H2StreamChannelImpl channel = new H2StreamChannelImpl(streamId, true, initInputWinSize, initOutputWinSize);
final ExecutableCommand executableCommand = (ExecutableCommand) command;
final H2StreamHandler streamHandler = createLocallyInitiatedStream(executableCommand, channel, httpProcessor, connMetrics);
final H2Stream stream = new H2Stream(channel, streamHandler, false);
streamMap.put(streamId, stream);
if (streamListener != null) {
final int initInputWindow = stream.getInputWindow().get();
streamListener.onInputFlowControl(this, streamId, initInputWindow, initInputWindow);
final int initOutputWindow = stream.getOutputWindow().get();
streamListener.onOutputFlowControl(this, streamId, initOutputWindow, initOutputWindow);
}
if (stream.isOutputReady()) {
stream.produceOutput();
}
final CancellableDependency cancellableDependency = executableCommand.getCancellableDependency();
if (cancellableDependency != null) {
cancellableDependency.setDependency(stream::abort);
}
if (!outputQueue.isEmpty()) {
return;
}
}
}
}
use of org.apache.hc.core5.http.nio.command.ShutdownCommand in project httpcomponents-core by apache.
the class AbstractHttp1StreamDuplexer method processCommands.
private void processCommands() throws HttpException, IOException {
for (; ; ) {
final Command command = ioSession.poll();
if (command == null) {
return;
}
if (command instanceof ShutdownCommand) {
final ShutdownCommand shutdownCommand = (ShutdownCommand) command;
requestShutdown(shutdownCommand.getType());
} else if (command instanceof RequestExecutionCommand) {
if (connState.compareTo(ConnectionState.GRACEFUL_SHUTDOWN) >= 0) {
command.cancel();
} else {
execute((RequestExecutionCommand) command);
return;
}
} else {
throw new HttpException("Unexpected command: " + command.getClass());
}
}
}
Aggregations