无法使用http连接器

时间:2016-10-11 11:29:14

标签: camunda

我试图使用标准Camunda实现提供的http连接器,但没有运气。每次运行我的工作流程时,实例都会冻结该活动。我在执行列表中使用此类,我使用的代码是:

import org.apache.ibatis.logging.LogFactory;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.Expression;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.camunda.bpm.engine.impl.util.json.JSONObject;
import org.camunda.connect.Connectors;
import org.camunda.connect.ConnectorException;
import org.camunda.connect.httpclient.HttpConnector;
import org.camunda.connect.httpclient.HttpResponse;
import org.camunda.connect.httpclient.impl.HttpConnectorImpl;
import org.camunda.connect.impl.DebugRequestInterceptor;



public class APIAudit implements JavaDelegate {
static {
    LogFactory.useSlf4jLogging(); // MyBatis
  }

private static final java.util.logging.Logger LOGGER = java.util.logging.Logger.getLogger(Thread.currentThread().getStackTrace()[0].getClassName());

private Expression tokenField;
private Expression apiServerField;
private Expression questionIDField;
private Expression subjectField;
private Expression bodyField;

public void execute(DelegateExecution arg0) throws Exception {

    String tokenValue = (String) tokenField.getValue(arg0);
    String apiServerValue = (String) apiServerField.getValue(arg0);
    String questionIDValue = (String) questionIDField.getValue(arg0);
    String subjectValue = (String) subjectField.getValue(arg0);
    String bodyValue = (String) bodyField.getValue(arg0);
    if (apiServerValue != null) {
        String url = "http://" + apiServerValue + "/v1.0/announcement";

        LOGGER.info("token: " + tokenValue);
        LOGGER.info("apiServer: " + apiServerValue);
        LOGGER.info("questionID: " + questionIDValue);
        LOGGER.info("subject: " + subjectValue);
        LOGGER.info("body: " + bodyValue);
        LOGGER.info("url: " + url);

        JSONObject jsonBody = new JSONObject();
        jsonBody.put("access_token", tokenValue);
        jsonBody.put("source", "SYSTEM");
        jsonBody.put("target", "AUDIT");
        jsonBody.put("tType", "system");
        jsonBody.put("aType", "auditLog");
        jsonBody.put("affectedItem", questionIDValue);
        jsonBody.put("subject", subjectValue);
        jsonBody.put("body", bodyValue);
        jsonBody.put("language", "EN");

        try {
            LOGGER.info("Generating connection");

            HttpConnector http = Connectors.getConnector(HttpConnector.ID);

            LOGGER.info(http.toString());
            DebugRequestInterceptor interceptor = new DebugRequestInterceptor(false);
            http.addRequestInterceptor(interceptor);

            LOGGER.info("JSON Body: " + jsonBody.toString());

            HttpResponse response = http.createRequest()
                                        .post()
                                        .url(url)
                                        .contentType("application/json")
                                        .payload(jsonBody.toString())
                                        .execute();

            Integer responseCode = response.getStatusCode();
            String responseBody = response.getResponse();
            response.close();
            LOGGER.info("[" + responseCode + "]: " + responseBody);
        } catch (ConnectorException e) {
            LOGGER.severe(e.getMessage());
        }


    } else {

        LOGGER.info("No APISERVER provided");

    }

    LOGGER.info("Exiting");

}
}

我确信字段注入正常,因为类打印了正确的值。我也在同一个活动中使用javascript中的http连接器没有问题。

我使用这种方法,因为我需要在同一个任务中对外部REST服务进行两次不同的调用,所以任何建议都会非常受欢迎。

1 个答案:

答案 0 :(得分:0)

您需要在流程引擎配置中启用Connect流程引擎插件。不确定如何配置流程引擎,请确保添加此插件org.camunda.connect.plugin.impl.ConnectProcessEnginePlugin

还要检查依赖项中的以下内容

  1. 不要添加两个依赖项 - connectors-all和http-connector。
  2. 确保检查错误日志,看看是否有任何与httpclient类相关的类加载问题
  3. 我很确定http客户端库存在类加载问题。确保包含正确版本的连接器 - 所有依赖