Будет ли верблюд уважать вызов метода бобов, аннотированный @Transaction? - PullRequest
0 голосов
/ 18 января 2019

Я создал маршрут с верблюдом 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.

1 Ответ

0 голосов
/ 18 января 2019

Я хотел бы рассмотреть возможность создания тестового примера для этого: пусть список меток содержит последний неверный для базы данных ShippingLabel (слишком длинный или что-то в этом роде), утверждают, что ни один из ShippingLabel не вставлен, Рефакторинг saveAll () для вызова nonTransactionalSaveAll (), который должен сохранить все, кроме неправильной ShippingLabel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...