Akkahttp and servlet.docx
- 文档编号:2857991
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:6
- 大小:15.85KB
Akkahttp and servlet.docx
《Akkahttp and servlet.docx》由会员分享,可在线阅读,更多相关《Akkahttp and servlet.docx(6页珍藏版)》请在冰豆网上搜索。
Akkahttpandservlet
Servlets3addasynchronoussupport.Thisgivesanopportunitytodevelopinareactiveway.See TheReactiveManifesto.
Toputitsimpleonecanprocessrequestinbackgroundandsendresponsewhenitisreadywithoutholdingathreadfromservletsthreadpoolforthis.Simpleexamplebelow.Fullsourcecodeofexamplesinthisarticleisavailable.
packagetest;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.concurrent.Executor;
importjava.util.concurrent.Executors;
importjava.util.logging.Level;
importjava.util.logging.Logger;
importjavax.servlet.AsyncContext;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns="/test/async",asyncSupported=true)
publicclassTestAsyncServletextendsHttpServlet{
privateExecutorexecutor;
@Override
publicvoidinit()throwsServletException{
executor=Executors.newFixedThreadPool(30);
}
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
finalAsyncContextasyncContext=req.startAsync();
executor.execute(newRunnable(){
@Override
publicvoidrun(){
HttpServletResponseresp=(HttpServletResponse)asyncContext.getResponse();
resp.setContentType("text/plain");
try(PrintWriterwriter=resp.getWriter()){
writer.print("Ok");
}catch(IOExceptionex){
Logger.getLogger(TestAsyncServlet.class.getName()).log(Level.SEVERE,null,ex);
}
asyncCplete();
}
});
}
}
Fixedthreadpoolisusedtoprocessrequestsinbackgroundandresponseiswrittendirectlyfromthethreadofthisthreadpoolwhenitisready.
ThismodelgivesyouanabilitytointegratewithsuchframeworksasAkka.Seeexamplebelow.
packagetest;
importakka.actor.ActorRef;
importakka.actor.ActorSystem;
importakka.actor.Props;
importakka.actor.ReceiveTimeout;
importakka.actor.Terminated;
importakka.actor.UntypedActor;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.AsyncContext;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importscala.concurrent.duration.Duration;
@WebServlet(urlPatterns="/test/akka",asyncSupported=true)
publicclassTestAkkaServletextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
finalAsyncContextasyncContext=req.startAsync();
finalActorSystemsystem=(ActorSystem)req.getServletContext()
.getAttribute("ActorSystem");
system.actorOf(Props.create(AskActor.class,asyncContext));
}
staticclassTestActorextendsUntypedActor{
@Override
publicvoidonReceive(Objectmsg)throwsException{
if(msg=="Test!
!
!
"){
getSender().tell("Ok",getSelf());
}else{
unhandled(msg);
}
}
}
staticclassAskActorextendsUntypedActor{
finalprivateAsyncContextasyncContext;
publicAskActor(AsyncContextasyncContext){
this.asyncContext=asyncContext;
ActorReftestActor=getContext()
.actorOf(Props.create(TestActor.class),"TestActor");
getContext().watch(testActor);
getContext().setReceiveTimeout(Duration.create("5seconds"));
testActor.tell("Test!
!
!
",getSelf());
}
@Override
publicvoidonReceive(Objectmsg)throwsIOException{
HttpServletResponseresp=(HttpServletResponse)asyncContext.getResponse();
if(msginstanceofReceiveTimeout){
getContext().stop(getSelf());
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Timeout");
asyncCplete();
}elseif(msginstanceofTerminated){
getContext().stop(getSelf());
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"UnexpectedlyStopped");
asyncCplete();
}elseif(msginstanceofString){
getContext().stop(getSelf());
resp.setContentType("text/plain");
try(PrintWriterwriter=resp.getWriter()){
writer.print("Ok");
}
asyncCplete();
}else{
unhandled(msg);
}
}
}
}
Theworkflowisthefollowing.
•doGet()usesActorSystemtocreateanactoroftype AskActorwhichwillbetherootofsupervisionsubtreededicatedtoprocessthisrequest.See WhatSupervisionMeans.
•AskActorcreatesaninstanceofTestActorandsendsamessagetoit.MeanwhileitiswatchingtheTestActorinstanceandincaseitterminatesforsomereason AskActorwillreceive Terminatedmessage.WealsosettimeoutthatmeansifthereisnoresponsefromTestActorinspecifiedamountoftimeAskActorwillgetReceiveTimeoutmessage.
•TestActorreceivesmessagefromAskActor,processesitandsendsaresponse.
•AskAc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Akkahttp and servlet