2013-11-08 4 views
3

Я хотел бы узнать подходы к синхронизации на Camel Processor.Получение блокировки на процессоре Camel

Единственная связанная вещь, которую я нашел на docs:

Обратите внимание, что нет никакого параллелизма или блокировки проблемы при использовании ActiveMQ, JMS или Седа конструкцией; они предназначены для высокоточного использования . Однако возможны ли проблемы параллелизма в процессоре сообщений, то есть, что делает процессор с сообщением ?

Так что, если я хочу, чтобы получить блокировку на org.apache.camel.Processor.process (Exchange), то есть я хотел бы другие потоки ждать процесс метода отделки в то время как он занят. Это возможно?

UPDATE: На самом деле я пытался сделать синхронизировано (замок) внутри процесса метод - который работает на JVM стороне. Но мой Процессор является частью маршрута с транзакциями, и это проблема - все изменения в Уровне Стойкости становятся видимыми только после выхода из Процессора (или даже, возможно, маршрута). Поэтому я подумал, что для этой проблемы есть некоторые решения, подобные Camel.

+0

Извините, что являетесь откровенным, но не можете ли вы просто попробовать его и посмотреть? – MikeThomas

+0

См. Мое обновление. Извини, что будешь. –

ответ

3

Бизнес-логика, реализуемая внутри процессора Camel, должна быть потокобезопасной, поскольку несколько потоков будут использовать один и тот же экземпляр во время маршрутизации сообщений в Camel.

Если вы хотите использовать область прототипа (например, создавая новый экземпляр процессора для каждого сообщения), вы можете использовать компонент bean и установить cache = false, а если вы используете Spring, тогда объявите bean-прототипом как прототип

<bean id="myBean" class="com.foo.MyBean" scope="prototype"/> 

И затем вызвать этот компонент в маршруте

.to("bean:myBean?cache=false") 

Хотя очень часто люди используют одноэлементные экземпляры.

Если вы хотите какой-либо блокировки, вы можете определить метод как синхронизированный и позволить JVM заблокировать его для вас.

public synchronized void process(Exchange exchange) throws Exception { 
    ... 
} 
+0

Спасибо Клаусу, трюк с _prototype_ будет пренебрегать мощностью многопоточной обработки. И метод _synchronized_ on _process_ помогает мне, но снова я потерял способность вызывать процессор с несколькими потоками. Пожалуйста, см. Мое обновление, я не показывал всю картину. Может быть, есть еще более сложные решения? –

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