所有
我在JSF 2.0应用程序中接收Websphere 8.5.5.5中的间歇性挂起线程:
Thread Name
WebContainer : 8
State
Waiting on condition
Monitor
Owns Monitor Lock on com/ibm/ws/jsp/webcontainerext/ws/WASJSPExtensionServletWrapper@0x0000000109FF9FE0
Java Stack
at java/lang/Thread.sleep(Native Method)
at java/lang/Thread.sleep(Thread.java:904(Compiled Code))
at com/ibm/ws/webcontainer/servlet/ServletWrapper.doDestroy(ServletWrapper.java:1019(Compiled Code))
at com/ibm/ws/webcontainer/servlet/ServletWrapperImpl.doDestroy(ServletWrapperImpl.java:337(Compiled Code))
at com/ibm/ws/webcontainer/servlet/ServletWrapper.prepareForReload(ServletWrapper.java:1112(Compiled Code))
at com/ibm/wsspi/webcontainer/servlet/GenericServletWrapper.prepareForReload(GenericServletWrapper.java:132(Compiled Code))
at com/ibm/ws/jsp/webcontainerext/AbstractJSPExtensionServletWrapper._checkForTranslation(AbstractJSPExtensionServletWrapper.java:529(Compiled Code))
at com/ibm/ws/jsp/webcontainerext/AbstractJSPExtensionServletWrapper.checkForTranslation(AbstractJSPExtensionServletWrapper.java:294(Compiled Code))
at com/ibm/ws/jsp/webcontainerext/AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:163(Compiled Code))
此WebContainer #8
线程因其1个监视器锁争用而阻塞了大约72个其他WebContainer线程。这是锁定共享对象WASJSPExtensionServletWrapper
。
我假设由于上面的错误位置,这是在JSP标记转换期间发生的,可能是在慢速运行的自定义标记或Rich Faces 4.3.2标记(AJAX调用a4j)期间导致Servlet缓慢重新加载由于上下文切换而挂起?
在自定义标记中,由于对VariableResolver的弃用调用,我偶尔会遇到TreeMap错误,后来我将其更改为ELResolver。在Rich Faces AJAX调用中,我看到了这个不同步的代码:
Map<String,String> data = new HashMap<String,String>();
data.put("customerSum", collectedBalance);
后面是这个代码,它执行get:
JSONObject dataToJSON = new JSONObject()
dataToJSON.put("customerSum", data.get("customerSum"));
然而,我正在度过一段可怕的时光:
(1)通过确凿的证据证明吸烟枪是TreeMap.put
或HashMap.put
还是得到?
(2)重现问题?
什么可能导致Servlet在JSP标记_checkForTranslation之后立即重新加载?由于遇到错误或NullPointerException或无限循环,这可能是重新加载吗?我在SystemOut.log中没有看到任何清楚的内容。
由于我更改为ElResolver并使用该HashMap删除了AJAX调用,因此我没有看到此问题。但是,我需要能够证明根本原因吗? (我也不介意能够放回AJAX调用吗?)我也不确定这是否可能仅仅是由于大量请求(由于AJAX调用数量?)而不是由于运行缓慢自定义标签?但流量不大。
非常感谢任何帮助或建议。 。 。谢谢。
PS我知道Rich Faces已经过时了,但是在未来的项目中取代它需要时间。 。
UPDATE 8/3/2016:今天我们注意到生产服务器中的JSP页面.class文件不断被重新编译和重新加载。这不是必要的,不应该是这种情况。调查是否可能在销毁/重新加载JSP页面servlet时设置导致间歇性挂起线程的条件。
答案 0 :(得分:0)
至于在每个请求上重新编译的JSP,您应该查看APAR PI12939以查看是否适用于您的环境。
http://www-01.ibm.com/support/docview.wss?uid=swg1PI12939
如果JSP最初使用一个用户进行编译而服务器在另一个用户中运行,则JSP容器可能很难更新.class文件的时间戳...因此导致它认为JSP不在每个请求上的日期,并尝试重新翻译和重新编译。可以设置一个JSP属性来缓解这种情况:
要启用此行为,必须使用以下JSP属性 设置为&#34; true&#34;: deleteClassFilesBeforeRecompile
在应用程序的ibm-web-ext.xml文件中设置该JSP属性。请注意,如果要更新已安装的应用程序,请更新嵌套在配置文件的config目录中的ibm-web-ext.xml文件的版本,而不是已安装的应用程序目录。
另一个选项是将reloadEnabled JSP属性设置为false。这将阻止JSP容器不断检查是否需要重新编译JSP。然而,这只是掩盖了真正的问题。