这是什么原因呢?
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)

解决方案 »

  1.   

    最近几天没来,所以没看到你的贴子,关于你遇到的错误,最可能的原因是actionid = 2 里result使用了join方法,但在你的xml中根本没有join的相关定义,大多数情况下,我们都可以不用join的功能,你只需要好象action 1 一样,定义action 2 完成后,将会跳转到第n个step就可以了. 
    如果你想试一下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>
      

  2.   

    什么意思? 你的项目中定义了很多工作流xml文件吗? 说详细点.
      

  3.   


    flowId = workflow.initialize("DefaultWorkFlow", 10, null); 
    就是这个不是可以创建很多个流程么
    比如,申请请假,通过审批
    一个人要请假 等待审批 这是一个流程
    又有一个人请假 又一个流程
    。。
    类推多个人请假那么审批的人就要得到这些要请假的人进行审批
    怎么得到这些已经创建好的流程呢
      

  4.   

    就是我要得到OS_HISTORYSTEP的所有记录 怎么得到呢
      

  5.   

    两种方法:
    1.调用workflow本身的函数.
    详细例子见自带example中的test.jsp 及 underway.jsp 
    underway.jsp 列出未完成的工作流test.jsp 则列出某个工作流的当前操作及历史操作2.直接访问workflow 数据库默认的情况下以下两个表会有你需要的信息
    os_currentstep 列出当前所有工作流的当前工作状态
    os_historystep 列出已经完成的操作(步骤)直接写sql语句就可得到你想要的信息.
    个人觉得直接访问数据库会方便一点,当然要你对数据库熟悉才行. 如果对权限有特别的定义,还是需要用test.jsp的方法来取得可用的action比较安全.
      

  6.   

    呵呵 问题暂时解决了,我使用sql从数据库取的
    先不结贴啦,没分啦 后天之前还没有问题 再结  谢谢你啦
      

  7.   


    看我这个配的有什么问题么,
    跑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>
      

  8.   

    你是如何跑action=2 的? 用doaction吗? 把代码贴出来看看
      

  9.   

    哈哈 问题都暂时解决啦 谢谢啦
    有的时候在call你呀