2016-05-31 9 views
3

Например, у меня есть рабочий процесс, который может начинаться немедленно или с задержкой (переменная startTime).В Activiti, как проверить, установлена ​​ли переменная?

Сразу после startEvent У меня есть exclusiveGateway, где я проверяю, должен ли поток продолжать или ждать до startTime.

<exclusiveGateway id="startGateway" default="startSequenceFlow3"/> 
<sequenceFlow id="startSequenceFlow1" sourceRef="startGateway" targetRef="startTimer"> 
    <conditionExpression xsi:type="tFormalExpression"><![CDATA[${startTime != null}]]></conditionExpression> 
</sequenceFlow> 

Запуск рабочего процесса прохождения переменной startTime работает отлично, но не проходит не startTime бросает исключение:

Не удается разрешить идентификатор «начальное время»

Что бы лучшим способом проверьте, установлен ли startTime, так как startTime != null не работает? Я бы предпочел не передавать startTime вообще (не startTime=null).

код, который я использую в том числе переменной:

variables.put("startTime", startTime); 
ProcessInstance instance = runtimeService.startProcessInstanceByKey(processKey, variables); 

или без:

ProcessInstance instance = runtimeService.startProcessInstanceByKey(processKey, variables); 
+1

Вместо не устанавливая 'startTime' на всех, вы можете установить его на особое значение, например,' NONE', а затем проверить в процессе, если он установлен в 'NONE' решить, что делать. – Jesper

ответ

5

Используйте следующее выражение:

${execution.getVariable('startTime') != null} 
+0

IMO это лучший ответ. –

3

Вы должны установить STARTTIME переменную в обоих случаях;

variables.put("startTime", startTime); 
ProcessInstance instance = runtimeService.startProcessInstanceByKey(processKey, variables); 

и

variables.put("startTime", null); 
ProcessInstance instance = runtimeService.startProcessInstanceByKey(processKey, variables); 

Затем проверьте переменную в шлюзе

<exclusiveGateway id="startGateway" default="waitSequenceFlow"/> 
<sequenceFlow id="startSequenceFlow" sourceRef="startGateway" targetRef="firstTask"> 
    <conditionExpression xsi:type="tFormalExpression"><![CDATA[${empty startTime}]]></conditionExpression> 
</sequenceFlow> 
<sequenceFlow id="waitSequenceFlow" sourceRef="startGateway" targetRef="startTimer"/> 

ИЛИ

Вы можете использовать http://www.activiti.org/userguide/#bpmnTimerStartEvent

+0

Да, я знаю, что я могу установить переменную в значение «null». Я бы предпочел иметь метод, в котором мне не нужно устанавливать переменную. Например, у меня есть два GUI, и каждый из них заполняет только переменные, которые он предоставляет, а это означает, что в GUI1 есть разные переменные, чем в GUI2. Я поддержал, но не могу отметить это как ответ. –

+0

Вы можете добавить ServiceTask до Gateway, который проверяет, установлена ​​ли переменная, а если нет, то установите ее с помощью null. – fersmi

Смежные вопросы