2013-09-07 5 views
4

Возможно ли (и если да: как) добавить пользовательскую работу в исполнительскую службу в camunda BPM? Мое требование заключается в выполнении связанной с процессом службы по таймеру или циклу. Я не хочу моделировать это в bpmn прямо, так как это не является частью процесса. Я мог бы запустить дополнительные произвольные процессы, содержащие только одну задачу async Service, чтобы архивировать это, но я бы предпочел добавить вызов Soap/Rest/rmi в очередь заданий напрямую без дополнительных усилий. Кто-нибудь пробовал это раньше?Добавить пользовательскую работу в jobexecutor

ответ

6

Это расширенный вопрос. Возможно создание задания с использованием внутреннего API. Вы должны предоставить две вещи:

пользовательский обработчик работы:

public class CustomjobHandler implements JobHandler { 

    public static final String TYPE = "customjobHandler"; 

    public String getType() { 
     return TYPE; 
    } 

    public void execute(String configuration, ExecutionEntity execution, CommandContext commandContext) { 
     // provide custom job execution logic 
    }  
} 

Обработчик задания добавляется к конфигурации процесса двигателя. См. Список (customJobHandlers).

Команда для создания задания

, например, из Java-делегата (вы также можете использовать пользовательскую команду).

public class CreateJobCommand implements Command<String> { 

    public String execute(CommandContext commandContext) { 

    MessageEntity message = new MessageEntity(); 
    message.setJobHandlerType(CustomJobHandler.TYPE); 
    String config = "some string you want to pass to the hanlder"; 
    message.setJobHandlerConfiguration(config); 

    Context 
     .getCommandContext() 
     .getJobManager() 
     .send(message); 

    return message.getId(); 
    } 

} 

Это создает «Сущность сообщения», который выполняется как можно скорее. Если вы хотите выполнить время по времени, вы можете создать TimerEntity. Затем вы можете выполнить команду на исполнителе команд механизма процесса.

Edit: проверить это в автономном Engine, вы должны добавить CustomJobHandler к camunda.cfg.xml:

<property name="customJobHandlers"> 
<list> 
    <bean class="<FQN of CustomJobHandler>" /> 
</list> 
</property> 
+0

спасибо Даниилу. Как я могу получить команду исполнителя? Кастинг в ProcessEngineImpl, а затем getConfiguration(). GetCommandExecutor? Или есть лучший (не кастинг) способ? –

+0

В настоящее время нет. Мы могли бы подумать о предоставлении метода службы управления. Что-то вроде managementService.executeCommand (cmd) – meyerdan

+0

У вас есть рабочий пример? Я написал Spike с двумя классами выше, но получаю NPE внутри JobEntity, когда я делаю managementService.executeJob(). Кажется, что работа не может выполняться без выполнения ... Мой тестовый класс: https://gist.github.com/jangalinski/6497803 –

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