2014-01-20 2 views
0

У меня есть панель мониторинга, где пользователи могут модифицировать данные своих клиентов. Некоторые изменения требуют большой обработки для всех этих клиентов. Я не хочу блокировать пользователя, ожидающего завершения задачи, и как я могу управлять этим в фоновом режиме?Как управлять тяжелой задачей под Java/Spring?

Я видел Spring Batch, но я не уверен, что это хороший ответ. Есть ли еще что-нибудь?

Заранее за вашу помощь.

+0

просто положите, переместите дорогостоящую задачу в отдельную нить и покажите результат, как только это будет сделано. таким образом вы не будете блокировать пользователя. существует множество библиотек, которые предоставляют такую ​​функциональность, но принцип тот же. – kmera

+0

@ k-mera Опасайтесь, что если вы находитесь в контексте J2EE, вы не должны этого делать: http://stackoverflow.com/questions/533783/why-spawning-threads-in-java-ee-container-is-discouraged –

+0

да, но вопрос никогда не говорил ничего о J2EE :) edit: woops it упоминает spring, my bad – kmera

ответ

2

See (Google) @Async и или Spring AMQP/JMS

+1

Я прошу разницы, JMS ни в коем случае не является многопоточной библиотекой –

+0

Он ничего не сказал о потоках и передаче сообщений - это масштабируемый способ для обработки отложенных задач. –

+0

Я уже делал подобные вещи в прошлом, и мой конкуссия состоял в том, что я оставил клиенту гораздо более сложную и гораздо менее эффективную среду для жизни :( –

0

Это не является специфической особенностью Spring, но если вы работаете под сервером коммерческих приложений Java (скажем, WebSphere, WebLogic), вы будете иметь некоторую реализацию workmanagers.

http://docs.oracle.com/javaee/1.4/api/javax/resource/spi/work/WorkManager.html

Эти управляемые контейнером threadpools, используемые для отправки работы в фоновом режиме. Вы найдете инструменты в консоли администратора, чтобы настроить и точно настроить их.

+0

Я под причалом. –

0

У вас должен быть процесс или приложение separte для обработки этой тяжелой задачи. Ваше основное приложение должно связываться с этим процессором с тяжелыми задачами с помощью любого метода, такого как JMS, JGroups, ConcurrentLinkedQueue или того, что вы хотите. Вы можете обрабатывать (дека) каждую задачу по одному или использовать пул потоков. Когда задача завершена, вы должны реализовать способ сообщить основному приложению, что задача завершена (JMS, подписка и т. Д.)

0

У вас уже есть принятый ответ, но я хотел добавить другой вариант FYI ,

  • Если вы хотите работать в пределах одной JVM, @Async и исполнитель задач будут работать.
  • Если у вас есть большая работа, требующая отслеживания прогресса, резюме и т. Д., И пользователю не требуется взаимодействие, работает Spring Batch.
  • Если у вас есть большие задания, которые вы хотите запускать удаленно или как часть архитектуры, управляемой сообщениями, Spring Batch Integration - это новое усилие, чтобы лучше сочетать Spring Integration и Spring Batch.
+0

IMHO Я считаю, что Spring Integration и Spring Batch могут быть раздутыми и сложными библиотеками, когда понимание библиотеки MQ/сервера/брокера (то есть AMQP и/или JMS) является достаточным. Кроме того, в то время как Spring Batch имеет статус уровня задачи, у него нет статуса уровня элемента (т. Е. Этот элемент сделан? Сделал ошибку?), Поэтому вам нужно написать это самостоятельно. Честно говоря, я думаю, что Spring Integration/Batch все еще написана для внутренних корпоративных и не публичных приложений SaaS, где вам нужна более динамичная гибкость (например, очереди на лету ... и т. Д.). –

+0

Spring Integration - это обмен сообщениями на уровне приложений, AMQP/JMS - это обмен сообщениями в инфраструктуре. Это не раздувание, это абстракция. Это позволяет вам изменить способ интеграции компонентов, не беспокоясь о технологическом изменении, и позволяет вам следовать EIP. Как это дает вам меньше гибкости, чем жесткое кодирование для JMS вне меня. Что касается Spring Batch, вы можете либо реализовать ItemListeners, либо уменьшить размер блоков, если вам нужна эта гранулярность. Поэтому я не согласен. :) –

+0

Абстракции, конечно, могут быть раздутыми (умственными). Кроме того, я реализовал собственную простую абстракцию сообщений, используя стиль Guava @Subscriber, поэтому я могу подключить любую инфраструктуру обмена сообщениями, которую хочу (в настоящее время использую Spring AMQP). Я просто нашел большинство вещей в Spring Integration/Batch, чтобы иметь те же проблемы, что и Spring Security: я в конечном итоге постоянно просматриваю код и практически переопределяю половину фреймворка, не говоря уже о раздражающем XML DSL (даже java config - это волшебный ауд) , Его не сложно сделать EIP с AMQP. Точно так же, как это не сложно сделать с помощью сервлет-фильтров :) –

Смежные вопросы