2016-10-18 2 views
0

Каков наилучший способ проверить следующее условие: Учитывая, что pid ожидает отдельное промежуточное сообщение.Activiti: как проверить, ожидает ли текущий экземпляр процесса на заданном промежуточном событии сообщения

Некоторые вещи, которые я пробовал:

Execution execution = runtimeService.createExecutionQuery().processInstanceId(<pId>) 
       .activityId(<messageEventName>).singleResult(); 
if(null!=execution){ 
//I have got assurance that this pId is pending with this messageEventName currently 
} 

Мой bmp.xml код промежуточного события сообщения:

<intermediateCatchEvent id="messageintermediatecatchevent1" name="MessageCatchEvent"> 
    <messageEventDefinition messageRef="actionOnPendingLR"></messageEventDefinition> 
    </intermediateCatchEvent> 

Мои Java-код:

private Execution checkIfProcessPendingOnPendingLRMessage(UserAction request) throws Exception { 
    String pId = request.getProcessInstanceId(); 
    Execution execution = null; 
    String messageName = "messageintermediatecatchevent1"; 
    try { 
     execution = runtimeService.createExecutionQuery().processInstanceId(pId) 
       .activityId(messageName).singleResult(); 
    } catch (Exception exe) { 
     logger.error("supplied process instance is not matching on the state in which it is pending" + pId, exe); 
    } 

    if (execution == null) { 
     throw new RuntimeException(
       "Couldn't find waiting process instance with id '" + pId + "' for message '" + messageName + "'"); 
    } 
    return execution; 

} 

& & проверки

(null!=checkIfProcessPendingOnPendingLRMessage(request)) //in main method. 

Может кто-нибудь подтвердить, что это правильный код/​​способ достижения моей цели. Кроме того, пожалуйста, поделитесь правильным подходом.

ответ

1

В конкретном случае для одного конкретного процесса вы можете использовать .activitiId(), который указывает идентификатор элемента bpmn (в вашем случае messageintermediatecatchevent1) вместо имени сообщения, на которое он подписан. Этот метод используется для элемента messageReceived в руководстве пользователя activiti. Но это не такая уж отличная идея, так как ваш процесс может подождать этого сообщения в разных middleMessageCatchingEvents, и элемент можно переименовать позже.

Вместо .activitiId() вы должны использовать .messageEventSubscriptionName().

В более общем случае вместо .singleresult() вы можете использовать .list() и проанализировать его длину. Хотя 0 и 1 очевидны, более одного исполнения в вашем процессе, ожидающих сообщения, - это возможность, с которой можно обращаться по-разному.

Также рекомендуется проверить бизнес-ключ или переменную процесса вместо конкретного идентификатора процесса.

P.S. Обратите внимание, что имя/идентификатор для сообщения в процессе может быть другим. AFAIK .messageEventSubscriptionName использует имя сообщения, а не идентификатор.

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