Jakarta ee 并发IO处理JavaEE:最佳方法?

Jakarta ee 并发IO处理JavaEE:最佳方法?,jakarta-ee,concurrency,glassfish,ejb,jms,Jakarta Ee,Concurrency,Glassfish,Ejb,Jms,我有一个JavaEE6/EJB3.1/Glassfish 3.1.2应用程序,它从远程计算机检索.xml页面,将它们转换为java对象,然后将它们保存在我的mysql数据库中。有成千上万个这样的.xml页面,我只是以增量的方式添加它们 这非常有效,只是速度非常慢(70毫秒的页面检索+转换和保存实体的少量时间) 我想同时进行这项工作,以加快速度——最好的方法是什么 可能值得注意的是:每次页面检索都会更新mysql数据库中用于获取页面的OAuth凭据的计数,如果达到最大值,则不会继续(抛出异常)。我

我有一个JavaEE6/EJB3.1/Glassfish 3.1.2应用程序,它从远程计算机检索.xml页面,将它们转换为java对象,然后将它们保存在我的mysql数据库中。有成千上万个这样的.xml页面,我只是以增量的方式添加它们
这非常有效,只是速度非常慢(70毫秒的页面检索+转换和保存实体的少量时间)

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

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

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

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

    由于您要处理的是远程服务器,您知道它的扩展情况吗?如果你用10个线程点击它,你的响应时间会变为700毫秒还是保持稳定在70毫秒

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

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


    关于非同步,我们将如何控制池大小以及MDB提供给您的所有其他东西?我不是说你不能,但看起来你正在重新发明轮子。

    既然你在处理一个远程服务器,你知道它的可扩展性有多好吗?如果你用10个线程点击它,你的响应时间会变为700毫秒还是保持稳定在70毫秒

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

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


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

    完全同意普雷斯顿的观点。此外,如果您意识到需要通过添加更多节点来扩展,请确保以一种可以接受多个使用者的方式配置JMS队列。这是“应用程序级”负载平衡器的典型设置,工作分配给工人。

    完全同意普雷斯顿的观点。此外,如果您意识到需要通过添加更多节点来扩展,请确保以一种可以接受多个使用者的方式配置JMS队列。这是“应用程序级”负载平衡器的典型设置,工作分配给工人。

    谢谢您的回答。远程服务器将能够在我可以扩展到的范围内完美地扩展。我实现了这一点,只有一个队列包含url,一个MessageDrivenBean执行所有逻辑。但是,我得到:
    java.sql.SQLException:超过了锁等待超时;尝试重新启动事务