这是什么原因呢?
workflow.doAction(flowId, 1, map);这句可以正常执行
workflow.doAction(flowId, 2, map);就不可以了
<step id="1" name="First Draft">
<actions>
<action id="1" name="Start First Draft">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">
com.opensymphony.workflow.util.StatusCondition
</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osleave
</arg>
</function>
<function type="beanshell">
<arg name="script">
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
System.out.println("name:"+propertySet.getString("username"));
System.out.println("pwd:"+propertySet.getString("ps"));
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway"
step="2" owner="${caller}"/> </results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("11111111111111");
System.out.println("11111111111111");
</arg>
</function>
</post-functions>
</action>
</actions>
</step>
<step id="2" name="finish first step">
<actions>
<action id="2" name="Finish one">
<pre-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osqingjia
</arg>
</function>
<function type="beanshell">
<arg name="script">
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" join="1"/>
</results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("22222222222222");
System.out.println("22222222222222");
</arg>
</function>
</post-functions>
</action>
</actions>
</step>com.opensymphony.workflow.InvalidActionException: Action 2 is invalid
at com.opensymphony.workflow.AbstractWorkflow.doAction(AbstractWorkflow.java:562)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:292)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy2.doAction(Unknown Source)
at com.yourcompany.struts.Login.updateFlow(Login.java:84)
at com.yourcompany.struts.Login.actionProcess(Login.java:59)
at com.eroadsoftware.infogate.web.action.BaseAction.execute(BaseAction.java:212)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:667)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
workflow.doAction(flowId, 1, map);这句可以正常执行
workflow.doAction(flowId, 2, map);就不可以了
<step id="1" name="First Draft">
<actions>
<action id="1" name="Start First Draft">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">
com.opensymphony.workflow.util.StatusCondition
</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osleave
</arg>
</function>
<function type="beanshell">
<arg name="script">
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
System.out.println("name:"+propertySet.getString("username"));
System.out.println("pwd:"+propertySet.getString("ps"));
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway"
step="2" owner="${caller}"/> </results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("11111111111111");
System.out.println("11111111111111");
</arg>
</function>
</post-functions>
</action>
</actions>
</step>
<step id="2" name="finish first step">
<actions>
<action id="2" name="Finish one">
<pre-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osqingjia
</arg>
</function>
<function type="beanshell">
<arg name="script">
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" join="1"/>
</results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("22222222222222");
System.out.println("22222222222222");
</arg>
</function>
</post-functions>
</action>
</actions>
</step>com.opensymphony.workflow.InvalidActionException: Action 2 is invalid
at com.opensymphony.workflow.AbstractWorkflow.doAction(AbstractWorkflow.java:562)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:292)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy2.doAction(Unknown Source)
at com.yourcompany.struts.Login.updateFlow(Login.java:84)
at com.yourcompany.struts.Login.actionProcess(Login.java:59)
at com.eroadsoftware.infogate.web.action.BaseAction.execute(BaseAction.java:212)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:667)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
如果你想试一下join,则必须在你的xml中定义joins 节点
例子
<joins>
<join id="1">
<conditions type="AND">
<condition type="beanshell">
....
</condition>
</conditions>
<unconditional-result old-status="Finished" status="Underway" owner="test" step="2"/>
</join>
</joins>
flowId = workflow.initialize("DefaultWorkFlow", 10, null);
就是这个不是可以创建很多个流程么
比如,申请请假,通过审批
一个人要请假 等待审批 这是一个流程
又有一个人请假 又一个流程
。。
类推多个人请假那么审批的人就要得到这些要请假的人进行审批
怎么得到这些已经创建好的流程呢
1.调用workflow本身的函数.
详细例子见自带example中的test.jsp 及 underway.jsp
underway.jsp 列出未完成的工作流test.jsp 则列出某个工作流的当前操作及历史操作2.直接访问workflow 数据库默认的情况下以下两个表会有你需要的信息
os_currentstep 列出当前所有工作流的当前工作状态
os_historystep 列出已经完成的操作(步骤)直接写sql语句就可得到你想要的信息.
个人觉得直接访问数据库会方便一点,当然要你对数据库熟悉才行. 如果对权限有特别的定义,还是需要用test.jsp的方法来取得可用的action比较安全.
先不结贴啦,没分啦 后天之前还没有问题 再结 谢谢你啦
看我这个配的有什么问题么,
跑actionid=2时候 抛Action 2 is invalid<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.6//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
<workflow>
<initial-actions>
<action id="10" name="Start Workflow">
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>
</results>
</action>
</initial-actions>
<steps>
<step id="0" name="begin">
<actions>
<action id="0" name="beginning">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">
com.opensymphony.workflow.util.StatusCondition
</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osbegin1
</arg>
</function>
<function type="beanshell">
<arg name="script">
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
System.out.println("name:"+propertySet.getString("username"));
System.out.println("pwd:"+propertySet.getString("ps"));
</arg>
</function>
</pre-functions>
<results>
<result old-status="Finished" status="Underway" step="1">
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
propertySet.getString("username").equals("1")
</arg>
</condition>
<condition type="beanshell">
<arg name="script">
propertySet.getString("ps").equals("1")
</arg>
</condition>
</conditions>
<!--<post-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osbegin1
</arg>
</function>
</post-functions>-->
</result>
<result old-status="Finished" status="Underway" step="1">
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
propertySet.getString("username").equals("2")
</arg>
</condition>
<condition type="beanshell">
<arg name="script">
propertySet.getString("ps").equals("2")
</arg>
</condition>
</conditions>
<post-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osbegin2
</arg>
</function>
</post-functions>
</result>
<unconditional-result old-status="Finished" status="Underway"
step="1" owner="${caller}"/> </results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("000000000000000");
System.out.println("000000000000000");
</arg>
</function>
</post-functions>
</action>
</actions>
</step>
<step id="1" name="First Draft">
<actions>
<action id="1" name="Start First Draft">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">
com.opensymphony.workflow.util.StatusCondition
</arg>
<arg name="status">Underway</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="beanshell">
<arg name="script">
propertySet.setString("status","Underway");
</arg>
</function>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osleave
</arg>
</function>
<function type="beanshell">
<arg name="script">
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
</arg>
</function>
</pre-functions>
<results>
<result old-status="Finished" status="Underway" step="3">
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
propertySet.getString("username").equles("3")
</arg>
</condition>
</conditions>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("11111111111111");
System.out.println("11111111111111");
</arg>
</function>
</post-functions>
</result>
<unconditional-result old-status="Finished" status="Underway"
step="2" owner="${caller}"/>
</results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("11111111111111");
System.out.println("11111111111111");
</arg>
</function>
</post-functions>
</action>
</actions>
</step>
<step id="2" name="finish first step">
<actions>
<action id="2" name="Finish one">
<pre-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osqingjia
</arg>
</function>
<function type="beanshell">
<arg name="script">
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="finished" step="4"/>
</results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("22222222222222");
System.out.println("22222222222222");
</arg>
</function>
</post-functions>
</action>
</actions>
</step>
<step id="3" name="finish second step">
<actions>
<action id="3" name="Finish leave">
<pre-functions>
<function type="class">
<arg name="class.name">
com.yourcompany.struts.Osqingjia
</arg>
</function>
<function type="beanshell">
<arg name="script">
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="finished" step="4"/>
</results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("333333333333333333");
System.out.println("333333333333333333");
</arg>
</function>
</post-functions>
</action>
</actions>
</step>
<step id="4" name="finished"/>
</steps>
</workflow>
有的时候在call你呀