yn5411 2009-06-24 11:07
浏览 258
已采纳

spring MVC +Ajax开发web服务端 PrinterWriter.flush() 出错

[code="java"]
@RequestMapping(params="cmd=read")
public void materialTypeRead(HttpServletRequest request,HttpServletResponse response,final Map model){
isFinished = false;
isSucceed = false;

    DefaultCallerHandler hdl = new DefaultCallerHandler(){
        @Override
        public void errorDo(CallerEvent event) {
            // TODO Auto-generated method stub
            jss.clear();
            jss.setSuccess(false);
            jss.wrapEventObject(event);

            model.put("result", jss.toMap());
            HttpServletResponse rsp = (HttpServletResponse)this.attribute("httpresponse");
            if(rsp==null) return;
            PrintWriter writer=null;
            try{

                writer = rsp.getWriter();
                writer.print(jss.toJSON());

                writer.flush();
            }
            catch(Exception ex){


            }
            finally{
                try{
                    if(writer!=null) {

                        writer.close();
                    }
                }
                catch(Exception ex){}
            }

            isFinished = true;
            isSucceed = false;
        }

        @Override
        public void holdProcess() {
            // TODO Auto-generated method stub
            jss.clear();
            jss.setSuccess(true);
            jss.setResult(this.getResultMap());
            model.put("result", jss.toMap());

            HttpServletResponse rsp = (HttpServletResponse)this.attribute("httpresponse");
            if(rsp==null) return;
            PrintWriter writer=null;
            try{
                writer = rsp.getWriter();               
                writer.print(jss.toJSON()); //这里jss.toJSON()是正确的,不管多少进程都能得到正确的数据
                writer.flush();//出错在这里,如果一个以上的浏览器进程同时访问,第一个正确,后面的就会出错

            }
            catch(Exception ex){
                System.out.println("error flush :"+this.toString()+" writer:"+writer);
                ex.printStackTrace();

            }
            finally{
                try{
                    if(writer!=null) {
                        writer.close();

                    }
                }
                catch(Exception ex){
                    System.out.println("error close :"+this.toString());
                    ex.printStackTrace();

                }
            }   

            isFinished = true;
            isSucceed = true;
        }
    };

    hdl.attributeValue("httpresponse", response);
    Executor exe = new Executor();
    Map npm = new WebUtil().copyRequestMapCompress(request);
    int pagesize=0;
    String ps = (String)npm.get("pageSize");
    if(ps!=null ) {
        try{
            pagesize = Integer.valueOf(ps).intValue();
        }catch(Exception e){

        }
        if(pagesize>0)
            npm.put("rowsperpage", pagesize);
        npm.remove("pageSize");

    }
    ps = (String)npm.get("start");

    if(ps!=null) {
        int start=0;
        try{
            start = Integer.valueOf(ps).intValue();
        }catch(Exception e){}
        if(pagesize>0) 
            npm.put("curpage", (start/pagesize) +1);
    }

    ISessionFrom sf = new SessionFromHttpSession();
    try {
        sf.make(request.getSession());
    } catch (Exception e) {
        // TODO Auto-generated catch block
        jss.clear();
        jss.setSuccess(false);
        Map obj = new HashMap();
        obj.put("error", e.getMessage());
        obj.put("errorcode", 3001);
        jss.setResult(obj);
        try {
            response.getWriter().write(jss.toJSON());
            response.getWriter().flush();
        } catch (IOException e1) {
            // TODO Auto-generated catch block

        }
        finally{
            isSucceed=false;
            isFinished = true;
        }
        return;
    }


    if(npm.containsKey("link")){
        String _v = String.valueOf(npm.get("link"));
        if( _v.equalsIgnoreCase("and") ) npm.remove("link");
    }

    exe.request("logistics.materialtype.select", null, npm, hdl);



    while(!isFinished){
        try {
            Thread.currentThread().sleep(50);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
        }
    }
}

[/code]

在write.flush()这个代码处,只要有一个以上的浏览器进程同时访问,第一个正确,后面的就会出错,出错信息如下:
[quote]
error flush :com.qt.eis.web.bz.material.MaterialTypeParentCRUD$1@1cb9b56 writer:org.apache.catalina.connector.CoyoteWriter@93decc
org.apache.tomcat.jni.Error: APR does not understand this error code
at org.apache.tomcat.jni.Socket.sendbb(Native Method)
at org.apache.coyote.http11.InternalAprOutputBuffer.flushBuffer(InternalAprOutputBuffer.java:694)
at org.apache.coyote.http11.InternalAprOutputBuffer.flush(InternalAprOutputBuffer.java:284)
at org.apache.coyote.http11.Http11AprProcessor.action(Http11AprProcessor.java:1007)
at org.apache.coyote.Response.action(Response.java:183)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:314)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:288)
at org.apache.catalina.connector.CoyoteWriter.flush(CoyoteWriter.java:95)
at com.qt.eis.web.bz.material.MaterialTypeParentCRUD$1.holdProcess(MaterialTypeParentCRUD.java:107)
at com.qt.eis.rcp.remote.DefaultCallerHandler.process(DefaultCallerHandler.java:71)
at com.qt.eis.rcp.remote.DefaultCallerHandler.run(DefaultCallerHandler.java:91)
at java.lang.Thread.run(Thread.java:619)
[/quote]

[quote]
问题已经解决!
原因在于springMVC,缺省实例为唯一,只要解决多实例化就可以把问题解决了。
[/quote]

  • 写回答

3条回答 默认 最新

  • iteye_4808 2009-06-25 12:37
    关注

    不好意思啊, 看错了, 不错吗? 自己搞定是最好的,!  good

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用