Как скопировать выбранное свойство (не все) с верблюда на активность

Верблюжий сценарий:

  • прочитать файл
  • сделать что-то, например, сохранить содержимое в базе данных
  • запустить процесс активности и передать переменную с предыдущего шага

Построитель маршрутов:

from("file:/home/work/Inbox")
.to("bean:sourceFileService?method=storeFile")
.to("activiti:Receive?copyVariablesFromProperties=true")

Во время вызова bean-компонента sourceFileService устанавливается свойство sourceFileId. Эта переменная должна быть передана процессу Получить как переменная.

Если я не использую copyVariablesFromProperties, ни одна переменная не устанавливается в процессе. С другой стороны, когда copyVariablesFromProperties=true, тогда верблюд пытается передать все свойства, и возникает исключение:

ActivitiException: не удалось найти тип переменной, способный сериализовать GenericFile.

(поскольку одним из свойств является объект, представляющий прочитанный файл, есть 7 других нежелательных свойств)

Как передать только выбранное свойство в конечную точку активности или в верблюда к любому следующему «до»?


person Dariusz Skrudlik    schedule 11.04.2013    source источник


Ответы (2)


измените сигнатуру метода storeFile sourceFileService следующим образом;

public String storeFile(... your other params, @OutHeaders Map headers) {
       ...
       headers.put("sourceFileId", "32132132");
       ....
}

и вы можете получить доступ к набору sourceFileId в вашей конечной точке activiti

person dursun    schedule 11.04.2013
comment
У меня есть 'public void storeFile(Exchange exchange) {... exchange.setProperty(sourceFileId, 1234); ... } ' Хорошо. Нужно знать, как передать это свойство как переменную для процесса activiti '.to(activiti:Receive)' - person Dariusz Skrudlik; 12.04.2013

Я обнаружил, что использование copyVariablesFromProperties не обязательно. То же достигается за счет

.setBody().properties()
.to("activiti:Receive")

Когда в теле есть Map camel, установите переменные для процесса activiti, использующего эту карту. Но я все еще получаю исключение по той же причине (пропускаю нежелательный, не сериализуемый объект).

Единственное решение, которое я нашел, это

from("file:/home/work/Inbox")
.to("bean:sourceFileService?method=storeFile")
.setBody(method(Helper.class))
.to("activiti:Receive")

куда

public class Helper {
    @Handler
    public Map getProcessVariables(Exchange exchange) {
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("sourceFileId, exchange.getProperty("sourceFileId"));
        return variables;
    }
}
person Dariusz Skrudlik    schedule 12.04.2013