Java 如何将消息事件数据变量访问到jbpm5中的网关约束定义中

Java 如何将消息事件数据变量访问到jbpm5中的网关约束定义中,java,jbpm,Java,Jbpm,我在这张图中描述了一个流程: 如果两条事件消息都触发,则和Converge网关上有一个控件用于结束进程或记录字符串。 如果只有其中一个触发,进程将等待几秒钟,然后将一个变量检查到消息数据中,以决定它是否必须结束或记录 事件消息的属性: EventType a_fall_message Name A message Scope external VariableName a_message 写入或终止网关约束的

我在这张图中描述了一个流程:

如果两条事件消息都触发,则和Converge网关上有一个控件用于结束进程或记录字符串。 如果只有其中一个触发,进程将等待几秒钟,然后将一个变量检查到消息数据中,以决定它是否必须结束或记录

事件消息的属性:

    EventType      a_fall_message
    Name           A message
    Scope          external
    VariableName   a_message
写入或终止网关约束的代码:

return a_message.getConfidenceIndex() < 0.8;
简单java main:

public static void main(String[] args) throws Exception {
    KnowledgeBase knowledgeBase = readKnowledgeBase("messagetestevent.rf");
    StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();

    Map<String, Object> parameterMap = new HashMap<String, Object>();
    Integer i = 2;
    parameterMap.put("groupId", i);
    SimpleWorkItemHandler handler = new SimpleWorkItemHandler();
    ksession.getWorkItemManager().registerWorkItemHandler("Log", handler);
    ProcessInstance a = ksession.startProcess("com.droolstest.messagetestevent", parameterMap);
    a.signalEvent("a_fall_message", new FallMessage(0.7));
    a.signalEvent("b_fall_message", new FallMessage(0.7));
    ksession.fireAllRules();
}

private static KnowledgeBase readKnowledgeBase(String name) throws Exception {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource(name), ResourceType.DRF);
    return kbuilder.newKnowledgeBase();
}
所以我需要访问Message事件数据变量a_Message。播放此简单项目时,我在控制台上看到以下消息:

Process Compilation error : org.drools.lang.descr.ProcessDescr@10e35d5
com/droolstest/Process_com_droolstest_0.java (8:357) : b_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (18:627) : b_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (28:897) : b_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (28:939) : a_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (38:1209) : b_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (38:1251) : a_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (48:1521) : a_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (58:1791) : a_message cannot be resolved

Exception in thread "main" java.lang.IllegalArgumentException: Could not parse knowledge.
at org.drools.builder.impl.KnowledgeBuilderImpl.newKnowledgeBase(KnowledgeBuilderImpl.java:58)
at com.droolstest.DroolsTest.readKnowledgeBase(DroolsTest.java:39)
at com.droolstest.DroolsTest.main(DroolsTest.java:17)

您有什么建议吗?

在没有看到实际的bpmn2 xml的情况下,不确定到底发生了什么,但您似乎在某处(在操作脚本或条件中)使用了名为“cnr_消息”和“emt_消息”的变量,但您没有将它们定义为流程变量


编译错误并不是直接抱怨某个消息,因此如果您将其定义为一个流程变量,乍一看似乎工作正常。

您是对的,问题在于缺少消息变量声明。
public class FallMessage {
    double confidenceIndex;

    public FallMessage(double c) {
        confidenceIndex = c;
    }
    public double getConfidenceIndex() {
        return confidenceIndex;
    }

    public void setConfidenceIndex(double confidenceIndex) {
        this.confidenceIndex = confidenceIndex;
    }
}
Process Compilation error : org.drools.lang.descr.ProcessDescr@10e35d5
com/droolstest/Process_com_droolstest_0.java (8:357) : b_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (18:627) : b_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (28:897) : b_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (28:939) : a_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (38:1209) : b_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (38:1251) : a_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (48:1521) : a_message cannot be resolved
com/droolstest/Process_com_droolstest_0.java (58:1791) : a_message cannot be resolved

Exception in thread "main" java.lang.IllegalArgumentException: Could not parse knowledge.
at org.drools.builder.impl.KnowledgeBuilderImpl.newKnowledgeBase(KnowledgeBuilderImpl.java:58)
at com.droolstest.DroolsTest.readKnowledgeBase(DroolsTest.java:39)
at com.droolstest.DroolsTest.main(DroolsTest.java:17)