0

我正在使用 Spring Cloud Data Flow Java Task DS L 在 Kubernetes 上启动 Spring Cloud Flow Tasks。

一切都按预期工作,并且 pod 启动成功;但是,当我尝试通过传递逗号分隔的作业注释作为输入参数来启动 pod 时,如下所示 (value1,value2),pod 的启动失败:

Map<String, String> taskLaunchProperties = new DeploymentPropertiesBuilder()                         
   .put("deployer.mytask.kubernetes.jobAnnotations", "myAnnotation:value1,value2").build();

尝试使用上述参数启动任务会导致以下异常:

org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 : [[{"logref":"IllegalArgumentException","message":"无效注释值: value2","links":[]}]]

但是,如果我只传递一个注释值(即 value1),则相同的代码可以正常工作:

Map<String, String> taskLaunchProperties = new DeploymentPropertiesBuilder()
    .put("deployer.mytask.kubernetes.jobAnnotations", "myAnnotation:value1").build();

在进一步挖掘中,我发现问题的根本原因是Spring Cloud Data Flow 用于解析输入属性的PropertyParseUtils类:

public static Map<String, String> getStringPairsToMap(String stringPairs) {
        Map<String, String> mapValue = new HashMap<>();

        if (StringUtils.hasText(stringPairs)) {
            String[] pairs = stringPairs.split(",");
            for (String pair : pairs) {
                String[] splitString = pair.split(":", 2);
                Assert.isTrue(splitString.length == 2, String.format("Invalid annotation value: %s", pair));//This is the line that prevents me from passing a comma seperated list of values for an annotaiton
                mapValue.put(splitString[0].trim(), splitString[1].trim());
            }
        }

        return mapValue;
    }

在上面的类中编写代码的方式(参见Assert.isTrue语句),它永远不会允许为给定的注释传递逗号分隔的列表。

问题:使用 Spring Cloud Data Flow 时,我们如何为注释传递逗号分隔的值列表?

更新 1:Spring Cloud Deployer Git Page也在跟踪这个问题

我尝试使用内部使用 Spring Cloud Deployer Kubernetes 版本(2.7.2)的最新 Spring Cloud Data Flow 版本(2.9.2),但仍然看到相同的问题。以下是 SCDF 服务器端的日志:

java.lang.IllegalArgumentException:无效的注释值:org.springframework.util.Assert.isTrue(Assert.java:121) 的 A"' ~[spring-core-5.3.14.jar!/:5.3.14] 在 org .springframework.cloud.deployer.spi.kubernetes.support.PropertyParserUtils.getStringPairsToMap(PropertyParserUtils.java:46) ~[spring-cloud-deployer-kubernetes-2.7.2.jar!/:2.7.2] 在 org.springframework。 cloud.deployer.spi.kubernetes.DeploymentPropertiesResolver.getJobAnnotations(DeploymentPropertiesResolver.java:701) ~[spring-cloud-deployer-kubernetes-2.7.2.jar!/:2.7.2] at org.springframework.cloud.deployer.spi .kubernetes.KubernetesTaskLauncher.launch(KubernetesTaskLauncher.java:283) ~[spring-cloud-deployer-kubernetes-2.7.2.jar!/:2.7.2] 在 org.springframework.cloud.deployer.spi.kubernetes.KubernetesTaskLauncher。启动(KubernetesTaskLauncher.java:120) ~[spring-cloud-deployer-kubernetes-2.7.2.jar!/:2.7.2] at org.springframework.cloud.dataflow.server.service.impl.DefaultTaskExecutionService.executeTask(DefaultTaskExecutionService.java:402) ~ [spring-cloud-dataflow-server-core-2.9.2.jar!/:2.9.2] at org.springframework.cloud.dataflow.server.service.impl.DefaultTaskExecutionService$$FastClassBySpringCGLIB$$422cda43.invoke() ~ [spring-cloud-dataflow-server-core-2.9.2.jar!/:2.9.2]2.9.2]2.9.2]

更新 2:此问题也可以通过直接调用 Rest Endpoint 来启动任务来重现:

private static final String LAUNCH_TASK_BY_NAME = "/tasks/executions?name={?name}";

public Long launchTask(String dataflowServerUri, String name, Map<String, String> properties,
            List<String> arguments) {
        MultiValueMap<String, Object> values = new LinkedMultiValueMap<>();
        values.add("properties", DeploymentPropertiesUtils.format(properties));
        values.add("arguments", StringUtils.collectionToDelimitedString(arguments, " "));
        return restTemplate.postForObject(dataflowServerUri + LAUNCH_TASK_BY_NAME, values, Long.class, name);
 }

更新:@cppwfs 我使用了您的示例客户端代码,并指向了托管在我们的企业OpenShift平台上的 SCDF 服务器 pod。我仍然能够重现该错误。

到目前为止,我们知道什么?

  1. 从PropertyParserUtilsTest ** 中的testAnnotationParseInvalidValue单元测试很明显,它不支持同一注释的逗号分隔值。
  2. 从 SCDF 服务器日志中可以明显看出,SCDF 服务器正在调用PropertyParserUtils#getStringPairsToMap ,并且它无法解析相同注释的逗号分隔值。

查看上面的#1 和#2,我们可以得出结论,需要修复PropertyParserUtils#getStringPairsToMap以支持同一注释的逗号分隔值?

您也许可以从 PropertyParserUtils.java 向后工作,以了解为什么在您的情况下不调用它,但我会说,我提供的 JUnits 和服务器日志非常确定根本原因,并且需要重构 PropertyParserUtils.java 以支持注释的逗号分隔值。

**错误消息:在客户端**

尝试启动任务时出现 HTTP 异常。根本原因:{"_embedded":{"errors":[{"message":"无效的注释值:key2","logref":"IllegalArgumentException","_links":{"self":{"href":" /"}}}]}}

java.lang.IllegalArgumentException:无效的注释值:org.springframework.util.Assert.isTrue(Assert.java:121) 的 key2 ~[spring-core-5.3.15.jar!/:5.3.15] 在 org.springframework .cloud.deployer.spi.kubernetes.support.PropertyParserUtils.getStringPairsToMap( PropertyParserUtils.java:46) ~[spring-cloud-deployer-kubernetes-2.7.2.jar!/:2.7.2] at org.springframework.cloud.deployer.spi.kubernetes.DeploymentPropertiesResolver.getJobAnnotations(DeploymentPropertiesResolver.java:701) ~[spring- cloud-deployer-kubernetes-2.7.2.jar!/:2.7.2] 在 org.springframework.cloud.deployer.spi.kubernetes.KubernetesTaskLauncher.launch(KubernetesTaskLauncher.java:283) ~[spring-cloud-deployer-kubernetes -2.7.2.jar!/:2.7.2] 在 org.springframework.cloud.deployer.spi.kubernetes.KubernetesTaskLauncher.launch(KubernetesTaskLauncher.java:120) ~[spring-cloud-deployer-kubernetes-2.7.2. jar!/:2.7.2] 在 org.springframework.cloud.dataflow.server.service.impl.DefaultTaskExecutionService.executeTask(DefaultTaskExecutionService.java:402) ~[ spring-cloud-dataflow-server-core-2.9.2.jar!/:2.9.2] 在 org.springframework.cloud.dataflow.server.service.impl.DefaultTaskExecutionService$$FastClassBySpringCGLIB$$422cda43.invoke() ~[spring-cloud-dataflow-server-core-2.9.2.jar !/:2.9.2] 在 org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.15.jar!/:5.3.15] 在 org.springframework.aop .framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.15.jar!/:5.3.15] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java: 163) ~[spring-aop-5.3.15.jar!/:5.3.15] 在 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.15 .jar!/:5.3.15] 在 org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.15.jar!/:5.3.15] 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.15.jar !/:5.3.15] 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.15.jar!/:5.3.15] 在 org.springframework.aop .framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.15.jar!/:5.3.15] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java: 753)~[spring-aop-5.3.15.jar!/:5.3.15] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)~[spring-aop-5.3.15 .jar!/:5.3.15] 在 org.springframework.cloud.dataflow.server.service.impl。DefaultTaskExecutionService$$EnhancerBySpringCGLIB$$72a9e518.executeTask() ~[spring-cloud-dataflow-server-core-2.9.2.jar!/:2.9.2] 在 org.springframework.cloud.dataflow.server.controller.TaskExecutionController。启动(TaskExecutionController.java:193)~[spring-cloud-dataflow-server-core-2.9.2.jar!/:2.9.2]

4

0 回答 0