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関数を使用してコンテンツを生成している間(これにはかなりの時間がかかります)、ユーザー インターフェイスが応答しないことです。ボタンなどをクリックしても何も起こりません。ファイルの生成が完了して初めて、インターフェイスを再び使用できます。
ファイルが徐々に生成されている間、ユーザー インターフェイスをブロックしないようにするにはどうすればよいですか?