Передача длинных текстов в движке Camunda BPMN - http разъем
Я сделал реализацию для вызова конечных точек http REST из camunda bpmn через http-коннектор camunda.
В этом случае, во-первых, BpmnInvoker
Конечная точка REST будет называться при условии bpmnProcessId
в качестве пути и Authorization
ключ в качестве параметра заголовка с requestBody, то в пределах BpmnInvoker
соответствующая диаграмма bpmn будет вызвана передачей значений requestBody. И в этих задачах bpmn будут некоторые служебные задачи, которые будут вызывать конечные точки REST.
Для вызова конечных точек REST из диаграмм BPMN я использую Camunda HTTP Connector. И в этом случае мне нужно передать ключ авторизации как заголовок http конечной точке REST.
Для этого я добавляю ключ авторизации в карту переменных и беру его в качестве переменной на диаграмме bpmn и добавляю в заголовок Map, как указано на рисунке и диаграмме bpmn.
Но проблема в том, что длина этого Авторизации обычно превышает 4000 символов. Таким образом, он не может быть передан в виде строки через движок Camunda. Я попытался преобразовать его в другой объект (например, byte[] / StringBuffer и т. Д.), Предполагая, что он будет сохранен как большой двоичный объект, но в этом случае он дает исключение Class Cast, когда он собирается назначить заголовок http.
- Как это сделать в Камунде?
- Есть ли вообще не хранить эти объекты в БД?
- Я отметил, что есть некоторые варианты, чтобы изменить тип столбца на текстовый CLOB / увеличить размер и т. Д. Будет ли это хорошей идеей?
BPMNInvoke.java
@Path("/base")
public class BpmnInvoker {
ProcessEngine defaultProcessEngine = BpmPlatform.getProcessEngineService().getDefaultProcessEngine();
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
@POST
@Path("/path/{bpmnProcessId}")
public Response start(@PathParam("bpmnProcessId") String bpmnProcessId, String requestBody, @HeaderParam("Authorization") String authorization) {
Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap = IntegrationUtility.convertJSONStringToMap(requestBody);
// Set the Authorization token to the variable map.
// Normally this is more than 4000 characters long dynamic key.
// It must be set as a http header value when invoking REST endpoint via http connector.
variableMap.put("Authorization", authorization);
// Invoke the bpmn diagram by calling the startProcessInstanceByKey on runtimeService.
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(bpmnProcessId, variableMap);
// rest of the work after completing the process engine
}
}
----
----
<bpmn:serviceTask id="Task_1ujngj7" name="Dummy Service 2">
<bpmn:extensionElements>
<camunda:connector>
<camunda:inputOutput>
<camunda:inputParameter name="url">http://localhost:8080/x-services/path/to/rest/service</camunda:inputParameter>
<camunda:inputParameter name="method">POST</camunda:inputParameter>
<camunda:inputParameter name="headers">
<camunda:map>
<camunda:entry key="Authorization">${Authorization}</camunda:entry>
<camunda:entry key="Content-Type">application/json</camunda:entry>
</camunda:map>
</camunda:inputParameter>
<camunda:inputParameter name="payload">${payload}</camunda:inputParameter>
<camunda:outputParameter name="payload">${response}</camunda:outputParameter>
</camunda:inputOutput>
<camunda:connectorId>http-connector</camunda:connectorId>
</camunda:connector>
</bpmn:extensionElements>
<bpmn:incoming>SequenceFlow_0w4wfbo</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_153ti9s</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="SequenceFlow_1kvov2r" sourceRef="Task_0i9s02e" targetRef="EndEvent_0o062nq" />
<bpmn:serviceTask id="Task_0i9s02e" name="DummyServiceClear" camunda:delegateExpression="${dummyServiceClear}">
<bpmn:incoming>SequenceFlow_153ti9s</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_1kvov2r</bpmn:outgoing>
</bpmn:serviceTask>
----
----
1 ответ
Попробуй это:
import org.camunda.bpm.engine.variable.Variables;
import org.camunda.bpm.engine.variable.Variables.SerializationDataFormats;
variableMap.put("Authorization", Variables
.objectValue(authorization)
// tells the engine to use java serialization for persisting the value
.serializationDataFormat(SerializationDataFormats.JAVA)
.create());