让骆驼使用地图构建端点uri

时间:2019-12-03 14:10:18

标签: java apache-camel

有没有办法让骆驼使用包含请求参数的Map<String, String>创建端点的uri?

我经常遇到这样的情况,我通过配置获得了不同的参数,并且必须在运行时以编程方式构建uri(此后是静态的)。
目前,我总是必须自己构建uri,该方法可以找到,但是我想知道是否有更清洁的方法。

例如,这就是我如何使用一些配置(可能不是最简单的代码,但可以正常工作)为smtp enpoint构建uri:

private String buildSmtpUri() {
  StringBuilder sb = new StringBuilder();
  if (configuration.isEnableSslSecurity()) {
    sb.append("smtps://");
  } else {
    sb.append("smtp://");
  }
  Assert.hasText(configuration.getSmtpUrl(), "No smtp url was given");
  sb.append(configuration.getSmtpUrl());
  if (configuration.getPort() != null) {
    sb.append(":");
    sb.append(configuration.getPort());
  }
  Map<String, String> parameters = new HashMap<>();
  if (StringUtils.isNotEmpty(configuration.getUsername())) {
    parameters.put("username", configuration.getUsername());
  }
  if (StringUtils.isNotEmpty(configuration.getPassword())) {
    parameters.put("password", configuration.getPassword());
  }
  if (configuration.isBodyIsHtml()) {
    parameters.put("contentType", "text/html");
  }

  AtomicBoolean first = new AtomicBoolean(true);
  parameters.forEach((key, value) -> {
    if (first.get()) {
      first.set(false);
      sb.append("?");
    } else {
      sb.append("&");
    }
    sb.append(key)
        .append("=")
        .append(value);
  });

  return sb.toString();
}

如果无法使用某些骆驼界面简化此操作,也许将来它可能是一个很棒的功能?

问候 克里斯

2 个答案:

答案 0 :(得分:3)

您可以使用Component#createEndpoint方法来动态构建Endpoint实例。

public class MyRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception{
        from(dynamicEndpoint("seda", "mySeda", Collections.singletonMap("size", "123")))
                .to("log:Hello from SEDA");
    }

    private Endpoint dynamicEndpoint(String component, String name, Map<String, Object> params) throws Exception {
        return getContext().getComponent(component).createEndpoint(name, params);
    }
}

在骆驼2.x中,也有解决方案,虽然不是那么优雅

private Endpoint dynamicEndpoint(String component, String name, Map<String, Object> params) throws Exception {
    String uri = String.format("%s://%s?%s", component, name, org.apache.camel.util.URISupport.createQueryString(params));
    return getContext().getEndpoint(uri);
}

答案 1 :(得分:0)

是的,我认为有更简单的方法。您可以使用simple language来制作uri。您也可以在process(Process process)表达式之后在simple中将其与您自己的Processs组合。例如,您可以使用simple设置终结点,然后添加process()终结点,您可以在其中更改终结点或制作新的String uri,然后可以使用setHeader()传递给下一个终结点处理器。