سؤال

أنا أستخدم لغة تعريف العملية JPDL من محرك عمل JBOSS: JBPM.

أريد دمج بسيطة جدا معالجة تعريف التعريف: في الأساس ، لدي تعريف رئيسي للعملية (بسيط/ProcessDefinition.xml) بما فيها :

  • عقدة البداية ،
  • عقدة حالة العملية ،
  • عقدة نهاية.

هنا هو تعريف الرسم البياني:

<process-definition 
  xmlns="urn:jbpm.org:jpdl-3.2"
  name="simple">
   <start-state name="start">
        <transition name="to_state" to="process-state">
         <action name="action" class="com.sample.action.MessageActionHandler">
            <message>
                    Going to the sub-state!
                </message>
         </action>
      </transition>
        <event type="node-leave">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    Start.
                </message>
            </action>
        </event>
   </start-state>
   <process-state name="process-state">
        <sub-process name="subsimple" binding="late"/>
        <variable access="read,write" name="message" mapped-name="message">        </variable>
        <event type="node-enter">
            <action class="com.sample.action.MessageActionHandler"></action>
        </event>
        <transition to="end" name="to_end"></transition>
    </process-state>
   <end-state name="end">
        <event type="node-enter">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    End.
                </message>
            </action>
        </event>
    </end-state>
</process-definition>

ضمن عقدة حالة العملية ، حددت أ العملية الفرعية رسم بياني (subcyple/processDefinition.xml) تحتوي :

  • عقدة البداية ،
  • عقدة الدولة ،
  • عقدة نهاية.

هنا هو تعريف الرسم البياني:

<process-definition 
  xmlns="urn:jbpm.org:jpdl-3.2"
  name="subsimple">
   <start-state name="start">
        <transition name="to_state" to="first">
         <action name="action" class="com.sample.action.MessageActionHandler">
            <message>Going to the first state!</message>
         </action>
      </transition>
        <event type="node-leave">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    Start.
                </message>
            </action>
        </event>
   </start-state>
   <state name="first">
      <event type="node-enter">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    In first state !!
                </message>
            </action>
        </event>
        <transition name="to_end" to="end">
         <action name="action" class="com.sample.action.MessageActionHandler">
            <message>
                    About to go out of sub-process !
                </message>
         </action>
      </transition>
   </state>
   <end-state name="end">
        <event type="node-enter">
            <action class="com.sample.action.MessageActionHandler">
                <message>
                    End.
                </message>
            </action>
        </event>
    </end-state>
</process-definition>

ها هو ActionHandler مخصصة لكل أحداث والتحولات:

public class MessageActionHandler implements ActionHandler {

    private static final long serialVersionUID = 1L;

    String message;

    public void execute(ExecutionContext context) throws Exception {
        context.getContextInstance().setVariable("message", message);

        System.out.println(context.getContextInstance().getVariable("message"));
    }
}

في النهاية ، ها هو الفئة الرئيسية التي أبدأ بها العملية برمتها:

public class testJBPM {

public static void main(String[] args) {

    ProcessDefinition processDefinition = ProcessDefinition
            .parseXmlResource("simple/processdefinition.xml");

    // Create an instance of the process definition.
    ProcessInstance instance = new ProcessInstance(processDefinition);

    // Move the process instance from its start state to the first state.
    instance.signal();

    // Move the process instance to the end state.
    instance.signal();
}
}

عندما قرأت في منتدى JBoss ، قمت بتعيين بشكل صحيح binding=late على ربط العمليات الفرعية في تعريف العملية الرئيسية. ثم جربت طرقًا مختلفة لتأسيس تعريف العملية للعملية الفرعية ، لكنني دائمًا ما أحصل على الاستثناء التالي عند محاولة إدخال العقدة الفرعية/العملية الفرعية:

Exception in thread "main" org.jbpm.JbpmException: can't create a process instance     when processDefinition is null
    at org.jbpm.graph.exe.ProcessInstance.<init>(ProcessInstance.java:128)
    at org.jbpm.graph.exe.ProcessInstance.<init>(ProcessInstance.java:92)
    at org.jbpm.graph.exe.Token.createSubProcessInstance(Token.java:624)
    at org.jbpm.graph.node.ProcessState.execute(ProcessState.java:164)
    at org.jbpm.graph.def.Node.enter(Node.java:319)
    at org.jbpm.graph.def.Transition.take(Transition.java:151)
    at org.jbpm.graph.def.Node.leave(Node.java:394)
    at org.jbpm.graph.node.StartState.leave(StartState.java:70)
    at org.jbpm.graph.exe.Token.signal(Token.java:195)
    at org.jbpm.graph.exe.Token.signal(Token.java:140)
    at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:271)
    at com.sample.main.testJBPM.main(testJBPM.java:21)

هل يمكن لأي شخص أن يعطيني نصائح حول كيفية إدارة تعريف العملية الفرعية واستخدامها؟

هل كانت مفيدة؟

المحلول

لقد وجدت في النهاية بنفسي:

  • أولاً ، واحد فقط instance.signal(); من الضروري اندفاع مسار العمليات بأكملها main().

  • بعد ذلك ، يجب تنفيذ واجهة للسماح لـ JBPM بالبحث وتأسيس العمليات الفرعية المطلوبة:

    public class DbSubProcessResolver implements SubProcessResolver {
        private static final long serialVersionUID = 1L;
    
            public ProcessDefinition findSubProcess(Element subProcessElement) {
    
                String name = subProcessElement.attributeValue("name").replaceAll(
                    "\\.", "");
                ProcessDefinition subProcessDefinition = ProcessDefinition
                    .parseXmlResource(name + "/processdefinition.xml");
    
                return subProcessDefinition;
            }
    }
    
  • في نهاية المطاف ، يجب تحديد ملف تكوين JBPM لتعيين حل JBPM Framework Resolver إلى الموجة المطلوبة:

    <jbpm-configuration>
        <bean name="jbpm.sub.process.resolver" class="com.sample.resolver.DbSubProcessResolver" />
    </jbpm-configuration>
    

... وهو يعمل بشكل جيد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top