是否可以使用springcloud数据流javarest客户端获得所有流的列表



我使用的是spring-cloud数据流javarest客户端(https://docs.spring.io/spring-cloud-dataflow/docs/current/api/)并且希望使用它来检索所有当前部署的流。

获取一个StreamOperations对象并从中获取流列表很容易:

val template = DataFlowTemplate(<someUri>)
val streamOperations = template.streamOperations()
val streamDefinitionResources = streamOperations.list()

上面的streamDefinitionResources实际上是PagedModel<StreamDefinitionResource>,它保存使用页面大小2000的结果的第一页。

然而,我看不出有任何方法可以使用javarest客户端迭代所有页面以获得所有流(即,StreamOperationsStreamDefinitionResource类不支持分页(。

是否可以仅使用javarest客户端获取所有流?我是不是错过了什么?

摘要

PagedModel<StreamDefinitionResource>有一个getNextLink((方法,您可以使用它手动遍历";下一个";第页,共页结果。

详细信息

底层Dataflow REST API支持通过页码和大小请求参数进行分页,并返回HAL响应,其中包括指向下一页和前一页的_链接

例如,给定10个流定义这个HTTP请求:

GET localhost:9393/streams/definitions?page=0&size=2

返回以下响应:

{
_embedded: {
streamDefinitionResourceList: [
{
name: "ticktock1",
dslText: "time | log",
originalDslText: "time | log",
status: "undeployed",
description: "",
statusDescription: "The app or group is known to the system, but is not currently deployed",
_links: {
self: {
href: "http://localhost:9393/streams/definitions/ticktock1"
}
}
},
{
name: "ticktock2",
dslText: "time | log",
originalDslText: "time | log",
status: "undeployed",
description: "",
statusDescription: "The app or group is known to the system, but is not currently deployed",
_links: {
self: {
href: "http://localhost:9393/streams/definitions/ticktock2"
}
}
}
]
},
_links: {
first: {
href: "http://localhost:9393/streams/definitions?page=0&size=2"
},
self: {
href: "http://localhost:9393/streams/definitions?page=0&size=2"
},
next: {
href: "http://localhost:9393/streams/definitions?page=1&size=2"
},
last: {
href: "http://localhost:9393/streams/definitions?page=4&size=2"
}
},
page: {
size: 2,
totalElements: 10,
totalPages: 5,
number: 0
}
}

Dataflow Java REST客户端在提供getNextLink()方法的PagedModel<StreamDefinitionResource>响应中公开此HAL响应。

注意事项1(但是,当前的实现(正如您所指出的(被硬编码为2000的页面大小。这意味着,在拥有超过2000的流定义之前,您不会看到这种行为。

Caveat 2(需要注意的另一点是;下一个";页面不会自动处理,您需要手动调用链接URL来检索下一个页面。

假设StreamOperations.list接受了一个页面大小参数,代码可能看起来像这样:

int pageSize = 2;
PagedModel<StreamDefinitionResource> pageOfStreamDefs = streamOperations().list(pageSize);
pageOfStreamDefs.getNextLink()
.ifPresent((link) ->  someFunctionToInvokeAndProcessNextPage(link.getHref());

关于REST API参数的更多详细信息可以在这里找到。

我想我有点晚了,但我遇到了同样的问题,并找到了解决方法。正如onobc所说,任何资源的PagedModel都有一个getNextLink()方法,该方法返回具有下一页地址的Link。您可以使用DataflowTemplate中相同的RestTemplate来处理以下请求:

PagedModel<StreamDefinitionResource> streamDefPage = dataflowTemplate.streamOperations().list();
// Process page here
if (streamDefPage.getNextLink().isPresent()) {
Link link = streamDefPage.getNextLink().get();
PagedModel<StreamDefinitionResource> streamDefNextPage = dataflowTemplate.getRestTemplate().getForObject(link.getHref(), StreamDefinitionResource.Page.class);
// Process next page here
}

等等。

希望这能有所帮助!

最新更新