`
zyslovely
  • 浏览: 231474 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DWR并发异常

 
阅读更多
52818 java.util.ConcurrentModificationException
52819     at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
52820     at java.util.HashMap$ValueIterator.next(HashMap.java:822)
52821     at org.directwebremoting.impl.DefaultScriptSessionManager.checkTimeouts(DefaultScriptSessionManager.java:179)
52822     at org.directwebremoting.impl.DefaultScriptSessionManager.maybeCheckTimeouts(DefaultScriptSessionManager.java:163)
52823     at org.directwebremoting.impl.DefaultScriptSessionManager.getScriptSession(DefaultScriptSessionManager.java:50)
52824     at org.directwebremoting.impl.DefaultWebContext.getScriptSession(DefaultWebContext.java:83)
52825     at org.directwebremoting.dwrp.BaseCallMarshaller.marshallOutbound(BaseCallMarshaller.java:305)
52826     at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:53)
52827     at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
52828     at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
52829     at com.netease.photo.webapp.web.servlets.PhotoDwrServlet.doPost(PhotoDwrServlet.java:51)
52830     at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
52831     at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
52832     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
52833     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
52834     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
52835     at com.netease.photo.security.filter.NEAccessInfoFilter.doFilter(NEAccessInfoFilter.java:55)
52836     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
52837     at com.netease.photo.security.filter.NEFilterSecurityInterceptor.doFilter(NEFilterSecurityInterceptor.java:49)
52838     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
52839     at com.netease.photo.security.filter.NEAnonymousProcessingFilter.doFilter(NEAnonymousProcessingFilter.java:234)
52840     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
52841     at com.netease.photo.security.filter.NEAuthenticationProcessingFilter.doFilter(NEAuthenticationProcessingFilter.java:300)
52842     at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
52843     at com.netease.photo.security.filter.NEExceptionTranslationFilter.doFilter(NEExceptionTranslationFilter.java:62)

问题代码,报出异常原因是sessionMap有变化,导致modCount和expectedModCount不相等,判断了checkForComodification()后,抛出异常
 protected void checkTimeouts()
    {
        long now = System.currentTimeMillis();
        List timeouts = new ArrayList();

        synchronized (sessionLock)
        {
            for (Iterator it = sessionMap.values().iterator(); it.hasNext();)
            {
                DefaultScriptSession session = (DefaultScriptSession) it.next();

                if (session.isInvalidated())
                {
                    continue;
                }

                long age = now - session.getLastAccessedTime();
                if (age > scriptSessionTimeout)
                {
                    timeouts.add(session);
                }
            }

            for (Iterator it = timeouts.iterator(); it.hasNext();)
            {
                DefaultScriptSession session = (DefaultScriptSession) it.next();
                session.invalidate();
            }
        }
    }

 具有改变sessionMap的源码
  public RealScriptSession getScriptSession(String id)
    {
        maybeCheckTimeouts();

        synchronized (sessionLock)
        {
            DefaultScriptSession scriptSession = (DefaultScriptSession) sessionMap.get(id);
            if (scriptSession == null)
            {
                scriptSession = new DefaultScriptSession(id, this);
              *  sessionMap.put(id, scriptSession);*
            }
            else
            {
                scriptSession.updateLastAccessedTime();
            }

            return scriptSession;
        }
    }

  protected void invalidate(RealScriptSession scriptSession)
    {
        // Can we think of a reason why we need to sync both together?
        // It feels like a deadlock risk to do so
        synchronized (sessionLock)
        {
            *RealScriptSession removed = (RealScriptSession) sessionMap.remove(scriptSession.getId());*
            if (!scriptSession.equals(removed))
            {
                log.debug("ScriptSession already removed from manager. scriptSession=" + scriptSession + " removed=" + removed);
            }

            int removeCount = 0;
            for (Iterator it = pageSessionMap.values().iterator(); it.hasNext();)
            {
                Set pageSessions = (Set) it.next();
                boolean isRemoved = pageSessions.remove(scriptSession);

                if (isRemoved)
                {
                    removeCount++;
                }
            }

            if (removeCount != 1)
            {
                log.debug("DefaultScriptSessionManager.invalidate(): removeCount=" + removeCount + " when invalidating: " + scriptSession);
            }
        }
    }

http://directwebremoting.org/jira/browse/DWR-536 
这个是我们遇到的问题.
The problem is when using an iterator of a synchonized map; when using an iterator, the map (even when it is synchronized) should be synchronized while iterating...
即使对hashmap外部做了synchronized,在iterator的时候hashmap还是不安全的。(这里不安全的原因还在调查,估计跟jvm有关)
有两种解决方案
1.对hashmap在iterator之前做一次拷贝
2.对hashmap做同步,可以使用concurrenthashmap

在dwr后面的几次版本更新中已经有了修改
/*     */   protected final ConcurrentMap sessionMap;
/*     */   protected final ConcurrentMap> pageSessionMap;

/* 527 */     this.sessionMap = new ConcurrentHashMap();
/*     */ 
/* 535 */     this.pageSessionMap = new ConcurrentHashMap();

http://pengtyao.iteye.com/blog/1074271
conCurrentHashMap再iterator的时候
http://stackoverflow.com/questions/3768554/is-iterating-concurrenthashmap-values-thread-safe
分享到:
评论

相关推荐

    DWR与SPRING 集成

    - 性能优化:合理设置DWR的缓存策略和并发处理能力,提高响应速度。 - 错误处理:为异常情况提供良好的错误处理机制,确保用户友好体验。 8. **学习资源**: 博文链接提供的 `...

    dwr服务器推技术

    9. **性能优化**: 为了处理大量并发连接,可能需要考虑使用长轮询、WebSocket或其他现代推送技术,以提高效率和减少服务器负载。 通过以上知识点的集成和应用,我们可以构建一个实时的多人聊天系统,使用户能够在...

    dwr实现的网页即时聊天

    DWR提供了错误处理机制,可以通过日志或回调函数来捕获和处理这些异常。 9. **性能测试与优化**: 对于实时聊天系统,性能测试是必不可少的,包括测试连接建立速度、消息推送延迟以及在高并发情况下的稳定性。根据...

    dwr推技术反转聊天事例

    DWR (Direct Web Remoting) 是一种开源的Java技术,它允许Web应用程序在客户端和服务器...不过,需要注意的是,尽管DWR提供了强大的功能,但在高并发场景下可能需要结合其他技术,如WebSocket,以提高性能和可扩展性。

    dwr框架只有lib

    7. **性能优化**:根据需求调整DWR的配置,如缓存策略、并发控制等,以提高性能。 在实际开发中,DWR通常与Spring、Hibernate等其他框架结合使用,以构建更复杂的企业级应用。理解并熟练掌握DWR的这些特性,对于...

    dwr中文帮助文档和一些学习文档

    8. **Java多线程编程基础之线程和多线程.doc**:讲解了Java平台上的并发编程,包括线程创建、同步、死锁等问题,对于开发多用户、高并发应用必不可少。 9. **Java类的初始化过程.doc**:深入探讨了Java类的加载、...

    comet4j 服务端向浏览器实时推送消息(支持指定用户推送)

    6. **异常处理**:处理网络中断、浏览器关闭或其他异常情况,确保在出现问题时能够优雅地关闭连接并恢复。 7. **客户端集成**:在浏览器端编写JavaScript代码来处理接收到的推送消息,可能需要利用WebSocket API...

    【servlet+jsp实现第三方支付,新手必备】

    5. **异常处理**:设计良好的错误处理机制,如网络异常、支付失败等情况,确保系统的健壮性。 至于DWR(Direct Web Remoting),它是一种JavaScript和Java之间的远程调用技术,可以用来在前端和后端之间进行实时...

    最新JAVA华为面试题

    华为作为全球知名的科技公司,对Java程序员的面试通常会涵盖广泛的技术领域,包括基础语法、并发处理、面向对象设计、容器与框架、设计模式以及Web开发等多个方面。下面我们将详细探讨这些面试题所涉及的知识点。 1...

    java部分面试题.pdf

    - 从DWR获取request对象:DWR(Direct Web Remoting)允许JavaScript调用服务器端方法。 - Struts2错误处理:异常处理器(ExceptionHandler)处理异常并展示错误页面。 - Hibernate优点:简单易用,支持ORM,缓存机制...

    Struts_In_Action(中文完整版)

    6. **异常处理**:Struts的异常处理机制可以帮助开发者优雅地管理程序中的错误和异常,书中会讨论如何配置和使用ActionError和ActionMessage。 7. ** strutstiles 插件**:Struts Tiles是一个强大的布局和页面组装...

    java程序员需要掌握些什么知识握些什么知

    熟悉异常处理、线程并发、集合框架(如ArrayList、LinkedList、HashMap等)、IO流和网络编程。 2. **JEE(Java Enterprise Edition)知识**:学习Servlet、JSP、JNDI、JMS、JTA等,了解如何在企业环境中构建分布式...

    java面试题(合集)

    比如,服务器生成一个唯一的令牌,将其存储在session中,并发送给客户端。客户端在提交请求时携带该令牌,服务器检查令牌的有效性,确保请求的唯一性。 2. **Oracle分页语句**:Oracle中常用ROWNUM配合子查询进行...

    java软件开发简历模板.docx

    - **健壮安全性**:Java具有严格的类型检查和异常处理机制,保障程序稳定性和安全性。 - **结构中立**:Java字节码可以在任何支持JVM的平台上运行,实现跨平台。 - **可移植性**:通过“一次编写,到处运行”原则...

    JavaEE系统架构师学习路线之高级篇

    这一部分涵盖了Java语言的基础特性、面向对象编程、异常处理、集合框架等基础知识,为后续的学习打下坚实的基础。 2. **Java多线程与并发库高级应用** - 多线程和并发是现代软件开发中不可或缺的一部分。这部分...

    java知识点汇总学习路线与笔记

    - **事务与并发、悲观锁、乐观锁**:事务管理和并发控制机制。 - **openSessionInView**:一种实现读取操作时的懒加载技术。 - **CurrentSession**:获取当前线程中的Session实例。 #### 十四、Spring - **Spring**...

    J2EE武功秘籍

    - **Unchecked Exceptions**:运行时异常,无需捕获或声明,如 `NullPointerException`。 - **Error**:系统级错误,通常无法通过程序逻辑解决,如 `OutOfMemoryError`。 **3. sleep() 和 wait() 区别** - **sleep...

Global site tag (gtag.js) - Google Analytics