[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]