Java并发 - Web应用程序

3 java concurrency seam

我想我在我的网络应用程序中发现了更多错误.通常,我不担心并发问题,但是当您收到ConcurrentModificationException时,您开始重新考虑您的设计.

我在Jetty上使用JBoss Seam和Hibernate以及EHCache.现在,它是一个具有多个核心的单个应用程序服务器.

我简要地查看了我的代码,发现了一些尚未抛出异常的地方,但我相信他们可以.

第一个servlet过滤器我基本上检查是否有消息通知用户后台发生的事件(来自作业或其他用户).过滤器只是在模式弹出窗口中向页面添加消息.消息存储在会话上下文中,因此可能另一个请求可以从会话上下文中提取相同的消息.

现在,它工作正常,但我没有遇到许多并发请求的页面.我想我可能需要编写一些JMeter测试来确保不会发生这种情况.

第二个servlet过滤器记录所有传入的请求以及会话.这让我知道客户端来自哪里,他们正在运行什么浏览器等等.我最近看到的问题是图像库页面(大约在同一时间有很多请求),我最终得到了并发修改异常,因为我正在向会话添加请求.

会话包含一个请求列表,该列表似乎被多个线程命中.

@Entity
public class HttpSession 
{
  protected List<HttpRequest> httpRequests;

  @Fetch(FetchMode.SUBSELECT)
  @OneToMany(mappedBy = "httpSession")
  public List<HttpRequest> getHttpRequests()
  {return(httpRequests);}

  ...
}

@Entity
public class HttpRequest
{
  protected HttpSession httpSession;

  @ManyToOne(optional = false)
  @JoinColumn(nullable = false)
  public HttpSession getHttpSession()
  {return(httpSession);}

  ...
}
Run Code Online (Sandbox Code Playgroud)

在第二个servlet过滤器中,我正在做某种事情:

httpSession.getHttpRequests().add(httpRequest);
session.saveOrUpdate(httpSession);
Run Code Online (Sandbox Code Playgroud)

错误输出的部分是当我进行一些比较以查看从请求到请求的变化时:

for(HttpRequest httpRequest:httpSession.getHttpRequests())
Run Code Online (Sandbox Code Playgroud)

那条线出现了并发修改异常.

要走的路:1.JMeter测试在这里有用吗?2.您建议哪些书籍用于编写在并发加载下扩展的Web应用程序?3.我尝试在我认为需要它的地方放置同步,即在循环请求的方法上,但它仍然失败.我还需要做什么?

我添加了一些评论:

我曾考虑过将http请求记录为后台任务.我可以轻松生成后台任务来保存该信息.我想记住为什么我没有那么评价.我认为有一些信息我想当场访问.

如果我把它变成异步,这会大大加快吞吐量 - 我必须使用JMeter来衡量这些差异.

我仍然需要处理那里的并发问题.

谢谢,

沃尔特

har*_*are 5

在迭代任何集合时修改ConcurrentModificationException.你可以在一个线程中完成,例如:

for( Object o : someList ) {
  someList.add( new Object() );
}
Run Code Online (Sandbox Code Playgroud)

使用Collections.synchronizedList包装列表或返回列表的不可修改的副本.