Java 在处理请求时使用异步servlet以及dispatch()和complete()方法的行为
我使用异步servlet来处理请求 根据文件:(,) 我不明白它们是如何工作的。Java 在处理请求时使用异步servlet以及dispatch()和complete()方法的行为,java,servlets,asynchronous,concurrency,guava,Java,Servlets,Asynchronous,Concurrency,Guava,我使用异步servlet来处理请求 根据文件:(,) 我不明白它们是如何工作的。对此我几乎没有疑问: async.dispatch()和async.complete()之间到底有什么区别 当我调用dispatch()(insiderun())时,响应到达客户端,这意味着我们可以异步推送响应 如果我先调用asyncContext.dispatch()然后调用asyncContext.complete()下一步线程的行为是什么 如果在asyncContext.complete()之后调用任何方法,该
对此我几乎没有疑问:
async.dispatch()
和async.complete()
之间到底有什么区别asyncContext.dispatch()
然后调用asyncContext.complete()
下一步线程的行为是什么asyncContext.complete()
之后调用任何方法,该方法调用会发生什么情况,如下面的代码所示(在相同的run()
中)[当我测试它时,它工作正常,并且显示相同的线程id]
run()
内部调用异步方法,是否需要在内部完成asyncContext.complete()
?(onSuccess()或onFailure())final FutureCallback calculateTime=新客户未来(计算);
//启动异步上下文。
final AsyncContext AsyncContext=request.startAsync();
asyncContext.start(新的Runnable(){
@凌驾
公开募捐{
MyObject对象=null;
试试{
object=myFactory.create();
//调度异步上下文
asyncContext.dispatch(“已成功创建对象”);
}捕获(最终IOE1异常){
logger.error(“记录错误”);
}
asyncContext.complete();//完成异步上下文
//调用异步方法
final ListenableFuture=myService.doSomething();
Futures.addCallback(future,calculateTime);
//在此处调用asyncContext.complete()可以吗?
}
});
提前谢谢发送
和完成
之间有什么区别?
调用complete
告诉容器启动onComplete
侦听器并停止异步模式,dispatch
基本上告诉容器调用complete
,然后将请求(内部)转发到指定路径。路径可以是JSP、同步servlet,甚至是另一个将触发新一轮异步处理的异步servlet
run
内部调用dispatch
时,响应到达了客户端,这是否意味着我们可以像这样异步推送响应?
相反,dispatch
关闭异步模式并将请求转发给另一个servlet或JSP。要将数据推送到客户端,您必须写入与AsyncContext
关联的Response
对象
dispatch
,然后调用complete
next,线程的行为是什么?
未定义,这是一种很好的说法,它取决于容器的实现方式。可能它会抛出一个错误,可能onComplete
处理程序会被触发两次,可能调用complete
将一事无成,可能在调用处理程序和操作AsyncContext
实现等的内部结构时,线程和容器之间会存在竞争条件
complete
之后调用任何方法,该方法调用会发生什么情况
取决于您调用的方法。规范规定,如果在complete
之后调用dispatch
将抛出IllegalStateException
,则任何其他内容都是未定义的,因此是特定于实现的
run
内部调用异步方法,我应该调用complete
内部回调()吗?
是的,一旦完成,您必须调用complete
来完成异步处理。run
方法用于计划由容器管理的线程池执行的任务,并且可以在异步请求的生存期内多次调用该方法
╔══════════════════╦═══════════════════════════════════════════════════════════╗
║ void complete() ║ Completes the asynchronous operation and closes the ║
║ ║ response associated with this asynchronous context. ║
║ ║ You call this method after writing to the response object ║
║ ║ inside the asynchronous context. ║
╠══════════════════╬═══════════════════════════════════════════════════════════╣
║ void dispatch() ║ Dispatches the request and response objects ║
║ ║ of this AsyncContext to the servlet container. ║
╚══════════════════╩═══════════════════════════════════════════════════════════╝
final FutureCallback<Void> calculateTime= new CustomFuture<>(calculate);
// start Async context.
final AsyncContext asyncContext = request.startAsync();
asyncContext.start(new Runnable() {
@Override
public void run() {
MyObject object= null;
try {
object= myFactory.create();
//dispatch async context
asyncContext.dispatch("Object Successfully Created");
} catch (final IOException e1) {
logger.error("logging error");
}
asyncContext.complete(); //complete async context
// call asynchronous method
final ListenableFuture<Void> future = myService.doSomething();
Futures.addCallback(future, calculateTime);
// calling asyncContext.complete() here will work?
}
});