我有一个网络应用程序(java,tomcat),允许用户通过水晶报告生成报告。问题是如果用户请求一个需要数小时才能完成的大型报告,我的整个应用程序都会停止运行。有没有办法停止这样的请求,比如5分钟后还没有完成?除了优化速度和限制报告大小之外,还有其他解决方法吗?
答案 0 :(得分:2)
我认为您没有在另一个线程中运行报告生成。最好在另一个Thread中运行报告生成,并在准备就绪时将链接发送回用户。
您可以使用java的ExecutorService并为该线程设置一些超时,如果它花费的时间超过您为其分配的时间,它将过期。
搜索Java ExecutorService,Future,Callable教程
示例代码:
Callable<Integer> callable = new CallableImpl(2);
ExecutorService executor = new ScheduledThreadPoolExecutor(5);
Future<Integer> future = executor.submit(callable);
Integer result = future.get(600,TimeUnit.seconds));
答案 1 :(得分:1)
另一种方法是在单独的线程中运行报告生成(或者使用ExecutorService
),并在生成时间超过某个阈值时调用Thread.interrupt()
。如果线程当前在I / O(网络,数据库)上阻塞,则线程将被中断。