如何将请求并行发送到异步服务并在Java EE应用程序中收集响应?

时间:2017-03-24 10:01:25

标签: java java-ee jboss ejb wildfly

我开发了一个应用程序,在某些时候开始聚合来自一堆服务的信息。其中一些服务是通过SOAP接口同步调用的,其中一些是异步工作的 - 我必须向JMS队列Q1发送请求,并在某些时候得到Q2的答案。

问题是应用程序在一个线程中发送请求,并且使用MDB(消息驱动Bean)处理响应。我头脑中的解决方案是将已聚合的响应存储在某些共享容器(如ConcurrentHashMap)中,并带有一些correlationId。因此,当MDB获得响应时,它会查看共享容器并将响应添加到相应的记录中。

该应用程序在域HA模式下在WildFly AS上运行。

  1. 使用这种方法会遇到一些问题吗?就像容器将为集群中的每个节点实例化一个。
  2. 或者我可以意外地处理这么多请求,我会存储这么多响应,我会得到OutOfMemoryError?
  3. 解决此类问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

让我回答你的问题:

  1. 对JMS服务呼叫的响应可以随时到达(很快:目标服务器关闭,运营商休息等)。因此,您应该在数据聚合期间将请求存储在数据库中。
  2. 当您并行处理多个请求时,可能会发生性能问题。如果您有异步答案,您可以长时间存储许多哈希值(或使用SFSB activate / passivate)直到最后一个答案到达。第一个答案(部分)也解决了这个问题,因为它将大部分数据存储在数据库中,并且仅占用内存中的当前数据。而且更强大。持久数据在服务器崩溃/关闭时仍然存在。
  3. 当您需要数据时,为所有人创建一个数据库条目,并在标题中发送带有PK的请求。当答案到达时,其标题包含用于标识的相同PK。 MDB是接收它们的最佳方式。但是只使用它们来接收消息。通过EJB处理其内容。将消息内容同步委派给EJB,并根据EJB答案确认它们。在EJB处理的最后,获取未处理的请求的ID属于当前聚合。如果没有人,(从db表中删除查询条目并且)调用适当的EJB(通过MDB?)来完成满足数据需求的工作。