Spring Cloud Data Flow参考指南(八)

时间:2022-12-06 11:24:59

Spring Cloud Data Flow参考指南(八)

44.13. 作业实例

作业实例端点提供有关向 Spring 云数据流服务器注册的作业实例的信息。 以下主题提供了更多详细信息:

  • 列出所有作业实例
  • 作业实例详细信息

44.13.1. 列出所有作业实例

作业实例终端节点允许您列出所有作业实例。 以下主题提供了更多详细信息:

  • 请求结构
  • 请求参数
  • 示例请求
  • 响应结构
请求结构
GET /jobs/instances?name=DOCJOB&page=0&size=10 HTTP/1.1
Host: localhost:9393
请求参数

参数

描述

​page​

从零开始的页码(可选)

​size​

请求的页面大小(可选)

​name​

与作业实例关联的名称

示例请求
$ curl 'http://localhost:9393/jobs/instances?name=DOCJOB&page=0&size=10' -i -X GET
响应结构
HTTP/1.1 200 OK
Content-Type: application/hal+json
Content-Length: 1845

{
"_embedded" : {
"jobInstanceResourceList" : [ {
"jobName" : "DOCJOB",
"jobInstanceId" : 1,
"jobExecutions" : [ {
"executionId" : 1,
"stepExecutionCount" : 0,
"jobId" : 1,
"taskExecutionId" : 1,
"name" : "DOCJOB",
"startDate" : "2022-09-13",
"startTime" : "10:55:41",
"duration" : "00:00:00",
"jobExecution" : {
"id" : 1,
"version" : 1,
"jobParameters" : {
"parameters" : { }
},
"jobInstance" : {
"id" : 1,
"jobName" : "DOCJOB",
"version" : 0
},
"stepExecutions" : [ ],
"status" : "STARTED",
"startTime" : "2022-09-13T10:55:41.811+0000",
"createTime" : "2022-09-13T10:55:41.800+0000",
"endTime" : null,
"lastUpdated" : "2022-09-13T10:55:41.811+0000",
"exitStatus" : {
"exitCode" : "UNKNOWN",
"exitDescription" : ""
},
"executionContext" : {
"dirty" : false,
"empty" : true,
"values" : [ ]
},
"failureExceptions" : [ ],
"jobConfigurationName" : null,
"allFailureExceptions" : [ ]
},
"jobParameters" : { },
"jobParametersString" : "",
"restartable" : false,
"abandonable" : false,
"stoppable" : true,
"defined" : false,
"timeZone" : "UTC"
} ],
"_links" : {
"self" : {
"href" : "http://localhost:9393/jobs/instances/1"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:9393/jobs/instances?page=0&size=10"
}
},
"page" : {
"size" : 10,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
}
}

44.13.2. 作业实例详细信息

作业实例终端节点允许您列出所有作业实例。 以下主题提供了更多详细信息:

  • 请求结构
  • 请求参数
  • 示例请求
  • 响应结构
请求结构
GET /jobs/instances/1 HTTP/1.1
Host: localhost:9393

/jobs/instances/{id}

参数

描述

​id​

现有作业实例的 ID(必需)

请求参数

此终结点没有请求参数。

示例请求
$ curl 'http://localhost:9393/jobs/instances/1' -i -X GET
响应结构
HTTP/1.1 200 OK
Content-Type: application/hal+json
Content-Length: 1354

{
"jobName" : "DOCJOB",
"jobInstanceId" : 1,
"jobExecutions" : [ {
"executionId" : 1,
"stepExecutionCount" : 0,
"jobId" : 1,
"taskExecutionId" : 1,
"name" : "DOCJOB",
"startDate" : "2022-09-13",
"startTime" : "10:55:41",
"duration" : "00:00:00",
"jobExecution" : {
"id" : 1,
"version" : 1,
"jobParameters" : {
"parameters" : { }
},
"jobInstance" : {
"id" : 1,
"jobName" : "DOCJOB",
"version" : 0
},
"stepExecutions" : [ ],
"status" : "STARTED",
"startTime" : "2022-09-13T10:55:41.811+0000",
"createTime" : "2022-09-13T10:55:41.800+0000",
"endTime" : null,
"lastUpdated" : "2022-09-13T10:55:41.811+0000",
"exitStatus" : {
"exitCode" : "UNKNOWN",
"exitDescription" : ""
},
"executionContext" : {
"dirty" : false,
"empty" : true,
"values" : [ ]
},
"failureExceptions" : [ ],
"jobConfigurationName" : null,
"allFailureExceptions" : [ ]
},
"jobParameters" : { },
"jobParametersString" : "",
"restartable" : false,
"abandonable" : false,
"stoppable" : true,
"defined" : false,
"timeZone" : "UTC"
} ],
"_links" : {
"self" : {
"href" : "http://localhost:9393/jobs/instances/1"
}
}
}

44.14. 作业步骤执行

作业步骤执行端点提供有关向 Spring 云数据流服务器注册的作业步骤执行的信息。 以下主题提供了更多详细信息:

  • 列出作业执行的所有步骤执行
  • 作业步骤执行详细信息
  • 作业步骤执行进度

44.14.1. 列出作业执行的所有步骤执行

作业步骤执行终结点允许您列出所有作业步骤执行。 以下主题提供了更多详细信息:

  • 请求结构
  • 请求参数
  • 示例请求
  • 响应结构
请求结构
GET /jobs/executions/1/steps?page=0&size=10 HTTP/1.1
Host: localhost:9393
请求参数

参数

描述

​page​

从零开始的页码(可选)

​size​

请求的页面大小(可选)

示例请求
$ curl 'http://localhost:9393/jobs/executions/1/steps?page=0&size=10' -i -X GET
响应结构
HTTP/1.1 200 OK
Content-Type: application/hal+json
Content-Length: 1623

{
"_embedded" : {
"stepExecutionResourceList" : [ {
"jobExecutionId" : 1,
"stepExecution" : {
"stepName" : "DOCJOB_STEP",
"id" : 1,
"version" : 0,
"status" : "STARTING",
"readCount" : 0,
"writeCount" : 0,
"commitCount" : 0,
"rollbackCount" : 0,
"readSkipCount" : 0,
"processSkipCount" : 0,
"writeSkipCount" : 0,
"startTime" : "2022-09-13T10:55:57.892+0000",
"endTime" : null,
"lastUpdated" : "2022-09-13T10:55:57.893+0000",
"executionContext" : {
"dirty" : false,
"empty" : true,
"values" : [ ]
},
"exitStatus" : {
"exitCode" : "EXECUTING",
"exitDescription" : ""
},
"terminateOnly" : false,
"filterCount" : 0,
"failureExceptions" : [ ],
"jobExecutionId" : 1,
"jobParameters" : {
"parameters" : { }
},
"skipCount" : 0,
"summary" : "StepExecution: id=1, version=0, name=DOCJOB_STEP, status=STARTING, exitStatus=EXECUTING, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=0"
},
"stepType" : "",
"_links" : {
"self" : {
"href" : "http://localhost:9393/jobs/executions/1/steps/1"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:9393/jobs/executions/1/steps?page=0&size=10"
}
},
"page" : {
"size" : 10,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
}
}

44.14.2. 作业步骤执行细节

作业步骤执行终结点允许你获取有关作业步骤执行的详细信息。 以下主题提供了更多详细信息:

  • 请求结构
  • 请求参数
  • 示例请求
  • 响应结构
请求结构
GET /jobs/executions/1/steps/1 HTTP/1.1
Host: localhost:9393

/jobs/executions/{id}/steps/{stepid}

参数

描述

​id​

现有作业执行的 ID(必需)

​stepid​

特定作业执行的现有步骤执行的 id(必需)

请求参数

此终结点没有请求参数。

示例请求
$ curl 'http://localhost:9393/jobs/executions/1/steps/1' -i -X GET
响应结构
HTTP/1.1 200 OK
Content-Type: application/hal+json
Content-Length: 1173

{
"jobExecutionId" : 1,
"stepExecution" : {
"stepName" : "DOCJOB_STEP",
"id" : 1,
"version" : 0,
"status" : "STARTING",
"readCount" : 0,
"writeCount" : 0,
"commitCount" : 0,
"rollbackCount" : 0,
"readSkipCount" : 0,
"processSkipCount" : 0,
"writeSkipCount" : 0,
"startTime" : "2022-09-13T10:55:57.892+0000",
"endTime" : null,
"lastUpdated" : "2022-09-13T10:55:57.893+0000",
"executionContext" : {
"dirty" : false,
"empty" : true,
"values" : [ ]
},
"exitStatus" : {
"exitCode" : "EXECUTING",
"exitDescription" : ""
},
"terminateOnly" : false,
"filterCount" : 0,
"failureExceptions" : [ ],
"jobExecutionId" : 1,
"jobParameters" : {
"parameters" : { }
},
"skipCount" : 0,
"summary" : "StepExecution: id=1, version=0, name=DOCJOB_STEP, status=STARTING, exitStatus=EXECUTING, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=0"
},
"stepType" : "",
"_links" : {
"self" : {
"href" : "http://localhost:9393/jobs/executions/1/steps/1"
}
}
}

44.14.3. 作业步骤执行进度

作业步骤执行终结点允许你获取有关作业步骤执行进度的详细信息。 以下主题提供了更多详细信息:

  • 请求结构
  • 请求参数
  • 示例请求
  • 响应结构
请求结构
GET /jobs/executions/1/steps/1/progress HTTP/1.1
Host: localhost:9393

/jobs/executions/{id}/steps/{stepid}/progress

参数

描述

​id​

现有作业执行的 ID(必需)

​stepid​

特定作业执行的现有步骤执行的 id(必需)

请求参数

此终结点没有请求参数。

示例请求
$ curl 'http://localhost:9393/jobs/executions/1/steps/1/progress' -i -X GET
响应结构
HTTP/1.1 200 OK
Content-Type: application/hal+json
Content-Length: 2676

{
"stepExecution" : {
"stepName" : "DOCJOB_STEP",
"id" : 1,
"version" : 0,
"status" : "STARTING",
"readCount" : 0,
"writeCount" : 0,
"commitCount" : 0,
"rollbackCount" : 0,
"readSkipCount" : 0,
"processSkipCount" : 0,
"writeSkipCount" : 0,
"startTime" : "2022-09-13T10:55:57.892+0000",
"endTime" : null,
"lastUpdated" : "2022-09-13T10:55:57.893+0000",
"executionContext" : {
"dirty" : false,
"empty" : true,
"values" : [ ]
},
"exitStatus" : {
"exitCode" : "EXECUTING",
"exitDescription" : ""
},
"terminateOnly" : false,
"filterCount" : 0,
"failureExceptions" : [ ],
"jobExecutionId" : 1,
"jobParameters" : {
"parameters" : { }
},
"skipCount" : 0,
"summary" : "StepExecution: id=1, version=0, name=DOCJOB_STEP, status=STARTING, exitStatus=EXECUTING, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=0"
},
"stepExecutionHistory" : {
"stepName" : "DOCJOB_STEP",
"count" : 0,
"commitCount" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"rollbackCount" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"readCount" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"writeCount" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"filterCount" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"readSkipCount" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"writeSkipCount" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"processSkipCount" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"duration" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
},
"durationPerRead" : {
"count" : 0,
"min" : 0.0,
"max" : 0.0,
"mean" : 0.0,
"standardDeviation" : 0.0
}
},
"percentageComplete" : 0.5,
"finished" : false,
"duration" : 670.0,
"_links" : {
"self" : {
"href" : "http://localhost:9393/jobs/executions/1/steps/1"
}
}
}

44.15. 有关应用程序的运行时信息

你可以获取有关运行系统已知的应用的信息,无论是全局还是单独。 以下主题提供了更多详细信息:

  • 在运行时列出所有应用程序
  • 查询单个应用的所有实例
  • 查询单个应用的单个实例

44.15.1. 在运行时列出所有应用程序

若要检索有关所有应用的所有实例的信息,请使用查询终结点。 以下主题提供了更多详细信息:​​/runtime/apps​​​​GET​

  • 请求结构
  • 示例请求
  • 响应结构
请求结构
GET /runtime/apps HTTP/1.1
Accept: application/json
Host: localhost:9393
示例请求
$ curl 'http://localhost:9393/runtime/apps' -i -X GET \
-H 'Accept: application/json'
响应结构
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 209

{
"_links" : {
"self" : {
"href" : "http://localhost:9393/runtime/apps?page=0&size=20"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 0,
"number" : 0
}
}
44.15.2. 查询单个应用程序的所有实例

若要检索有关特定应用的所有实例的信息,请使用查询终结点。 以下主题提供了更多详细信息:​​/runtime/apps/<appId>/instances​​​​GET​

  • 请求结构
  • 示例请求
  • 响应结构
请求结构
GET /runtime/apps HTTP/1.1
Accept: application/json
Host: localhost:9393
示例请求
$ curl 'http://localhost:9393/runtime/apps' -i -X GET \
-H 'Accept: application/json'
响应结构
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 209

{
"_links" : {
"self" : {
"href" : "http://localhost:9393/runtime/apps?page=0&size=20"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 0,
"number" : 0
}
}
44.15.3. 查询单个应用程序的单个实例

若要检索有关特定应用程序的特定实例的信息,请使用查询终结点。 以下主题提供了更多详细信息:​​/runtime/apps/<appId>/instances/<instanceId>​​​​GET​

  • 请求结构
  • 示例请求
  • 响应结构
请求结构
GET /runtime/apps HTTP/1.1
Accept: application/json
Host: localhost:9393
示例请求
$ curl 'http://localhost:9393/runtime/apps' -i -X GET \
-H 'Accept: application/json'
响应结构
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 209

{
"_links" : {
"self" : {
"href" : "http://localhost:9393/runtime/apps?page=0&size=20"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 0,
"number" : 0
}
}

44.16. 流日志

您可以获取整个流或流内特定应用程序的流的应用程序日志。 以下主题提供了更多详细信息:

  • 按流名称获取应用程序的日志
  • 从流中获取特定应用程序的日志
44.16.1. 通过流名称获取应用程序的日志

将 HTTP 方法与 REST 终结点一起使用,以检索给定流名称的所有应用程序日志。 以下主题提供了更多详细信息:GET/streams/logs/<streamName>

  • 请求结构
  • 示例请求
  • 响应结构
请求结构
GET /streams/logs/ticktock HTTP/1.1
Host: localhost:9393
示例请求
$ curl 'http://localhost:9393/streams/logs/ticktock' -i -X GET
响应结构
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 93

{
"logs" : {
"ticktock-time-v1" : "Logs-time",
"ticktock-log-v1" : "Logs-log"
}
}
44.16.2. 从流中获取特定应用程序的日志

若要从流中检索特定应用程序的日志,请使用 HTTP 方法查询终结点。 以下主题提供了更多详细信息:​​/streams/logs/<streamName>/<appName>​​​​GET​

  • 请求结构
  • 示例请求
  • 响应结构
请求结构
GET /streams/logs/ticktock/ticktock-log-v1 HTTP/1.1
Host: localhost:9393
示例请求
$ curl 'http://localhost:9393/streams/logs/ticktock/ticktock-log-v1' -i -X GET
响应结构
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 55

{
"logs" : {
"ticktock-log-v1" : "Logs-log"
}
}

44.17. 任务日志

您可以获取特定任务执行的任务执行日志。

以下主题提供了更多详细信息:

  • 获取任务执行日志
44.17.1. 获取任务执行日志

若要检索任务执行的日志,请使用 HTTP 方法查询终结点。 以下主题提供了更多详细信息:/tasks/logs/<ExternalTaskExecutionId>GET

  • 请求结构
  • 请求参数
  • 示例请求
  • 响应结构
请求结构
GET /tasks/logs/taskA-e71df192-b243-45e0-a5ed-d55ecd0c15e8?platformName=default HTTP/1.1
Host: localhost:9393
请求参数

参数

描述

​platformName​

The name of the platform the task is launched.

Example Request
$ curl 'http://localhost:9393/tasks/logs/taskA-e71df192-b243-45e0-a5ed-d55ecd0c15e8?platformName=default' -i -X GET
响应结构
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 10043

"stdout:\n2022-09-13 10:55:06.650 INFO 3441 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4e515669: startup date [Tue Sep 13 10:55:06 UTC 2022]; root of context hierarchy\n2022-09-13 10:55:07.075 INFO 3441 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'configurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$b056ca48] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n\n . ____ _ __ _ _\n /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\\n( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\\n \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )\n ' |____| .__|_| |_|_| |_\\__, | / / / /\n =========|_|==============|___/=/_/_/_/\n :: Spring Boot :: (v1.5.2.RELEASE)\n\n2022-09-13 10:55:07.337 INFO 3441 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888\n2022-09-13 10:55:07.408 WARN 3441 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for \"http://localhost:8888/timestamp-task/default\": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)\n2022-09-13 10:55:07.419 INFO 3441 --- [ main] o.s.c.t.a.t.TimestampTaskApplication : No active profile set, falling back to default profiles: default\n2022-09-13 10:55:07.441 INFO 3441 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@445b84c0: startup date [Tue Sep 13 10:55:07 UTC 2022]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@4e515669\n2022-09-13 10:55:08.074 INFO 3441 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=1e36064f-ccbe-3d2f-9196-128427cc78a0\n2022-09-13 10:55:08.149 INFO 3441 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$b056ca48] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n2022-09-13 10:55:08.156 INFO 3441 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$943cc74b] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n2022-09-13 10:55:08.777 INFO 3441 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executing SQL script from class path resource [org/springframework/cloud/task/schema-h2.sql]\n2022-09-13 10:55:08.817 INFO 3441 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executed SQL script from class path resource [org/springframework/cloud/task/schema-h2.sql] in 40 ms.\n2022-09-13 10:55:09.312 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup\n2022-09-13 10:55:09.322 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'configurationPropertiesRebinder' has been autodetected for JMX exposure\n2022-09-13 10:55:09.323 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'environmentManager' has been autodetected for JMX exposure\n2022-09-13 10:55:09.326 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'refreshScope' has been autodetected for JMX exposure\n2022-09-13 10:55:09.328 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'environmentManager': registering with JMX server as MBean [taskA-e71df192-b243-45e0-a5ed-d55ecd0c15e8:name=environmentManager,type=EnvironmentManager]\n2022-09-13 10:55:09.343 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'refreshScope': registering with JMX server as MBean [taskA-e71df192-b243-45e0-a5ed-d55ecd0c15e8:name=refreshScope,type=RefreshScope]\n2022-09-13 10:55:09.354 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'configurationPropertiesRebinder': registering with JMX server as MBean [taskA-e71df192-b243-45e0-a5ed-d55ecd0c15e8:name=configurationPropertiesRebinder,context=445b84c0,type=ConfigurationPropertiesRebinder]\n2022-09-13 10:55:09.445 INFO 3441 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0\n2022-09-13 10:55:09.467 WARN 3441 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'taskLifecycleListener'; nested exception is java.lang.IllegalArgumentException: Invalid TaskExecution, ID 1 not found\n2022-09-13 10:55:09.467 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown\n2022-09-13 10:55:09.468 INFO 3441 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans\n2022-09-13 10:55:09.469 ERROR 3441 --- [ main] o.s.c.t.listener.TaskLifecycleListener : An event to end a task has been received for a task that has not yet started.\n2022-09-13 10:55:09.477 INFO 3441 --- [ main] utoConfigurationReportLoggingInitializer : \n\nError starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.\n2022-09-13 10:55:09.486 ERROR 3441 --- [ main] o.s.boot.SpringApplication : Application startup failed\n\norg.springframework.context.ApplicationContextException: Failed to start bean 'taskLifecycleListener'; nested exception is java.lang.IllegalArgumentException: Invalid TaskExecution, ID 1 not found\n\tat org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\tat org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\tat org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:348) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\tat org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:151) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\tat org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:114) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\tat org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:879) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\tat org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\tat org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.2.RELEASE.jar!/:1.5.2.RELEASE]\n\tat org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.2.RELEASE.jar!/:1.5.2.RELEASE]\n\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.2.RELEASE.jar!/:1.5.2.RELEASE]\n\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.2.RELEASE.jar!/:1.5.2.RELEASE]\n\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.2.RELEASE.jar!/:1.5.2.RELEASE]\n\tat org.springframework.cloud.task.app.timestamp.TimestampTaskApplication.main(TimestampTaskApplication.java:29) [classes!/:1.2.0.RELEASE]\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_345]\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_345]\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_345]\n\tat java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_345]\n\tat org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [timestamp-task-1.2.0.RELEASE.jar:1.2.0.RELEASE]\n\tat org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [timestamp-task-1.2.0.RELEASE.jar:1.2.0.RELEASE]\n\tat org.springframework.boot.loader.Launcher.launch(Launcher.java:50) [timestamp-task-1.2.0.RELEASE.jar:1.2.0.RELEASE]\n\tat org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) [timestamp-task-1.2.0.RELEASE.jar:1.2.0.RELEASE]\nCaused by: java.lang.IllegalArgumentException: Invalid TaskExecution, ID 1 not found\n\tat org.springframework.util.Assert.notNull(Assert.java:134) ~[spring-core-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\tat org.springframework.cloud.task.listener.TaskLifecycleListener.doTaskStart(TaskLifecycleListener.java:200) ~[spring-cloud-task-core-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]\n\tat org.springframework.cloud.task.listener.TaskLifecycleListener.start(TaskLifecycleListener.java:282) ~[spring-cloud-task-core-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]\n\tat org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:175) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]\n\t... 20 common frames omitted\n\n"

附录

遇到春季云数据流问题,我们愿意提供帮助!

  • 问一个问题。我们监控*.com的问题 标记为弹簧云数据流。
  • 在github.com/spring-cloud/spring-cloud-dataflow/issues 时报告Spring Cloud Data Flow的错误。

附录 A:数据流模板

如 API 指南章节中所述,Spring Cloud Data Flow 的功能完全通过 REST 端点公开。 虽然您可以直接使用这些端点,但Spring Cloud Data Flow还提供了基于Java的API,这使得使用这些REST端点变得更加容易。

中心入口点是包中的类。​​DataFlowTemplate​​​​org.springframework.cloud.dataflow.rest.client​

此类实现接口并委派给以下子模板,这些子模板为每个功能集提供特定功能:​​DataFlowOperations​

接口

描述

​StreamOperations​

用于流操作的 REST 客户端

​CounterOperations​

用于计数器操作的 REST 客户端

​FieldValueCounterOperations​

用于字段值计数器操作的 REST 客户端

​AggregateCounterOperations​

用于聚合计数器操作的 REST 客户端

​TaskOperations​

用于任务操作的 REST 客户端

​JobOperations​

用于作业操作的 REST 客户端

​AppRegistryOperations​

用于应用注册表操作的 REST 客户端

​CompletionOperations​

用于完成操作的 REST 客户端

​RuntimeOperations​

用于运行时操作的 REST 客户端

初始化时,可以通过 REST 关系发现子模板,该关系由 HATEOAS(超媒体作为应用程序状态的引擎)提供。​​DataFlowTemplate​

如果无法解析资源,则生成相应的子模板 在空中。一个常见的原因是 Spring 云数据流允许特定的 启动时要启用或禁用的功能集。有关更多信息,请参阅本地、Cloud Foundry​ 或Kubernetes配置章节之一,具体取决于您部署应用程序的位置。

A.1. 使用数据流模板

使用数据流模板时,唯一需要的数据流依赖项是 Spring Cloud Data Flow Rest Client,如以下 Maven 代码片段所示:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dataflow-rest-client</artifactId>
<version>2.9.6</version>
</dependency>

有了这个依赖关系,你就可以获得类以及调用Spring Cloud Data Flow服务器所需的所有依赖关系。​​DataFlowTemplate​

实例化时,您还会传入 a。 请注意,需要一些额外的配置才能在上下文中有效。 将 aas 声明为 Bean 时,以下配置就足够了:​​DataFlowTemplate​​​​RestTemplate​​​​RestTemplate​​​​DataFlowTemplate​​​​RestTemplate​

@Bean
public static RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new VndErrorResponseErrorHandler(restTemplate.getMessageConverters()));
for(HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
if (converter instanceof MappingJackson2HttpMessageConverter) {
final MappingJackson2HttpMessageConverter jacksonConverter =
(MappingJackson2HttpMessageConverter) converter;
jacksonConverter.getObjectMapper()
.registerModule(new Jackson2HalModule())
.addMixIn(JobExecution.class, JobExecutionJacksonMixIn.class)
.addMixIn(JobParameters.class, JobParametersJacksonMixIn.class)
.addMixIn(JobParameter.class, JobParameterJacksonMixIn.class)
.addMixIn(JobInstance.class, JobInstanceJacksonMixIn.class)
.addMixIn(ExitStatus.class, ExitStatusJacksonMixIn.class)
.addMixIn(StepExecution.class, StepExecutionJacksonMixIn.class)
.addMixIn(ExecutionContext.class, ExecutionContextJacksonMixIn.class)
.addMixIn(StepExecutionHistory.class, StepExecutionHistoryJacksonMixIn.class);
}
}
return restTemplate;
}

您还可以通过以下方式获得预配置​​RestTemplate​​​​DataFlowTemplate.getDefaultDataflowRestTemplate();​

现在您可以使用以下代码实例化:​​DataFlowTemplate​

DataFlowTemplate dataFlowTemplate = new DataFlowTemplate(
new URI("http://localhost:9393/"), restTemplate);

指向 Spring Cloud 数据流服务器的根目录。​​URI​

根据您的要求,您现在可以调用服务器。例如 如果要获取当前可用应用程序的列表,可以运行以下代码:

PagedResources<AppRegistrationResource> apps = dataFlowTemplate.appRegistryOperations().list();

System.out.println(String.format("Retrieved %s application(s)",
apps.getContent().size()));

for (AppRegistrationResource app : apps.getContent()) {
System.out.println(String.format("App Name: %s, App Type: %s, App URI: %s",
app.getName(),
app.getType(),
app.getUri()));
}

A.2. 数据流模板和安全性

使用时,还可以提供所有与安全相关的 选项,就像使用数据流外壳一样。事实上,数据流外壳使用它的所有操作。​​DataFlowTemplate​​​​DataFlowTemplate​

为了让您入门,我们提供了一个使用构建器 用于设置各种安全相关选项的模式:​​HttpClientConfigurer​

HttpClientConfigurer
.create(targetUri)
.basicAuthCredentials(username, password)
.skipTlsCertificateVerification()
.withProxyCredentials(proxyUri, proxyUsername, proxyPassword)
.addInterceptor(interceptor)
.buildClientHttpRequestFactory()

使用提供的目标 URI 创建 HttpClientConfigurer。

设置基本身份验证的凭据(使用 OAuth2 密码授予)

跳过SSL证书验证(仅用于开发!)

配置任何代理设置

添加自定义拦截器,例如设置 OAuth2 授权标头。这允许

以传递 OAuth2 访问令牌而不是用户名/密码凭据。

构建可以设置的。​​ClientHttpRequestFactory​​​​RestTemplate​

配置完成后,您可以使用itsto构建然后设置相应的 属性上。然后,您可以使用它实例化实际值。​​HttpClientConfigurer​​​​buildClientHttpRequestFactory​​​​ClientHttpRequestFactory​​​​RestTemplate​​​​DataFlowTemplate​​​​RestTemplate​

若要配置基本身份验证,需要进行以下设置:

RestTemplate restTemplate = DataFlowTemplate.getDefaultDataflowRestTemplate();
HttpClientConfigurer httpClientConfigurer = HttpClientConfigurer.create("http://localhost:9393");

httpClientConfigurer.basicAuthCredentials("my_username", "my_password");
restTemplate.setRequestFactory(httpClientConfigurer.buildClientHttpRequestFactory());

DataFlowTemplate dataFlowTemplate = new DataFlowTemplate("http://localhost:9393", restTemplate);

You can find a sample application as part of the spring-cloud-dataflow-samples repository on GitHub.

附录 B:“操作方法”指南

本节提供了一些常见“我该怎么做...“人们使用春云数据流时经常出现的问题。

如果您有我们此处未涵盖的特定问题,您可能需要查看*.com以查看是否有人已经提供了答案。 这也是提出新问题的(使用标签)。spring-cloud-dataflow

我们也非常乐意扩展此部分。如果您想添加“操作方法”,您可以向我们发送拉取请求。

B.1. 配置 Maven 属性

启动数据流服务器时,可以通过命令行属性设置 Maven 属性,例如本地 Maven 存储库位置、远程 Maven 存储库、身份验证凭据和代理服务器属性。 或者,可以通过设置数据流服务器的环境属性来设置属性。​​SPRING_APPLICATION_JSON​

如果使用 Maven 存储库解析应用程序,则需要显式配置远程 Maven 存储库,但数据流服务器除外。 其他数据流服务器实现(使用 Maven 资源进行应用程序项目解析)对于远程存储库没有默认值。 服务器作为默认的远程存储库。​​local​​​​local​​​​repo.spring.io/libs-snapshot​

若要将属性作为命令行选项传递,请使用类似于以下内容的命令运行服务器:

$ java -jar <dataflow-server>.jar --maven.localRepository=mylocal
--maven.remote-repositories.repo1.url=https://repo1
--maven.remote-repositories.repo1.auth.username=repo1user
--maven.remote-repositories.repo1.auth.password=repo1pass
--maven.remote-repositories.repo2.url=https://repo2 --maven.proxy.host=proxyhost
--maven.proxy.port=9018 --maven.proxy.auth.username=proxyuser
--maven.proxy.auth.password=proxypass

您还可以使用环境属性:​​SPRING_APPLICATION_JSON​

export SPRING_APPLICATION_JSON='{ "maven": { "local-repository": "local","remote-repositories": { "repo1": { "url": "https://repo1", "auth": { "username": "repo1user", "password": "repo1pass" } },
"repo2": { "url": "https://repo2" } }, "proxy": { "host": "proxyhost", "port": 9018, "auth": { "username": "proxyuser", "password": "proxypass" } } } }'

以下是格式良好的 JSON 中的相同内容:

SPRING_APPLICATION_JSON='{
"maven": {
"local-repository": "local",
"remote-repositories": {
"repo1": {
"url": "https://repo1",
"auth": {
"username": "repo1user",
"password": "repo1pass"
}
},
"repo2": {
"url": "https://repo2"
}
},
"proxy": {
"host": "proxyhost",
"port": 9018,
"auth": {
"username": "proxyuser",
"password": "proxypass"
}
}
}
}'

根据 Spring Cloud 数据流服务器的实现,您可能必须使用特定于平台的环境设置功能传递环境属性。例如,在Cloud Foundry中,您可以将它们传递为。​​cf set-env SPRING_APPLICATION_JSON​

B.2. 故障排除

本节介绍如何对所选平台上的 Spring 云数据流进行故障排除。请参阅网站的“疑难解答”部分,了解流和批处理。

B.3. Frequently Asked Questions

在本节中,我们将回顾有关 Spring 云数据流的常见问题。 有关详细信息,请参阅微型网站的“常见问题”部分。

附录C:建筑

本附录介绍如何构建 Spring Cloud 数据流。

要构建源代码,您需要安装 JDK 1.8。

该版本使用 Maven 包装器,因此您不必安装特定版本的 Maven。

主构建命令如下:

$ ./mvnw clean install

为了加快构建速度,您可以添加以避免运行测试。​​-DskipTests​

您也可以自己安装 Maven (>=3.3.3),并在下面的示例中代替命令运行命令。 如果这样做,则可能还需要添加本地 Maven 设置不包含 Spring 预发布工件的存储库声明。​​mvn​​​​./mvnw​​​​-P spring​

您可能需要通过设置具有类似值的环境变量来增加 Maven 可用的内存量。 我们尝试在配置中涵盖这一点,因此,如果您发现必须这样做才能使构建成功,请提出票证以将设置添加到源代码管理中。​​MAVEN_OPTS​​​​-Xmx512m -XX:MaxPermSize=128m​​​​.mvn​

C.1. 文档

有一个配置文件可以生成文档。只能使用以下命令生成文档:​​full​

$ ./mvnw clean package -DskipTests -P full -pl {project-artifactId} -am

C.2. 使用代码

如果您没有喜欢的IDE,我们建议您在处理代码时使用Spring Tools Suite或Eclipse。 我们使用m2eclipse Eclipse插件来获得 Maven 支持。 其他 IDE 和工具通常也可以正常工作。

C.2.1. 使用 m2eclipse 导入到 Eclipse 中

在使用 Eclipse 时,我们建议使用m2eclipe eclipse插件。 如果您尚未安装 m2eclipse,则可以从 Eclipse 市场中获取。

不幸的是,m2e 尚不支持 Maven 3.3。 因此,一旦项目导入到 Eclipse 中,您还需要告诉 m2eclipse 将该文件用于项目。 如果不这样做,您可能会看到与项目中的 POM 相关的许多不同错误。 为此:​​.settings.xml​

  1. 打开您的 Eclipse 首选项。
  2. 展开Maven 首选项
  3. 选择用户设置
  4. 在“用户设置”字段中,单击“浏览”并导航到导入的 Spring Cloud 项目。
  5. 选择该项目中的文件。.settings.xml
  6. 单击应用
  7. 单击“确定”。

或者,您可以将 Spring Cloud 的 .settings.xml​文件中的存储库设置复制到您自己的文件中。​​~/.m2/settings.xml​

C.2.2. 导入到 Eclipse 而不使用 m2eclipse

如果您不想使用 m2eclipse,可以使用以下命令生成 Eclipse 项目元数据:

$ ./mvnw eclipse:eclipse

您可以通过从“文件”菜单中选择“导入现有项目”来导入生成的 Eclipse 项目。

附录 D:贡献

Spring Cloud在非限制性Apache 2.0许可证下发布,遵循非常标准的Github开发流程,使用Github跟踪器解决问题并将拉取请求合并到主分支中。 如果您想贡献一些微不足道的事情,请不要犹豫,但请遵循本附录中的准则。

D.1. 签署贡献者许可协议

在我们接受一个重要的补丁或拉取请求(不仅仅是纠正印刷错误)之前,我们需要你签署贡献者的协议。 签署贡献者协议并不授予任何人对主仓库的提交权限,但这确实意味着我们可以接受您的贡献,如果我们这样做,您将获得作者信用。 活动参与者可能会被要求加入核心团队,并被授予合并拉取请求的能力。

D.2. 守则惯例和内务管理

以下准则对于拉取请求都不是必需的,但它们都可以帮助您的开发人员同事理解和使用您的代码。 它们也可以在原始拉取请求之后但在合并之前添加。

  • 使用 Spring 框架代码格式约定。如果使用 Eclipse,则可以使用Spring Cloud Build项目中的文件导入格式化程序设置。 如果使用 IntelliJ,则可以使用Eclipse Code Formatter 插件导入相同的文件。eclipse-code-formatter.xml
  • 确保所有 newfile 都有一个简单的 Javadoc 类注释,其中至少有一个标记来标识你,最好至少有一个描述类用途的段落。.java@author
  • 将 ASF 许可证标头注释添加到所有新文件(为此,请从项目中的现有文件复制它)。.java
  • 将自己添加为您大幅修改的.java文件(不仅仅是外观更改)。@author
  • 添加一些 Javadoc,如果更改命名空间,则添加一些 XSD 文档元素。
  • 一些单元测试也会有很大帮助。必须有人去做,你的开发人员同事很欣赏这种努力。
  • 如果没有其他人使用您的分支,请根据当前主分支(或主项目中的其他目标分支)将其变基。
  • 编写提交消息时,请遵循以下约定。 如果修复了现有问题,请在提交消息的末尾添加(其中 XXXX 是问题编号)。Fixes gh-XXXX

    == 身份提供程序

本附录包含如何设置特定提供程序以工作的信息 具有数据流安全性。

在撰写本文时,Azure 是唯一的标识提供者。

D.3. 蔚蓝

Azure AD(Active Directory)是一个成熟的标识提供者,提供广泛的功能 围绕身份验证和授权。与任何其他提供商一样,它具有其 自己的细微差别,这意味着必须小心设置它。

在本节中,我们将介绍如何为 AD 和 春云数据流。

您需要完全的组织访问权限才能正确设置所有内容。

D.3.1. 创建新的 AD 环境

要开始使用,请创建一个新的活动目录环境。选择一个 键入 Azure Active Directory(不是 b2c 类型),然后选择您的组织名称并 初始域。下图显示了设置:

Spring Cloud Data Flow参考指南(八)

D.3.2. 创建新的应用注册

应用注册是创建 OAuth 客户端以供 OAuth 使用的地方 应用。至少需要创建两个客户端,一个用于 数据流和船长服务器,一个用于数据流外壳,因为这两个具有 配置略有不同。服务器应用程序可以被认为是 受信任的应用程序,而 shell 不受信任(因为用户可以看到其完整 配置)。

注意: 我们建议对数据流服务器和船长服务器使用相同的 OAuth 客户端。而 您可以使用不同的客户端,它目前不会提供任何价值,因为 配置需要相同。

下图显示了用于创建新应用注册的设置:

Spring Cloud Data Flow参考指南(八)

D.3.3. 公开数据流 API

若要准备 OAuth 作用域,请为每个数据流安全角色创建一个。在此示例中,这些将是

  • ​api://dataflow-server/dataflow.create​
  • ​api://dataflow-server/dataflow.deploy​
  • ​api://dataflow-server/dataflow.destroy​
  • ​api://dataflow-server/dataflow.manage​
  • ​api://dataflow-server/dataflow.schedule​
  • ​api://dataflow-server/dataflow.modify​
  • ​api://dataflow-server/dataflow.view​

下图显示了要公开的 API:

Spring Cloud Data Flow参考指南(八)

需要将以前创建的范围添加为 API 权限,如下图所示:

Spring Cloud Data Flow参考指南(八)

D.3.4. 创建特权客户端

对于即将使用密码授予的 OAuth 客户端,需要相同的 API 权限 为用于服务器的 OAuth 客户端创建(如上一节所述)。


所有这些权限都需要授予管理员权限。

下图显示了特权设置:

Spring Cloud Data Flow参考指南(八)


特权客户端需要客户端密码,该机密需要向客户端公开 在外壳中使用时的配置。如果不想公开该机密,请使用创建公共客户机​​公共客户机​​。

D.3.5. 创建公共客户端

公共客户端基本上是没有客户端密码且其类型设置为公共的客户端。

下图显示了公共客户端的配置:

Spring Cloud Data Flow参考指南(八)

D.3.6. 配置示例

本节包含数据流和船长服务器以及 shell 的配置示例。

启动数据流服务器:

$ java -jar spring-cloud-dataflow-server.jar \
--spring.config.additional-location=dataflow-azure.yml

dataflow-azure.yml

spring:
cloud:
dataflow:
security:
authorization:
provider-role-mappings:
dataflow-server:
map-oauth-scopes: true
role-mappings:
ROLE_VIEW: dataflow.view
ROLE_CREATE: dataflow.create
ROLE_MANAGE: dataflow.manage
ROLE_DEPLOY: dataflow.deploy
ROLE_DESTROY: dataflow.destroy
ROLE_MODIFY: dataflow.modify
ROLE_SCHEDULE: dataflow.schedule
security:
oauth2:
client:
registration:
dataflow-server:
provider: azure
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
client-id: <client id>
client-secret: <client secret>
scope:
- openid
- profile
- email
- offline_access
- api://dataflow-server/dataflow.view
- api://dataflow-server/dataflow.deploy
- api://dataflow-server/dataflow.destroy
- api://dataflow-server/dataflow.manage
- api://dataflow-server/dataflow.modify
- api://dataflow-server/dataflow.schedule
- api://dataflow-server/dataflow.create
provider:
azure:
issuer-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/v2.0
user-name-attribute: name
resourceserver:
jwt:
jwk-set-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/discovery/v2.0/keys

要启动船长服务器:

$ java -jar spring-cloud-skipper-server.jar \
--spring.config.additional-location=skipper-azure.yml

skipper-azure.yml

spring:
cloud:
skipper:
security:
authorization:
provider-role-mappings:
skipper-server:
map-oauth-scopes: true
role-mappings:
ROLE_VIEW: dataflow.view
ROLE_CREATE: dataflow.create
ROLE_MANAGE: dataflow.manage
ROLE_DEPLOY: dataflow.deploy
ROLE_DESTROY: dataflow.destroy
ROLE_MODIFY: dataflow.modify
ROLE_SCHEDULE: dataflow.schedule
security:
oauth2:
client:
registration:
skipper-server:
provider: azure
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
client-id: <client id>
client-secret: <client secret>
scope:
- openid
- profile
- email
- offline_access
- api://dataflow-server/dataflow.view
- api://dataflow-server/dataflow.deploy
- api://dataflow-server/dataflow.destroy
- api://dataflow-server/dataflow.manage
- api://dataflow-server/dataflow.modify
- api://dataflow-server/dataflow.schedule
- api://dataflow-server/dataflow.create
provider:
azure:
issuer-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/v2.0
user-name-attribute: name
resourceserver:
jwt:
jwk-set-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/discovery/v2.0/keys

要启动 shell 并(可选)将凭据作为选项传递,请执行以下操作:

$ java -jar spring-cloud-dataflow-shell.jar \
--spring.config.additional-location=dataflow-azure-shell.yml \
--dataflow.username=<USERNAME> \
--dataflow.password=<PASSWORD>

dataflow-azure-shell.yml

security:
oauth2:
client:
registration:
dataflow-shell:
provider: azure
client-id: <client id>
client-secret: <client secret>
authorization-grant-type: password
scope:
- offline_access
- api://dataflow-server/dataflow.create
- api://dataflow-server/dataflow.deploy
- api://dataflow-server/dataflow.destroy
- api://dataflow-server/dataflow.manage
- api://dataflow-server/dataflow.modify
- api://dataflow-server/dataflow.schedule
- api://dataflow-server/dataflow.view
provider:
azure:
issuer-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/v2.0

启动公共外壳并(可选)将凭据作为选项传递:

$ java -jar spring-cloud-dataflow-shell.jar \
--spring.config.additional-location=dataflow-azure-shell-public.yml \
--dataflow.username=<USERNAME> \
--dataflow.password=<PASSWORD>

dataflow-azure-shell-public.yml

spring:
security:
oauth2:
client:
registration:
dataflow-shell:
provider: azure
client-id: <client id>
authorization-grant-type: password
client-authentication-method: post
scope:
- offline_access
- api://dataflow-server/dataflow.create
- api://dataflow-server/dataflow.deploy
- api://dataflow-server/dataflow.destroy
- api://dataflow-server/dataflow.manage
- api://dataflow-server/dataflow.modify
- api://dataflow-server/dataflow.schedule
- api://dataflow-server/dataflow.view
provider:
azure:
issuer-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/v2.0