我在WebSphere收到以下异常,而试图以使用碧玉的Excel报表。
ThreadMonitor W WSVR0605W: Thread "WebContainer : 0" (00000029) has been active for 647279 milliseconds and may be hung. There is/are 1 thread(s) in total in the server that may be hung.
试图增加20默认线程池的大小为50,也增加了Web容器池的大小从50到150没有奏效。
这方面的任何解决方案。
你的错误信息告诉名为线程“Web容器:0”一直在做的东西647秒10.7分钟,1个线程活跃,我也挂在JVM(已经活跃了超过阈值时间更长)。
挂起线程是在被阻止通过一个电话或一个监视器上等待被释放锁定的对象,从而使线程可以使用它的Java EE应用程序的线程。 挂起线程可能会导致从一个简单的软件缺陷(如无限循环)或更复杂的原因(例如,一个资源死锁)。 如果线程的数量增长CPU利用率为服务器的Java进程可能会变得很高,反应迟钝。
有一些方法可以增加暂停时间(默认10分钟),但不推荐。 你已经优化或限制你的Excel报表生成过程。 我认为,报告要解压缩是非常大的或击中分贝以上的一代,基本上可能是由于代码错误。 增加线程池的数量无关您的问题做。
在sysout.log:下面行张贴的警告信息,应该给有关Java EE类造成这个问题的一些想法。 FFDC也有助于这个数字出来。
挂起检测选项默认是打开的。 你可以配置它来适应环境,使潜在挂起可以报告。 当检测到挂起线程,被通知您,让您可以解决该问题。
使用挂起检测策略,您可以指定一个时间太长,工作单位来完成。 线程监视器检查所有托管线程包括Web容器线程。
- 从管理控制台,单击服务器>应用程序服务器>服务器名称
- 在服务器基础结构中,单击管理>定制属性和单击新建。
- 添加以下属性:
名称:com.ibm.websphere.threadmonitor.interval
值:频率(单位为秒),在该管理在所选择的应用服务器线程将被询问。
默认:180秒(三分钟)。
名称:com.ibm.websphere.threadmonitor.dump.java
值:设置为TRUE时检测到挂起线程并打印WSVR0605W消息来执行dumpThreads功能。 在javacore转储来的螺纹部分进行分析,以确定哪些线程报道
默认值:false(0)。
名称:com.ibm.websphere.threadmonitor.threshold
值:的时间长度(秒),在该前被认为是它挂起线程可以是活动的。 作为挂被检测为活性比该长度更长的时间任何线程被报告。
默认值:默认值是600秒(10分钟)。
名称:com.ibm.websphere.threadmonitor.false.alarm.threshold
值:的时间(T),该假警报可以之前自动增大阈值发生的次数。 这可能是该报告为线程挂起最终完成其工作,结果虚惊一场。 大量的这些事件表明,门限值太小。 挂起检测设备可以自动响应这种情况:对于每个T误报,阈值T增加了1.5倍。 将该值设置为零(或更少)以禁用自动调整。 (链接到检测挂在J2EE应用程序线程的误报警信息)
默认值:100
要禁用挂起检测选项,com.ibm.websphere.threadmonitor.interval属性设置为小于或等于零。
- 保存并重新启动WAS实例
这是不是一个例外。 正如你可以看到它有W
水平,这是警告( ThreadMonitor W WSVR0605W
)。 它只是告诉你,你的报告生成是非常长的。 超过647279毫秒以上。 当你将进一步往下看日志,你很可能会发现类似的消息告诉你的线程完成这项工作,而不再处以绞刑。
增加Web容器池无关这一点。 你必须看看类创建报告,看看,如果你可以把它更快。
另一个解决方案是使用或者异步豆类或JMS(你不幸是在第7版,所以没有EJB 3.1或异步的servlet是可用的),只是处理报表创作为异步任务,将其存储到数据库或文件系统,并在以后使用单独的请求检索当报告完成。
在我的团队,我们发现了WebSphere 8.5.5.13从来没有关闭挂起线程,因此我们的团队来与该处理器处理大量的并发线程的事务处理系统的解决方案,所以不是永远挂着我们发现使用Java 8那个时代的解决方案从参数设置之后。 下面的代码演示了如何编写与执行超时关键任意代码功能的演示。
public class MyFactory
{
TimeUnit timeUnit=TimeUnit.MILLISECONDS;
int REQUEST_TIMEOUT=50;
int MAX_THREADS=1;
ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
public Function<Supplier<?>, ?> executeWithTimeout = typeSupplier-> {
final ExecutorService singleCallableExec =
Executors.newSingleThreadExecutor();
try
{
return executor.submit(()-> {
try { return singleCallableExec.submit(()->{
return typeSupplier.get();
}).get(REQUEST_TIMEOUT, timeUnit);
}
catch (Exception t2) { singleCallableExec.shutdownNow(); throw t2; }
finally {
Optional.of(singleCallableExec)
.filter(e -> !e.isShutdown())
.ifPresent(ExecutorService::shutdown);
}
}).get();
}
catch (InterruptedException | ExecutionException e)
{
throw new RuntimeException(e);
}
};
所以这可以被放入一个工厂类,并通过要求执行有可能永远超时关键代码每一个线程调用该方法,这将是有益的发送超时异常,其提出了一个警示,而不是等待系统外出资源
public static void main (String args[])
{
MyFactory mf=new MyFactory();
try
{
long result = (long) mf.executeWithTimeout.apply(()->mf.longCalculation());
System.out.println("Result:" + result);
}
catch (Exception te)
{
if (te instanceof RuntimeException &&
te.getCause() != null && te.getCause() instanceof ExecutionException
&& te.getCause().getCause() != null && te.getCause().getCause()
instanceof TimeoutException)
{
System.out.println(new Date() + " Raising alarm, TimeoutException");
}
}
finally
{
mf.executor.shutdownNow();
}
}
public long longCalculation()
{
long result=LongStream.range(0, (long) Math.pow(2,32)).max().getAsLong();
System.out.println(new Date() + " Calculation result " + result);
return result;
}
}
文章来源: Thread “WebContainer : 0” (00000029) has been active for 647279 milliseconds and may be hung