1

我有一个 JavaEE 6 / EJB3.1 / Glassfish 3.1.2 应用程序,它从远程计算机检索 .xml 页面,将它们转换为 java 对象,然后将它们中的每一个都保存在我的 mysql 数据库中。有成千上万个这样的 .xml 页面,我只是在逐步添加它们。
这很好用,除了它非常慢(70ms 页面检索 + 转换和持久化实体的少量时间)。

我想同时进行这项工作以加快速度 - 最好的方法是什么?

可能值得注意:每个页面检索都会更新 mysql 数据库中用于获取页面的 OAuth 凭据的计数,如果它处于最大值,则不会继续(引发异常)。我不确定这是否/多少会使事情复杂化 - 但如果两个线程看到它低于最大值,那么在更新计数之前获取页面它可能会超过最大值。

到目前为止,我的研究已将其缩小到两种可能性(尽管可以随意添加其他可能性):

  1. Message Driven Beans - 我想,虽然可能是错误的,但我会让一个会话 bean 发送 url 消息,直到消息队列已满(比如添加了 10 个 url),然后阻塞直到队列未满。Glassfish 将创建我创建的消息 bean 的 10 个实例,每个实例从其中一个 url 获取一个 .xml,更新 OAuth 计数,然后将此 .xml 作为消息发送到另一个队列,其中另一个消息 bean 可以转换并持续存在。此队列中的 xml。
  2. 使用@Asynchronous方法并创建我自己的线程安全队列?这可能更简单,更适合我正在做的事情,但我不确定我将如何实现它。

任何意见,将不胜感激!

4

2 回答 2

1

由于您正在处理远程服务器,您知道它的扩展性如何吗?如果你用 10 个线程来处理它,你的响应时间会变成 700 毫秒还是会保持稳定在 70 毫秒?

假设远程服务器可以扩展,我认为您对 MDB 的想法很满意。但是,您对此的一些想法是不准确的。您将创建提交到队列的会话 bean。我们的不同之处在于,我认为您希望在工作可用时尽快加载队列。您可以设置队列大小并告诉它是否希望在满足该大小时丢弃最旧的或最新的。我怀疑您想使用所有消息,您也可以这样做。我运行包含 100 条数千条消息的队列。您实际上只限于队列的内存大小,您可以通过使消息尽可能紧凑来管理它。

在消费方面,您可以将 MDB 池限制为 10 个 bean 或其他任何东西,这仅取决于远程服务器能够扩展到什么以及您的服务器也能够扩展什么。而不是使用 2 个队列(这只是基于您描述的问题),我只使用一个。创建一个 MDB,它可以完成您现在所做的一切,即抓取 xml 并将其持久化。最后,如果您发现需要扩展,只需创建集群并添加节点即可。然后,每个节点都会有一个正在使用的 MDB 池。

关于异步,将如何控制池大小以及 MDB 给您的所有其他东西?我并不是说你不能,但似乎你正在重新发明轮子。

于 2012-11-21T11:10:18.850 回答
0

完全同意普雷斯顿。此外,如果您意识到需要通过添加更多节点来进行扩展,请确保配置 JMS 队列以使其接受多个消费者。这是“应用程序级”负载均衡器的典型设置,其中工作被分派给工作人员。

于 2012-11-22T16:15:12.140 回答