Java应用开发(中、高级)课件 任务1.4 实现实时消息推送_第1页
Java应用开发(中、高级)课件 任务1.4 实现实时消息推送_第2页
Java应用开发(中、高级)课件 任务1.4 实现实时消息推送_第3页
Java应用开发(中、高级)课件 任务1.4 实现实时消息推送_第4页
Java应用开发(中、高级)课件 任务1.4 实现实时消息推送_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务4.实现实时消息推送任务描述本任务将实现后厨模块及信息推送功能,功能流程为:服务员主页显示所有菜品,点餐前先设置点餐桌号,将菜品加入到点餐车中,确认订单后,推送到后厨的订单列表中显示,当后厨完成配菜后单击开始烹饪,完成点餐流程。知识准备(1)信息推送:就是"web广播",是通过一定的技术标准或协议,在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息。任务实施步骤1:创建获取推送消息处理程序(1)在任务2已经导入“com.chinasofti.util.web.serverpush”包中的MessageProducer服务器推送消息的消息生产者。Ø包含方法有:方法名说明sendMessage(StringsessionID,StringmessageTitle,Stringmsg)生产消息的方法publicclassMessageProducer{

/** *生产消息的方法 * *@paramsessionID *本次生产的消息针对的客户sessionid *@parammsg *生产的消息内容 **/ publicvoidsendMessage(StringsessionID,StringmessageTitle,Stringmsg){ //利用给出消息目标客户sessionid和消息标题创建消息键 ServerPushKeykey=newServerPushKey(sessionID,messageTitle); //如果消息等待序列中存在本键才执行消息的生产操作 if(ServerPushMQ.waitQueue.get(key)!=null){ //获取到消息等待序列中的消息对象 Messagemessage=ServerPushMQ.waitQueue.get(key); //将消息内容填充如消息对象 message.setMsg(msg); //获取到消息对象的同步锁 synchronized(message){ //唤醒由消息对象锁定阻塞的线程,即由消息的消费者阻塞的http请求处理线程,消息的消费者将直接调用消息处理器的处理方法 message.notifyAll(); } } }}Ø代码如下:(1)在“com.chinasofti.ordersys.controller.kitchen”包中,新建GetPushMsgHandler获取推送消息处理程序。Ø包含方法有:方法名说明initService(finalHttpServletRequestrequest,finalHttpServletResponseresponse)初始化服务getHandler(finalHttpServletRequestrequest,finalHttpServletResponseresponse,finalHttpSessionsession)获取处理器packagecom.chinasofti.ordersys.controller.kitchen;

importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;

importcom.chinasofti.util.web.serverpush.MessageHandler;

publicabstractclassGetPushMsgHandler{ publicabstractMessageHandlergetHandler(finalHttpServletRequestrequest, finalHttpServletResponseresponse);

publicvoidinitService(finalHttpServletRequestrequest, finalHttpServletResponseresponse,finalHttpSessionsession){ }}Ø代码如下:步骤2:创建获取推送消息模板组件(1)在“com.chinasofti.ordersys.controller.kitchen”包中,新建GetPushMsgTemplate获取推送消息模板组件。Ø包含方法有:方法名说明getMsg(HttpServletRequestrequest,HttpServletResponseresponse,GetPushMsgHandlerhandler)获取推送消息数据packagecom.chinasofti.ordersys.controller.kitchen;

importjava.io.UnsupportedEncodingException;

importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;

importorg.springframework.stereotype.Component;

importcom.chinasofti.util.web.serverpush.MessageConsumer;importcom.chinasofti.util.web.serverpush.MessageHandler;Ø代码如下:@ComponentpublicclassGetPushMsgTemplate{

publicvoidgetMsg(HttpServletRequestrequest, HttpServletResponseresponse,GetPushMsgHandlerhandler){

StringmessageTitleParameterName="messageTitle"; //设置正确的请求字符集以防止出现乱码 try{ request.setCharacterEncoding("utf-8"); }catch(UnsupportedEncodingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } //设置到客户端输出流中输出数据的字符集 response.setCharacterEncoding("utf-8"); //获取用户的session会话对象

HttpSessionsession=request.getSession(true); handler.initService(request,response,session); //获取用户希望抓取数据的名称 StringmessageTitle=request.getParameter(messageTitleParameterName); //创建服务器数据推送的消息消费者 MessageConsumermconsumer=newMessageConsumer();

//由于需要在匿名内部类对象中使用响应对象,因此定义一个final版本 finalHttpServletResponsersp=response;

//调用子类中实现的setHandler方法构建消息的处理对象 MessageHandlermHandler=handler.getHandler(request,response);

//利用消息消费者尝试获取消息数据 mconsumer.searchMessage(session.getId(),messageTitle,mHandler); }}步骤3:实现实时消息推送(1)在“src\main\webapp\pages\kitchen”文件夹中,新建kitchenmain.jsp后厨人员备菜界面,详细代码请参考提供的案例代码。使用服务员账号bb登录后运行如图2-20所示:图2-20后厨人员备菜界面(2)在“com.chinasofti.ordersys.controller.kitchen”包中,新建RTDishesController推送对应桌号及其菜品的状态的通知消息。Ø包含方法有:方法名说明dishesDone(HttpServletRequestrequest,HttpServletResponseresponse)对服务员生成菜品完成的消息getRTDishes(HttpServletRequestrequest,HttpServletResponseresponse)通知在线的服务员对应桌号及其菜品的状态getRTOrder(HttpServletRequestrequest,HttpServletResponseresponse)后厨人员实时获取订单信息@ControllerpublicclassRTDishesController{

@Autowired GetPushMsgTemplatetemplate;

publicGetPushMsgTemplategetTemplate(){ returntemplate; }

publicvoidsetTemplate(GetPushMsgTemplatetemplate){ this.template=template; }

publicstaticArrayList<String>disheses=newArrayList<String>(); publicstaticArrayList<String>kitchens=newArrayList<String>();Ø代码如下: @RequestMapping("/dishesdone") publicvoiddishesDone(HttpServletRequestrequest, HttpServletResponseresponse){ //设置响应结果集 response.setCharacterEncoding("utf-8"); //获取菜品对应的桌号 StringtableId=request.getParameter("tableId"); //获取菜品名 StringdishesName=request.getParameter("dishesName"); //由于使用ajax提交,因此需要转码 try{ dishesName=newString(dishesName.getBytes("iso8859-1"),"utf-8"); }catch(UnsupportedEncodingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } //创建消息生产者 MessageProducerproducer=newMessageProducer(); //获取服务员等待列表 ArrayList<String>list=disheses; //遍历服务员等待列表 for(inti=list.size()-1;i>=0;i--){ //获取特定的服务员SessionID Stringid=list.get(i); //对该服务员生产菜品完成等待传菜的消息 producer.sendMessage(id,"rtdishes","桌号["+tableId+"]的菜品[" +dishesName+"]已经烹制完成,请传菜!"); //从等待列表中删除该服务员 list.remove(id); }

} @RequestMapping("/getrtdishes") publicvoidgetRTDishes(HttpServletRequestrequest, HttpServletResponseresponse){

GetPushMsgHandlerhandler=newGetPushMsgHandler(){

@Override publicMessageHandlergetHandler(HttpServletRequestrequest, HttpServletResponseresponse){ //TODOAuto-generatedmethodstub //设置请求字符集 response.setCharacterEncoding("utf-8"); //TODOAuto-generatedmethodstub //尝试处理实时消息 try{ //获取针对客户端的文本输出流 finalPrintWriterout=response.getWriter(); //创建消息处理器 MessageHandlerhandler=newMessageHandler(){ //实时消息处理回调方法 @Override publicvoidhandle( Hashtable<ServerPushKey,Message>messageQueue, ServerPushKeykey,Messagemsg){ //将消息的文本内容直接发送给客户端 out.print(msg.getMsg()); //TODOAuto-generatedmethodstub

} }; //返回创建好的消息处理器 returnhandler; //捕获创建消息处理器时产生的异常 }catch(Exceptionex){ //输出异常信息 ex.printStackTrace(); //输出异常信息 returnnull; } } @Override publicvoidinitService(HttpServletRequestrequest, HttpServletResponseresponse,HttpSessionsession){ //TODOAuto-generatedmethodstub //将当前会话加入到实时消息等待列表 disheses.add(session.getId()); }

};

template.getMsg(request,response,handler); }

@RequestMapping("/getrtorder") publicvoidgetRTOrder(HttpServletRequestrequest, HttpServletResponseresponse){

GetPushMsgHandlerhandler=newGetPushMsgHandler(){

/** *获取实时消息处理器的回调 * *@paramrequest *请求对象 *@paramresponse *响应对象 *@return本Servlet使用的实时消息处理器 **/ @Override publicMessageHandlergetHandler(HttpServletRequestrequest, HttpServletResponseresponse){ //TODOAuto-generatedmethodstub //设置请求字符集 response.setCharacterEncoding("utf-8"); //尝试处理实时消息 try{ //获取针对客户端的文本输出流 finalPrintWriterout=response.getWriter(); //创建消息处理器 MessageHandlerhandler=newMessageHandler(){ @Override publicvoidhandle( Hashtable<ServerPushKey,Message>messageQueue, ServerPushKeykey,Messagemsg){ //将消息的文本内容直接发送给客户端 out.print(msg.getMsg()); //TODOAuto-generatedmethodstub

} }; //返回创建好的消息处理器 returnhandler; //捕获创建消息处理器时产生的异常 }catch(Exceptionex){ //输出异常信息 ex.printStackTrace(); //返回空的消息处理器 returnnull; } } /** *初始化实时消息获取服务的方法 * *@paramrequest *请求信息 *@paramresponse *响应对象 *@paramsession *会话跟踪对象 **/ @Override publicvoidinitService(HttpServletRequestrequest, HttpServletResponseresponse,HttpSessionsession){ //TODOAuto-generatedmethodstub //将当前会话加入到实时消息等待列表 kitchens.add(session.getId()); } }; template.getMsg(request,response,handler); }}(3)在“com.chinasofti.ordersys.controller.admin”包中,新建RTBordController实时公告信息类。Ø包含方法有:方法名说明getRTBordMsg(HttpServletRequestrequest,HttpServletResponseresponse)获取实时公告信息的等待列表sendBord(HttpServletRequestrequest,HttpServletResponseresponse)发送实时公告信息getHandler(HttpServletRequestrequest,HttpServletResponseresponse)获取实时消息处理器的回调@ControllerpublicclassRTBordController{

/** *获取实时公告信息的等待列表 **/ publicstaticArrayList<String>bords=newArrayList<String>();

@RequestMapping("/getrtbord") publicvoidgetRTBordMsg(HttpServletRequestrequest, HttpServletResponseresponse){

StringmessageTitleParameterName="messageTitle";

//设置正确的请求字符集以防止出现乱码 try{ request.setCharacterEncoding("utf-8"); }catch(UnsupportedEncodingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }Ø代码如下: //设置到客户端输出流中输出数据的字符集 response.setCharacterEncoding("utf-8"); //获取用户的session会话对象

HttpSessionsession=request.getSession(true);

//获取用户希望抓取数据的名称 StringmessageTitle=request.getParameter(messageTitleParameterName); //创建服务器数据推送的消息消费者 MessageConsumermconsumer=newMessageConsumer();

//由于需要在匿名内部类对象中使用响应对象,因此定义一个final版本 finalHttpServletResponsersp=response;

//将当前会话加入到实时消息等待列表 bords.add(session.getId()); //调用子类中实现的setHandler方法构建消息的处理对象 MessageHandlerhandler=getHandler(request,response);

//利用消息消费者尝试获取消息数据 mconsumer.searchMessage(session.getId(),messageTitle,handler);

} @RequestMapping("/sendbord") publicvoidsendBord(HttpServletRequestrequest, HttpServletResponseresponse){

//设置响应字符集 response.setCharacterEncoding("utf-8"); //获取公告信息 Stringbord=request.getParameter("bord"); //创建实施消息生产者 MessageProducerproducer=newMessageProducer(); //获取实时公告信息等待列表 ArrayList<String>list=bords; //遍历等待列表 for(inti=list.size()-1;i>=0;i--){ //获取等待信息的用户sessionID Stringid=list.get(i); //针对该sessionID和消息标题、内容生产消息 producer.sendMessage(id,"rtbord",bord); //将该sessionID从等待列表中删除 list.remove(id); }

} /** *获取实时消息处理器的回调 * *@paramrequest *请求对象 *@paramresponse *响应对象 *@return本Servlet使用的实时消息处理器 **/ publicMessageHandlergetHandler(HttpServletRequestrequest, HttpServletResponseresponse){ //设置请求字符集 response.setCharacterEncoding("utf-8"); //TODOAuto-generatedmethodstub //尝试处理实时消息 try{ //获取针对客户端的文本输出流 finalPrintWriterout=response.getWriter(); //创建消息处理器 MessageHandlerhandler=newMessageHandler(){ //实时消息处理回调方法 @Override publicvoidhandle( Hashtable<ServerPushKey,Message>messageQueue, ServerPushKeykey,Messagemsg){ //将消息的文本内容直接发送给客户端 out.print(msg.getMsg()); //TODOAuto-generatedmethodstub } }; //返回创建好的消息处理器 returnhandler; //捕获创建消息处理器时产生的异常 }catch(Exceptionex){ //输出异常信息 ex.printStackTrace(); //返回空的消息处理器 returnnull; } }}(4)修改“com.chinasofti.ordersys.controller.waiters”包中的CartController类。解除21行代码注释:importcom.chinasofti.ordersys.controller.kitchen.RTDishesController;解除173-185行代码注释://获取后厨等待列表ArrayList<String>list=RTDishesController.kitchens;//创建消息生产者MessageProducerproducer=newMessage

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论