我使用的是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客户端迭代所有页面以获得所有流(即,StreamOperations
或StreamDefinitionResource
类不支持分页(。
是否可以仅使用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
}
等等。
希望这能有所帮助!