gpt4 book ai didi

java - Wicket调用冗长的操作并通过ajax更新

转载 作者:搜寻专家 更新时间:2023-11-01 03:08:11 24 4
gpt4 key购买 nike

基于此SO question ,我了解到 Wicket 对后续的 AJAX 请求进行排队。现在我的页面充满了多个 AJAX 请求,我想再添加一个会产生冗长操作的请求。

public void populateItem(final Item item) {
final MyObject object = (MyObject) item.getModelObject();
// ... a couple of fields
Label statusLabel = new Label("status", new AbstractReadOnlyModel() {
@Override
public Object getObject() {
return someService.doSomeLengthyOperation();
}
});
statusLabel.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(5)));
item.add(statusLabel)
}

一旦此 Ajax 请求触发,可能需要一分钟才能完成执行。这里的问题是 someService.doSomeLengthyOperation() 将被执行 n 倍于我拥有的行数,这意味着我将排队 n 倍-分钟。现在,正如我所提到的,Wicket 对后续的 AJAX 请求进行排队。

我需要 number-of-rows * minutes-it-take-to-finish-the-operation 来加载页面或做其他需要 AJAX 的事情,比如

new AjaxButton("ajax-button"){
@Override
protected void onSubmit(AjaxRequestTarget target, Form form) {
//.. this won't be executed until all the statusLabels have finished invoking getObject()
}
}

我想避免创建公开我的服务的 Web 服务和必须编写我自己的 AJAX 调用。我有哪些选择? (使用 Wicket 1.5/Pax-Wicket)

最佳答案

最简单的方法是让初始 Ajax 请求快速返回(没有任何结果)并添加 AjaxSelfUpdatingTimerBehavior到目标组件。如果有结果,此行为将检查一个时间间隔(例如每 10 秒左右)。如果有结果,它应该更新组件并删除自身。

这样您就可以在一个单独的任务中执行操作,而不会阻塞您的 Ajax 调用。

详细一点,我创建了一个可运行的 quickstart发出 5 个 Ajax 调用,如您所描述的那样,每个调用运行 10 秒到 1 分钟之间的随机时间。同时,还有一个带有计数器的响应式AjaxLink。

主要思想是将实际的 Ajax 调用与对慢速方法的调用分开。

add(new ListView<DataHolder>("list", list) {

@Override
protected void populateItem(ListItem<DataHolder> item) {
DataHolder dh = item.getModelObject();
item.add(new Label("itemNumber", new PropertyModel<Integer>(dh, "number")));
Label result = new Label("itemResult", new PropertyModel<String>(dh, "result"));
result.setOutputMarkupId(true);
result.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(2)));
item.add(result);
Thread thread = new Thread(new Processor(item.getModelObject()));
thread.start();
}
});

如您所见,标签模型不再直接调用 doSomeLengthyOperation()。相反,会生成一个新线程来完成繁重的工作。 Processor 类仅实现 Runnable 接口(interface)并使用运行方法来完成工作(在您的情况下,在演示中它只是等待一段时间)。

PropertyModel 的 getter 封装了这个特技并使其透明,同时始终快速返回以防止阻塞。

public String getResult() {
String retValue;
if (!processed) {
retValue = String.format("Still busy after %d requests", counter++);
} else {
retValue = result;
}
return retValue;
}

已处理的成员只是一个标志,处理器使用它来指示它何时完成等待(ehr 工作)。

由于您可能会同时发出超过 5 个线程,我建议使用某种线程池,但这超出了这个小演示的范围。


免责声明:这不是生产代码。它只是为了演示。它不会对您的资源有好处,也不会优雅地处理任何缺乏。当用户点击重新加载或发生其他任何事情时,它将不起作用。

关于java - Wicket调用冗长的操作并通过ajax更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15337198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com