关于loadrunner 如何压测OA流程引擎项目webservice接口的讨论 / loadrunner webservice
1.相关工具:
soapUI-x32-4_0_0.exe
loadrunner 11.0
google chrome postman for webservicec插件
2.业务需求:
OA里的两条业务流程需要性能压测:起草流程和审批流程
3.技术实现方式:
OA系统页面 -- ESB系统 Webservice -- Workflow集群系统 Webservice -- Workflow系统 DB2
本次压测不涉及ESB系统,直接模拟用户压测Workflow集群系统Webservice服务接口
4.技术深入了解:
起草流程loadrunner脚本
D:\TestCase\20140428_OA_workflow_db2_update\loadrunner_webservice_soap-request_workflow4startTask\Action.c
Action() { lr_start_transaction("起草事务"); web_add_header("Content-Type","application/xml"); web_reg_find("Fail=NotFound", "Search=Body", "SaveCount=placeflag", "Text=complete", LAST); soap_request("StepName=SOAP Request", "URL=http://10.19.218.180:9080/snf-workflow-web/webservice/EngineService", //经过流程引擎WAS机器压测 //"URL=http://esbpre.cns*****.com:9106/SuN***ServiceWeb/mb", // 经ESB压测 "SOAPEnvelope=" "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" "<soap:Body>" "<ns1:startProcessWithDraft xmlns:ns1=\"http://esb.workflow.framework.s*****.com/\">" "<ns1:input1>" "<ns2:MbfBody xmlns:ns2=\"http://pwd.workflow.framework.s*****.com/\">" "<ns3:bizTemplateId xmlns:ns3=\"http://input.startProcessWithDraft.esb.workflow.framework.s*****.com\">NSOA0141</ns3:bizTemplateId>" "<ns3:webParam xmlns:ns3=\"http://input.startProcessWithDraft.esb.workflow.framework.s*****.com\">" "<ns4:businessCode xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\">145692NSOA1000{businessCode}</ns4:businessCode>" //公文号每次不一样,长度100位 "<ns4:businessTemplateId xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\">NSOA0141</ns4:businessTemplateId>" "<ns4:businessType xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\">default</ns4:businessType>" "<ns4:commentContent xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:commentContent>" "<ns4:contextParams xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\">" "<ns1:entry>" "<ns1:key></ns1:key>" "<ns1:value></ns1:value>" "</ns1:entry>" "</ns4:contextParams>" "<ns4:currentUser xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\">" "<ns5:authType xmlns:ns5=\"http://biz.interfaces.workflow.framework.s*****.com\">0</ns5:authType>" "<ns5:departmentId xmlns:ns5=\"http://biz.interfaces.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns5:departmentId>" "<ns5:departmentName xmlns:ns5=\"http://biz.interfaces.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns5:departmentName>" "<ns5:positionId xmlns:ns5=\"http://biz.interfaces.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns5:positionId>" "<ns5:positionName xmlns:ns5=\"http://biz.interfaces.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns5:positionName>" "<ns5:userId xmlns:ns5=\"http://biz.interfaces.workflow.framework.s*****.com\">13073015</ns5:userId>" "<ns5:userName xmlns:ns5=\"http://biz.interfaces.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns5:userName>" "</ns4:currentUser>" "<ns4:draftDept xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:draftDept>" "<ns4:draftDeptName xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:draftDeptName>" "<ns4:draftPosition xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:draftPosition>" "<ns4:drafterId xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:drafterId>" "<ns4:drafterName xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:drafterName>" "<ns4:forwardPath xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:forwardPath>" "<ns4:nextStateId xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:nextStateId>" "<ns4:nextUsers xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:nextUsers>" "<ns4:piid xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:piid>" "<ns4:portalContext xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:portalContext>" "<ns4:processId xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\">{processId}</ns4:processId>" // 每次不一样,长度10位 "<ns4:save xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:save>" "<ns4:serverName xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:serverName>" "<ns4:skip xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:skip>" "<ns4:status xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:status>" "<ns4:systemCode xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:systemCode>" "<ns4:title xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\">testtest</ns4:title>" "<ns4:tkiid xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:tkiid>" "<ns4:workflow xmlns:ns4=\"http://param.bean.workflow.framework.s*****.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></ns4:workflow>" "</ns3:webParam>" "</ns2:MbfBody>" "<ns2:MbfHeader xmlns:ns2=\"http://pwd.workflow.framework.s*****.com/\">" "<ns2:AppCode>SNF</ns2:AppCode>" // 如经ESB压测则改为 SOA "<ns2:AuthId>test</ns2:AuthId>" "<ns2:Operation>startProcessWithDraft</ns2:Operation>" "<ns2:ServiceCode>WorkFlowMgmt</ns2:ServiceCode>" "<ns2:UId>21412444333</ns2:UId>" // 每次经ESB压测必改,类似32位MD5值 "</ns2:MbfHeader>" "</ns1:input1>" "</ns1:startProcessWithDraft>" "</soap:Body>" "</soap:Envelope>", "SOAPAction=startProcessWithDraft", "ResponseParam=response", "Snapshot=t1398683455.inf", LAST); if((atoi(lr_eval_string("{placeflag}"))<1)) { lr_end_transaction("起草事务",LR_PASS); } else lr_end_transaction("起草事务",LR_FAIL); return 0; }
5.loadrunner websercie参考资料:
web test LoadRunner WebService / MQ / soapUI / postman
http://lindows.iteye.com/blog/1725279
Loadrunner WebService Exception
问题1:
SOAP request failed due to incorrect SOAP format
Loadrunner Replay log:
Action.c(14): Error: The reason for the SOAP fault is: "com.s*****.framework.dal.exception.DalException incompatible with com.s×××××.framework.workflow.exception.WorkflowException"
Action.c(14): Error: SOAP request "SOAP Request" execution failed
Loadrunner Test Result:
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
- <soap:Body>
- <soap:Fault>
- <faultcode>soap:Server</faultcode>
- <faultstring>com.s*****.framework.dal.exception.DalException. incompatible with
- com.s*****.framework.exception.WorkflowException</faultstring>
- </soap:Fault>
- <soap:Body>
- </soap:Envelope>
解决:
Tip: To better understand the cause of failed steps, you can record movie clips of run sessions and view them together with the step result details.
在loadrunner测试脚本里加入如下定义描述即可。
web_add_header("Content-Type","application/xml");
问题2:
Loadrunner Scenario run-time setting 。
loadrunner 场景设置注意事项,当模拟多用户压测时,压测突然停止。
解决:勾选Continue on error
http://dl2.iteye.com/upload/attachment/0096/8181/24fdaa6c-1d15-35c3-a076-91b3b24f2871.png
D:\TestCase\20140428_OA_workflow_db2_update\tc_workflow_start22
问题3:
Loadrunner Parameter loadrunner参数化设置问题,当取值唯一性unique number的参数设置注意事项
解决:
http://dl2.iteye.com/upload/attachment/0096/8183/5071c30a-9559-361b-bf42-272bd22eff04.png
D:\TestCase\20140428_OA_workflow_db2_update\tc_workflow_start22
6. loadrunner performance exception
http://dl2.iteye.com/upload/attachment/0096/9406/a5ccd82e-6c7a-340f-bfde-d5e5822c3075.jpg
http://dl2.iteye.com/upload/attachment/0096/9408/bb4575ee-a80e-3d54-a5b1-92a0133a5d34.jpg
问题4
http://dl2.iteye.com/upload/attachment/0097/0736/36fc4286-e2e9-3554-aec2-f39224e29c93.png
Virtual User Script started at : 2014-05-13 14:54:30
Starting action vuser_init.
Web Services replay version 11.0.0 for WIN2003; Toolkit: "NotDefined"; build 8859
Run-Time Settings file: "D:\TestCase\20140428_OA_workflow_db2_update\tc_workflow_getAvailablePaths\\default.cfg"
Vuser directory: "D:\TestCase\20140428_OA_workflow_db2_update\tc_workflow_getAvailablePaths"
Vuser output directory: "D:\TestCase\20140428_OA_workflow_db2_update\tc_workflow_getAvailablePaths\"
LOCAL start date/time: 2014-05-13 14:54:30
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(10): Registering web_reg_find was successful [MsgId: MMSG-26390]
Action.c(16): Notify: Transaction "getAvailablePaths" started.
Action.c(17): SOAP request "SOAP Request" started
Action.c(17): t=417ms: 150-byte response headers for "http://10.19.218.179/snf-workflow-web/webservice/EngineService?wsdl" (RelFrameId=1, Internal ID=1)
Action.c(17): HTTP/1.1 400 Bad Request\r\n
Action.c(17): Date: Tue, 13 May 2014 06:54:04 GMT\r\n
Action.c(17): Content-Length: 226\r\n
Action.c(17): Connection: close\r\n
Action.c(17): Content-Type: text/html; charset=iso-8859-1\r\n
Action.c(17): \r\n
Action.c(17): t=431ms: 226-byte response body for "http://10.19.218.179/snf-workflow-web/webservice/EngineService?wsdl" (RelFrameId=1, Internal ID=1)
Action.c(17): <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n
Action.c(17): <html><head>\n
Action.c(17): <title>400 Bad Request</title>\n
Action.c(17): </head><body>\n
Action.c(17): <h1>Bad Request</h1>\n
Action.c(17): <p>Your browser sent a request that this server could not understand.<br />\n
Action.c(17): </p>\n
Action.c(17): </body></html>\n
Action.c(17): Error: HTTP status code 400 returned by the server
Action.c(17): Error: SOAP request "SOAP Request" execution failed
Action.c(17): Notify: Transaction "getAvailablePaths" ended with "Fail" status (Duration: 0.1939 Wasted Time: 0.1633).
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
解决:
//web_add_header("Content-Type","application/xml");
//web_add_header("EncType=text/xml","charset=UTF-8");
//"EncType=text/xml; charset=GB2312",
web_reg_find("Fail=NotFound",
"Search=All",
"SaveCount=placeflag",
"Text/IC=COMPLETE",
LAST);
lr_start_transaction("getAvailablePaths");
soap_request("StepName=SOAP Request",
"URL=http://10.19.218.179/snf-workflow-web/webservice/EngineService?wsdl",
"SOAPEnvelope="
//"<?xml version=\"1.0\" encoding=\"GB2312\" ?>" //这里加上XML编码即可把中文数据传递失败解决
、、、
初步调试:WAS 版本 7.0.0.13
单压测WAS1 机器,loadrunner性能平稳,TPS 300笔/秒 ,响应时间 0.057秒
单压测WAS2 机器,拷贝WAS1应用代码包到WAS2,loadrunner性能异常,TPS 100笔/秒(一直下降) ,响应时间 0.057秒(一直上升),停止压测后,应用实例java进程一直占用内存不释放。
查找异常:
应用实例wf_srv2 SystemOut.log
[loguser@wfpreapp2~]$ tail -f /opt/IBM/WebSphere/AppServer/profiles/check/logs/wf_srv2/SystemOut.logSystemOut.log 无异常打印,
[loguser@wfpreapp2 ~]$ more wf_srv2_exception.log
Index Count Time of first Occurrence Time of last Occurrence Exception SourceId ProbeId
------+------+---------------------------+---------------------------+---------------------------
0 3 5/8/14 18:07:14:505 CST 5/8/14 18:07:15:404 CST com.ibm.websphere.management.exception.ConnectorException com.ibm.ws.man
agement.RoutingTable.Accessor.getConnector 583 /opt/IBM/WebSphere/AppServer/profiles/check/logs/ffdc/wf_srv2_4d984d98_14.05.08_18.07.14.521561
1502752903065554.txt
1 3 5/8/14 18:07:14:609 CST 5/8/14 18:07:15:404 CST com.ibm.websphere.management.exception.ConnectorNotAvailableException co
m.ibm.ws.management.RoutingTable.Accessor.getConnector 610 /opt/IBM/WebSphere/AppServer/profiles/check/logs/ffdc/wf_srv2_4d984d98_14.05.08_18.
07.14.6097402533075760915140.txt
2 1 5/8/14 18:09:03:024 CST 5/8/14 18:09:03:024 CST com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException com.ibm.ws.r
sadapter.jdbc.WSJccPreparedStatement.pmiExecuteUpdate 807 /opt/IBM/WebSphere/AppServer/profiles/check/logs/ffdc/wf_srv2_5b205b2_14.05.08_18.09
.03.0248465002192407646866.txt
3 1 5/8/14 18:09:03:098 CST 5/8/14 18:09:03:098 CST com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException com.ibm.ws.r
sadapter.jdbc.WSJdbcPreparedStatement.executeUpdate 449 /opt/IBM/WebSphere/AppServer/profiles/check/logs/ffdc/wf_srv2_5b205b2_14.05.08_18.09.0
3.0981446527591284546629.txt
4 1 5/9/14 14:46:28:738 CST 5/9/14 14:46:28:738 CST org.apache.soap.SOAPException com.ibm.ws.management.connector.soap.SOAPC
onnectorClient.invokeTemplate 846 /opt/IBM/WebSphere/AppServer/profiles/check/logs/ffdc/wf_srv2_2fae2fae_14.05.09_14.46.28.7386444650700322299
867.txt
------+------+---------------------------+---------------------------+---------------------------
[loguser@wfpreapp2 ffdc]$ pwd
/opt/IBM/WebSphere/AppServer/profiles/check/logs/ffdc
ddddd
http://dl2.iteye.com/upload/attachment/0096/9412/52a9b096-a35e-3279-9a4b-62511b9863c1.png
http://dl2.iteye.com/upload/attachment/0096/9414/13689d19-ec6e-3454-8133-677c5e907fa5.png
异常解决:
最终是因为WAS 集群应用中 两台WAS 连接数据库的驱动jar 不一致导致性能异常,导入最新驱动包解决
问题5:
Loadrunner WebService Script:
D:\TestCase\20140428_OA_workflow_db2_update\tc_workflow_endTask_soap_request\Action.c
Action() { lr_start_transaction("审批流程"); web_add_header("Content-Type","application/xml"); // web_add_header("Content-Type","application/xml;charset=utf-8"); web_reg_find("Fail=NotFound", "Search=All", "SaveCount=placeflag", "Text=COMPLETE", LAST); soap_request("StepName=SOAP Request", //"URL=http://esbpre.cns****.com:9106/SuN***ServiceWeb/mb", // 如经如经ESB PRE压测则改成这个 "URL=http://10.19.218.179/snf-workflow-web/webservice/EngineService", "SOAPEnvelope=" "<?xml version=\"1.0\" encoding=\"GB2312\"?>" "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" "<soap:Body>" 、、、、、、 "</soap:Body>" "</soap:Envelope>", "SOAPAction=endTask", "ResponseParam=response", "Snapshot=t1398759266.inf", LAST); lr_output_message("output message:%s",lr_eval_string("{placeflag}")); if((atoi(lr_eval_string("{placeflag}"))<1)) { lr_end_transaction("审批流程",LR_PASS); } else { lr_end_transaction("审批流程",LR_FAIL); } return 0; }
Loadrunner Replay log:
、、、
Action.c(98): Warning: The string 'placeflag' with parameter delimiters is not a parameter.
、、、
原因:
Loadrunner webservice协议的测试脚本soap_request() 方法不支持loadrunner http协议的web_reg_find检查点函数
解决一
所以改成web service 脚本soap_request方法的检查点函数
D:\TestCase\20140428_OA_workflow_db2_update\tc_workflow_endTask_soap_request\Action.c
Action() { lr_start_transaction("审批流程"); web_add_header("Content-Type","application/xml"); // web_add_header("Content-Type","application/xml;charset=utf-8"); /* http 协议的检查点函数不适用web service 检查点 web_reg_find("Fail=NotFound", "Search=All", "SaveCount=placeflag", "Text=FAIL", LAST); */ soap_request("StepName=SOAP Request", //"URL=http://esbpre.cns****.com:9106/SuN***ServiceWeb/mb", // 如经如经ESB PRE压测则改成这个 "URL=http://10.19.218.179/snf-workflow-web/webservice/EngineService", "SOAPEnvelope=" "<?xml version=\"1.0\" encoding=\"GB2312\"?>" "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" "<soap:Body>" 、、、、、、 "</soap:Body>" "</soap:Envelope>", "SOAPAction=endTask", //此处表示保留web service 的response返回数据,不能缺失 "ResponseParam=response", "Snapshot=t1398759266.inf", LAST); // lr_output_message("output message:%s",lr_eval_string("{response}")); // if((atoi(lr_eval_string("{placeflag}"))>0)) // if(strstr(lr_eval_string("{response}"),"FAIL")>0) // 改成web service 的检查点函数方法 if(strstr(lr_eval_string("{response}"),"COMPLETE")>0) { lr_end_transaction("审批流程",LR_PASS); } else { lr_end_transaction("审批流程",LR_FAIL); } return 0; }
解决二:
直接将loadrunner webservice协议的soap_request()方法改成loadrunner http协议的web_custom_resquest()方法,再使用 web_reg_find()函数的检查点,即可。
D:\TestCase\20140428_OA_workflow_db2_update\tc_workflow_endTask_web_custom_request\Action.c
Action() { lr_start_transaction("审批流程"); //web_add_header("Content-Type","application/xml"); // web_add_header("Content-Type","application/xml;charset=utf-8"); web_reg_find("Fail=NotFound", "Search=All", "SaveCount=placeflag", "Text=COMPLETE", LAST); //转换成 http协议 web_custom_request("Test", "Method=POST", "URL=http://10.19.218.179/snf-workflow-web/webservice/EngineService", "EncType=text/xml;charset=GB2312", //增加编码方式 "Body=" "<?xml version=\"1.0\" encoding=\"GB2312\"?>" "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" "<soap:Body>" 、、、、、、 "</soap:Body>" "</soap:Envelope>", // 去掉web service XML的response返回数据 LAST); lr_output_message("output message:%s",lr_eval_string("{placeflag}")); if((atoi(lr_eval_string("{placeflag}"))>0)) { lr_end_transaction("审批流程",LR_PASS); } else { lr_end_transaction("审批流程",LR_FAIL); } return 0; }
oa.cns*****.com_changePwd.ftl_exception
http://oa.cns*****.com/portal/noDecoratorTo.htm?url=/home/changePassword/changePwd.ftl
错误页异常
SRVE0260E: 服务器无法使用对应用程序指定的错误页来处理如下所示的原始异常。
原始异常:
吧错误消息: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is freemarker.core.InvalidReferenceException: Expression currentUser is undefined on line 31, column 47 in home/changePassword/changePwd.ftl.
错误代码: 500
目标 Servlet: portal
错误堆栈:
Expression currentUser is undefined on line 31, column 47 in home/changePassword/changePwd.ftl.
The problematic instruction:
----------
==> ${currentUser.userNo} [on line 31, column 45 in home/changePassword/changePwd.ftl]
----------
Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression currentUser is undefined on line 31, column 47 in home/changePassword/changePwd.ftl.
at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:125)
at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:135)
at freemarker.core.Dot._getAsTemplateModel(Dot.java:78)
at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
at freemarker.core.Expression.getStringValue(Expression.java:93)
at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.Environment.process(Environment.java:199)
at freemarker.template.Template.process(Template.java:259)
at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:366)
at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:276)
at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:233)
at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:718)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at com.suning.ebuy.portal.web.filter.PortalAddressFilter.doFilter(PortalAddressFilter.java:88)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at com.suning.ebuy.portal.web.login.SoaLoginFilter.doFilter(SoaLoginFilter.java:60)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter(AbstractPreAuthenticatedProcessingFilter.java:88)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:934)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:864)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:445)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:504)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:301)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:78)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1563)
错误页异常:
错误消息: javax.servlet.ServletException: Cannot expose request attribute 'minSuffix' because of an existing model object of the same name
错误代码: 0
目标 Servlet: null
错误堆栈:
javax.servlet.ServletException: Cannot expose request attribute 'minSuffix' because of an existing model object of the same name
at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:123)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:718)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:104)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:934)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:341)
at com.ibm.ws.webcontainer.webapp.WebApp.sendError(WebApp.java:3262)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:114)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:864)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:445)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:504)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:301)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:78)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1563)
ddddddddd
文档协同系统
http://192.168.116.191/guide
http://192.168.116.196/guide
http://192.168.116.196/help/index_sys.htm#top_s3
维思文档协同系统
http://www.chinawiss.com/product/index.htm
北京互诚科技有限公司 |
·地址: 北京市朝阳区北苑路170号凯旋城F座1007室 |
·咨询、客服专线: 010-59273079 010-59273078 ·总机: 010-58236720 |
·传真: 010-58236720 转 812 |
<!-- end of nobordernotscroll -->
|
<!-- nobordernotscroll -->
·MSN : [email protected] |
·邮件: [email protected] |
Wiss文档协同系统突破传统低效的文件交流方式,采用先进技术和理念的全新文档管理和交流方式。 提供强大的全文检索功能,严格方便的权限管理,纯IE界面操作。是充分发挥信息共享威力、提高办公效率的利器。
Wiss软件是知识积累和交流平台。充分利用网络优势,全面实现文档的网络化,资源的共享利用,对单位资源的利用有极大的帮助。 <!-- end of nobordernotscroll -->
|
|
|
<!-- nobordernotscroll -->
· 文件的客户端自动收集,自动备份到服务器,大量节省用户上传时间。 |
· 支持用户个人和工作组二种文档管理模式。 |
· 毫秒级文件正文的全文检索,实现企业文件快速分类,检索,交流,管理。 |
· 安全、方便、严格的文件权限设置和管理,保证文件简单安全使用。 |
· 客户端通过IE实现全部功能,不需要客户端软件。 |
· 支持文件批量上传,自动同步,节约上传时间。 |
· 支持文件多版本控制,方便协同工作。 |
· 支持Txt文件,office文件的在线编辑。 |
· 用户上传空间控制。 |
· 方便的工作组目录管理。 |
· 自带高效的数据库,无需其他任何软件的支持,减少用户成本。 |
· 无需微软的IIS支持,安装维护简单。 |
· 绿色软件,安装简单,3分钟完成,无需设置。 |
· 系统支持*.bmp, *.gif, *.jpg, *.jpeg, *.png, *.psd, *.pdd, *.psp, *.tga, *.tif; *.tiff, *.pcd, *.fax, *.bw, *.rgb, *.rgba, *.sgi, *.cel, *.pic, *.vst; *.icb; *.vda; *.win, *.rle, *.dib, *.pcx, *.pcc, *.scr, *.ppm, *.pgm, *.pbm, *.cut, *.pal, *.rla, *.rpf等图形文件的缩略图预览。 |
NTKO OFFICE文档控件
http://www.ntko.com/
http://www.ntko.com/admin/homepagenew.nsf/vwAllDocsByAID/CF01B5CDA9F15670482576280036C91A
最新推出的NTKO OFFICE文档控件企业版本 , 集成了更安全的、通过国家公安部认证的安全电子印章功能,可以实现安全度更高的电子印章解决方案。其他版本的文档控件在安装了NTKO安全电子印章系统的 前提下,也可以通过接口,无缝调用安全电子印章的功能。在NTKO OFFICE文档控件中集成NTKO安全电子印章系统的好处在于,采用ActiveX控件技术实现电子印章,而且电子印章能够动态检测文档内容的改变。
NTKO OFFICE文档控件是拥有完全自主知识产权的ActiveX控件。使用NTKO Office文档控件,能够在浏览器中直接编辑Word,Excel等Office文档,或者WPS,金山电子表等文档并保存到web服务器。实现文档和电子表格的统一管理。
NTKO OFFICE文档控件具有在线编辑,痕迹保留,手写签名,模板套红,安全电子印章[企业版提供],全屏批注,保存为HTML,MHT,PDF文件等办公自 动化系统必备的功能。可以运行在PHP,ASP,JSP,C#,VB.NET,DOMINO等各种web编程语言和服务器。
NTKO OFFICE文档控件一直引领着在线编辑领域的技术方向。它采用了我们独创的“智能提交” 技 术,在提交文档的同时,系统能够智能获取指定HTML FORM中的其他数据(包括其他的上传文件)并和文档数据同时提交。只须简单的指定FORM ID或索引即可,无须单独传递每个域。这将让您更加简单快速的将控件集成到您的产品中。另外,NTKO OFFICE文档控件具有异步下载功能。异步下载方法支持显示下载进度,或者不显示下载进度的选项,大大改善了用户界面体验,并满足多种不同层次的开发需 求。
NTKO OFFICE文档控件的状态栏可以显示Word文档的页码和页数等信息。在Excel中,用户拖放选择单元格时,还可以自动对所选单元格进行求和并显示在状态栏。用户使用更加方便。
NTKO OFFICE文档控件完全采用标准HTTP上传协议,支持任意后台Web服务器(iis,domino,webaphere,apache等)任意后台操 作系统(win2k, win2003, linux, unix等),以及任意后台编程语言(asp,asp.net,jsp,php,vb.net,c#等)和任意web应用服务器体系结构(j2ee, .net等)。卓越的性能,低廉的价格,标准高效的编程接口,让您以最低的开发成本,轻松创建极具特色的办公自动化解决方案!
NTKO OFFICE文档控件不仅可用于创建B/S结构的应用,更全面支持C/S方式的编程和其他容器。您可以在VB,Delphi,以及C++ Builder中使用控件。快速创建C/S结构的应用。
新密码规则:
A. 密码长度至少6位
B. 密码至少是以下四类字符中三类的组合:
• 小写英文字母( a 到 z )
• 大写英文字母( A 到 Z )
• 阿拉伯数字( 0 到 9 )
• 非英文字符( !、$、#、%、@、&、*、-、_)
C. 新密码不与近3次历史密码相同 D. 新密码有效期:90天
end