gpt4 book ai didi

java - AbstractResource.ResourceResponse 在写入 OutputStream 时会阻止用户界面

转载 作者:行者123 更新时间:2023-12-02 06:14:18 25 4
gpt4 key购买 nike

我想通过实现 AbstractResource 使用 Wicket 下载 CSV 文件。它看起来像这样:

public class ExportCsvFileResource extends AbstractResource 
{
@Override
protected AbstractResource.ResourceResponse newResourceResponse(IResource.Attributes attributes)
{
AbstractResource.ResourceResponse resourceResponse = new AbstractResource.ResourceResponse();
resourceResponse.setContentType("text/csv");
resourceResponse.setFileName("exported-contacts-file.csv");
resourceResponse.setTextEncoding("utf-8");
resourceResponse.setWriteCallback(new AbstractResource.WriteCallback()
{
@Override
public void writeData(IResource.Attributes attributes) throws IOException
{
OutputStream stream = attributes.getResponse().getOutputStream();
generateContentInBatches(stream);
}
});
return resourceResponse;
}
private void generateContentInBatches(OutputStream stream)
{
int numberOfChunks=//...
for (int i=0; i<numberOfChunks; i++)
{
byte[] contentChunk = retrieveContentFromBackend(i);
IOUtils.write(contentChunk, stream);
}
}
}

问题在于,当使用 retrieveContentFromBackend 函数生成内容时(这非常耗时),用户界面没有响应。我点击按钮等,但没有任何反应,只有文件生成完成后才能再次使用该界面。

逐渐生成文件时如何避免阻塞用户界面?

最佳答案

查看 wicket-examples 中的 RequestMapperApplication 和 MapperDemoResourceReference。

您可以挂载资源引用:

mountResource("/print/${sheet}/${format}", new MapperDemoResourceReference());

要在不阻塞页面的情况下加载此类资源,您必须呈现一个直接触发资源的链接:

add(new WebMarkupContainer("link")
{
@Override
protected void onComponentTag(ComponentTag tag)
{
super.onComponentTag(tag);

PageParameters parameters = new PageParameters();
parameters.add("sheet", "sheet1");
parameters.add("format", "A4");
tag.put("href", urlFor(new MapperDemoResourceReference(), parameters));
}
});

关于java - AbstractResource.ResourceResponse 在写入 OutputStream 时会阻止用户界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21627498/

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