2010-11-09 2 views
3

У меня есть случай, когда в моем приложении JAVA внутри транзакции я хочу вызвать другую услугу (JMS, WebService, способ шлюза SMS и т. Д.), Я не хочу зависеть от результата вызова (Успех, сбой, исключение брошено, ... и т.д.), так что если он не как-то это не повлияет на мое завершение сделки,Использование потоков для запуска метода, который не является частью транзакции?

, что это лучший подход к использованию этого, я использую Spring Framework,

также Я хочу спросить, использовали ли я потоки для обработки этого, но мое развертывание будет на кластерах (например, на разных узлах с отдельными JVM), что лучше всего подходит для обработки (блокировка, синхронизация),

С уважением,

ответ

0

Я планировал бы это в задаче quartz.

+0

не могли бы вы объяснить больше –

+0

также принять во внимание, что я хочу запустить этот метод, как только я его назову –

+0

Я просто поставил задачу в кварцевой очереди для асинхронного выполнения. Весна имеет хорошую интеграцию с кварцем. Конечно, если вы еще не используете кварц в своем приложении, это может быть излишним, чтобы представить его только для этого варианта использования. – cherouvim

1

Вы можете создать новую нить (желательно с помощью java.util.Executor или весной TaskExecutor) для выполнения вспомогательной задачи. Синхронизация транзакций Spring работает с использованием ненаследуемых переменных ThreadLocal, поэтому новый поток не будет участвовать в текущей транзакции.

С другой стороны, и, возможно, более элегантно, вы можете явно указать уровень изоляции транзакции вокруг дочерней задачи, что-то вроде:

@Transactional(propagation=Propagation.NOT_SUPPORTED) 
public void doTheThing() { /.../ } 

Это приостановит существующую сделку по длительности этого метода, хотя вы» d по-прежнему необходимо быть осторожным с исключениями времени выполнения, не возникающими в вашей основной границе транзакции.

С уважением, ваш второй вопрос, блокировка и синхронизация в кластере - очень сложная тема, а не одна, на которую я действительно могу ответить с информацией, которую вы указали. Я предлагаю открыть для вас новый вопрос и уточнить ваши требования.