繁体   English   中英

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

[英]How to send requests parallel to asynchronous services and collect the responses in a Java EE application?

我开发了一个应用程序,该应用程序有时会开始聚合来自一堆服务的信息。 其中一些服务是通过SOAP接口同步调用的,而某些服务则是异步运行的-我必须向JMS队列Q1发送请求,并在某个时候获得对Q2的答复。

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

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

  1. 使用这种方法是否会遇到一些问题? 就像容器将为集群中的每个节点实例化一个一样。
  2. 还是我可能不小心处理了这么多请求,以至于我将存储太多响应,从而导致OutOfMemoryError?
  3. 解决此类问题的最佳方法是什么?

让我回答您的问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM