У меня есть приложение JavaEE 6/EJB3.1/Glassfish 3.1.2, которое извлекает страницы .xml с удаленного компьютера, преобразует их в объекты java, а затем сохраняет каждый из них в моей базе данных mysql. Есть десятки тысяч этих страниц .xml, и я просто добавляю их постепенно.
Это работает отлично, за исключением того, что это очень медленно (70 мс извлечение страницы + небольшое количество времени для преобразования и сохранения объектов).
Я хочу выполнять эту работу одновременно, чтобы ускорить ее - каков наилучший способ?
Возможно, стоит отметить: каждое извлечение страницы обновляет счетчик в базе данных mysql для учетных данных OAuth, которые он использует для получения страницы, и если он достигает максимума, он не продолжается (выдает исключение). Я не уверен, насколько это усложнит ситуацию, но если два потока увидят, что оно ниже максимального, то получите страницу перед обновлением счетчика, который может превысить максимальное значение.
Мое исследование до сих пор сузило его до двух возможностей (не стесняйтесь добавлять другие):
- Компоненты, управляемые сообщениями. Я предполагаю, хотя, вероятно, ошибаюсь, что сеансовый компонент будет отправлять сообщения URL-адресов до тех пор, пока очередь сообщений не будет заполнена (скажем, будет добавлено 10 URL-адресов), а затем блокируется до тех пор, пока очередь не будет заполнена. полный. Glassfish создаст 10 экземпляров компонента сообщений, который я создаю, каждый из которых получит один из .xml с одного из URL-адресов, обновит счетчик OAuth, а затем отправит этот .xml как сообщение в другую очередь с другим компонентом сообщения, который преобразуется и сохраняется. xmls из этой очереди.
- Использовать метод @Asynchronous и создать свою собственную потокобезопасную очередь? Это может быть намного проще и больше подходит для того, что я делаю, но я точно не знаю, как бы я это реализовал.
Любой совет будет принят во внимание!