Я создал маршрут с верблюдом Apache, читал из очереди, выполнял некоторую обработку и в конечном итоге сохранял обработанные элементы в базе данных. Вот (сокращенная версия) маршрут:
fromF("activemq:queue:%s?username=%s&password=%s&transacted=true&transactionTimeout=5000", queueProperties
.getStatusQueueName(), queueUsername, queuePassword)
.unmarshal().json(JsonLibrary.Jackson, StatusUpdate.class)
.bean(shippingLabelPersister, "persist").id("status-update-persister")
.routeId(ROUTE_ID);
Метод shippingLabelPersister
persist принимает тело сообщения и вызывает shippingLabelService:
public void persist(@Body List<ShippingLabel> labels) {
if(CollectionUtils.isEmpty(labels)) {
return;
}
List<ShippingLabel> savedLabels = shippingLabelService.saveAll(labels);
for(ShippingLabel label : savedLabels) {
logger.info("Updated shipment {} with status {} (timestamp: {})", label.getBarcode(), label.getStatus(), DATE_TIME_FORMATTER.format(label.getStatusChanged()));
}
}
Метод saveAll
службы shippingLabel имеет метод @Transactional.
@Override
@Transactional
public List<ShippingLabel> saveAll(List<ShippingLabel> labels) {
if(CollectionUtils.isEmpty(labels)) {
return Collections.emptyList();
}
return repository.saveAll(labels);
}
Я хочу знать, будут ли сохраненные данные действительно обернуты внутри транзакции, если они вызваны верблюжьим маршрутом?
Некоторая справочная информация :
Как вы уже видели, я использую бины для сохранения данных в этом случае. Вместо верблюжьего компонента, например camel-jpa-component
. Причина этого заключается в том, что на данный момент, что касается объема и происхождения проекта, мы хотим повторно использовать существующий код как есть. Мы создаем микросервисы из унаследованного монолитного приложения, в котором мы еще не можем переписать весь маршрут (пока), полностью используя the camel-jpa-component
. Поэтому я пытаюсь понять, является ли предложенное мной решение приемлемым.
Мне также известно, что верблюд обеспечивает вызов метода transacted
из маршрута, который использует диспетчер транзакций springs. Однако я не знаю, будет ли это мешать вызову службы, которая имеет аннотацию @Transactional
.