장기 실행 HTTP 요청을 처리하는 부두 서버가 있습니다. 응답은 다른 프로세스 X 및 Jetty가 주기적으로 요청하는 수집기 해시로 끝납니다.Jetty 예외 처리 방법 - 장기 실행 HTTP 요청은 시간이 초과되지만 호출 프로세스는 종료되지 않고 Jetty는 불만입니다.
3 경우가 있습니다 : X는 HTTP 요청의 제한 시간 전에 완료되지
- 프로세스 -
- 프로세스 X가 요청의 제한 시간 후 종료 문제 - 아니 문제
- 에게 프로세스 X가 완료되지 않음 - 예외가 발생했습니다.
이 상황을 감지하고 (3) 어떻게 예외를 방지합니까? 다른 두 가지 사례가 제대로 작동하도록 할 수 있습니까?
예외 : HTTP 요청의
2012-06-18 00:13:31.055:WARN:oejut.QueuedThreadPool:
java.lang.IllegalStateException: IDLE,initial
at org.eclipse.jetty.server.AsyncContinuation.complete(AsyncContinuation.java:569)
at server.AsyncHTTPRequestProcessor.run(AsyncHTTPRequestProcessor.java:72)
at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1119)
at org.eclipse.jetty.server.AsyncContinuation$1.run(AsyncContinuation.java:875)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534)
at java.lang.Thread.run(Thread.java:679)
부두 계속은 :
public class AsyncHTTPRequestProcessor implements Runnable {
private ConcurrentHashMap<String, String> collector;
private Logger logger;
private AsyncContext ctx;
//Defined this here because of strange behaviour when running junit
//tests and the response json string being empty...
private String responseStr = null;
public AsyncHTTPRequestProcessor(AsyncContext _ctx,
ConcurrentHashMap<String, String> _collector, Logger _logger) {
ctx = _ctx;
collector = _collector;
logger = _logger;
}
@Override
public void run() {
logger.info("AsyncContinuation start");
//if(!((AsyncContinuation)ctx).isInitial()){
String rid = (String) ctx.getRequest().getAttribute("rid");
int elapsed = 0;
if(rid !=null)
{
logger.info("AsyncContinuation rid="+rid);
while(elapsed<ctx.getTimeout())
{
if(collector.containsKey(rid)){
responseStr = collector.get(rid);
collector.remove(rid);
logger.info("--->API http request in collector:"+responseStr);
ctx.getRequest().setAttribute("status",200);
ctx.getRequest().setAttribute("response", responseStr);
ctx.getRequest().setAttribute("endTime",System.currentTimeMillis());
//ctx.complete();
break;
}
try {
Thread.sleep(10);
elapsed+=10;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//}
logger.info("Collector in async stuff:");
for(String key:collector.keySet()){
logger.info(key+"->"+collector.get(key));
}
for(Entry<String, String> x:collector.entrySet()){
logger.info(x.getKey()+"->"+x.getValue());
}
ctx.complete(); <---- this line 72
}
}
}
동일한 문제가 있습니다. 나는 그것을 해결하려고 노력하고있다. 곧 나는 할 수있는 한 대답을 할 것입니다. –
프로세스가 완료되지 않으면 예외가 어떻게 발생합니까? –