Передача длинных текстов в движке 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

----
----
    <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());
Другие вопросы по тегам