项目代码使用了DWR组件来进行异步调用,采用的DWR版本为3.0,但最近WebLogic经常发生线程STUCK,经过分析WebLogic的日志,发现了如下信息:
<2015-10-29 上午09时25分44秒 GMT+08:00> <Error> <WebLogicServer> <BEA-000337> <[STUCK] ExecuteThread: '4' for queue: 'weblogic.kernel.Default (self-tuning)' has been busy for "652" seconds working on the request "Workmanager: default, Version: 0, Scheduled=true, Started=true, Started time: 652387 ms
", which is more than the configured time (StuckThreadMaxTime) of "600" seconds in "server-failure-trigger". Stack trace:
java.util.HashMap.put(HashMap.java:508)
java.util.HashSet.add(HashSet.java:217)
org.directwebremoting.impl.DefaultScriptSessionManager.associateScriptSessionAndPage(DefaultScriptSessionManager.java:242)
org.directwebremoting.impl.DefaultScriptSessionManager.getScriptSession(DefaultScriptSessionManager.java:125)
org.directwebremoting.impl.DefaultWebContext.checkPageInformation(DefaultWebContext.java:87)
org.directwebremoting.dwrp.BaseCallHandler.handle(BaseCallHandler.java:97)
org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:120)
org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:141)
从堆栈上分析师
org.directwebremoting.impl.DefaultScriptSessionManager
出了问题,查看了这个类里面的所有Map都是
new ConcurrentHashMap();
类型的。到底是什么原因呢?
我们再来分析一下这个方法的源码
protected void associateScriptSessionAndPage(DefaultScriptSession scriptSession, String page)
{
if (page == null)
{
return;
}
String normalizedPage = this.pageNormalizer.normalizePage(page);
Set pageSessions = (Set)this.pageSessionMap.get(normalizedPage);
if (pageSessions == null)
{
pageSessions = new HashSet();
Set prev = (Set)this.pageSessionMap.putIfAbsent(normalizedPage, pageSessions);
if (prev != null)
{
pageSessions = prev;
}
}
pageSessions.add(scriptSession);
scriptSession.setAttribute("org.directwebremoting.ScriptSession.Page", normalizedPage);
}
我们发现pageSessions没有进行同步操作,所以我们的修改方案是:
synchronized (pageSessions) {
pageSessions.add(scriptSession);
scriptSession.setAttribute("comtop.org.directwebremoting.ScriptSession.Page", normalizedPage);
}
问题解决,当然有其他类似的地方还需要修改。
现在来分析一下原因:java中常用的HashSet、ArrayList、HashMap都是线程不安全的,如果多条线程访问他们,而且多于一条的线程试图修改它们,则可能出错。我们遇到的情况就是属于多线程死锁。一般的解决方案有:
1.使用ConcrrentHashMap替代HashMap
2.对象的操作使用同步关键词synchronized
3.得到线程安全的集合
Collection c = Collections.synchronizedCollection(new ArrayList());
List l = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchronizedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap());
分享到:
相关推荐
### DWR源码分析与应用解析 #### DWR框架简介 DWR,全称为Direct Web Remoting,是一款轻量级的远程调用框架,旨在简化Web应用中的JavaScript与Java之间的通信。通过DWR,开发者可以直接从JavaScript调用服务器端...
dwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwr
在这个压缩包中,包含了一系列关于DWR技术分析、学习资料以及相关的界面开发内容,对于理解和掌握DWR技术至关重要。 首先,DWR的XML配置文件是连接客户端与服务器端的关键,它定义了哪些Java对象和方法可以被...
DWR (Direct Web Remoting) 是一个开源框架,它允许JavaScript在浏览器端直接调用Java方法,从而实现AJAX的应用。DWR的核心功能是通过自动转换Java对象为JavaScript对象,使得前端可以像操作本地对象一样操作远程...
DWR(Direct Web Remoting)是一种Java库,它允许JavaScript在客户端与服务器端进行直接的交互,从而实现在Web应用程序中的Ajax功能。DWR的主要目标是简化前后端的数据交换,提高用户体验,使得Web应用能够像桌面...
通过以上内容,我们可以看到DWR不仅是一个强大的框架,还提供了一系列实用的工具和资源来帮助开发者构建高性能的Web应用。无论是初学者还是经验丰富的开发者,都可以从中获得有价值的见解和实践经验。
DWR (Direct Web Remoting) 是一种开源Java技术,它允许Web应用程序在浏览器和服务器之间进行实时、双向通信,使得JavaScript可以直接调用服务器端的Java方法,极大地简化了客户端和服务器端的数据交换。本笔记将...
通过分析这个war文件,开发者可以学习如何配置DWR的XML配置文件(dwr.xml),以及如何创建可从JavaScript调用的Java方法。 3. **DWR2.0中文说明文档**: 这份文档对于理解DWR的工作原理和使用方法至关重要,特别是...
DWR (Direct Web Remoting) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的Java对象进行交互,实现动态的Web应用。DWR简化了AJAX(Asynchronous JavaScript and XML)的开发,使得开发者可以像调用...
这个压缩包包含了DWR的三个主要版本:DWR1.0、DWR2.0和DWR3.0的jar包,这些jar包是运行DWR应用的核心组件。 DWR1.0: DWR1.0是DWR项目的早期版本,主要目标是简化Web应用中的异步通信。在这个版本中,DWR提供了一个...
《DWR入门教程:服务器推送新手指南》 Direct Web Remoting (DWR) 是一种用于在Web应用程序中实现实时服务器推送技术的开源框架。它允许JavaScript与服务器端的Java对象进行交互,使得Web应用能够实时地更新客户端...
Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时、安全的双向通信,有效地打破了JavaScript和Java之间的壁垒。这个技术在2005年推出,主要解决了AJAX(异步JavaScript...
**DWR(Direct Web Remoting)**是一种Java技术,它允许Web应用程序在客户端与服务器之间进行实时通信,而无需刷新整个页面。通过DWR,我们可以使用JavaScript直接调用服务器端的Java方法,实现Ajax(Asynchronous ...
Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr...
### DWR 3.0 与 DWR 2.0 的区别 DWR(Direct Web Remoting)是一种用于简化 AJAX 应用程序开发的技术。它允许客户端 JavaScript 直接调用服务器端 Java 方法,从而降低了 AJAX 编程的复杂度。DWR 的最新版本为 3.0...
1、 导入dwr.jar包 2、 在web.xml中配置dwr,如下: <!-- 配置DWR --> <servlet-name>dwr-invoker org.directwebremoting.servlet.DwrServlet <init-param> <param-name>debug</param-name> ...
Direct Web Remoting (DWR) 是一种开源的Java库,它允许在Web应用程序中实现实时的双向通信,即JavaScript和服务器端Java代码之间可以直接交互。这个技术极大地简化了前端和后端之间的数据交换,提高了开发效率。在...
DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现实时的JavaScript到服务器端Java对象的通信。这个技术允许开发者在浏览器中直接调用服务器端的方法,极大地简化了AJAX(Asynchronous JavaScript ...
DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现JavaScript和服务器端Java代码之间的双向通信。这个教程包含了一系列的文档和资源,帮助开发者深入理解和使用DWR。 首先,"DWR学习笔记"提供了对...
**DWR配置文件详解** Direct Web Remoting (DWR) 是一种开源的Java库,它允许Web应用程序在客户端JavaScript和服务器端Java之间进行双向通信。DWR的核心配置文件是`dwr.xml`,该文件定义了DWR允许访问的Java对象、...