簡體   English   中英

駱駝尊重bean方法調用是否帶有@Transaction注釋?

[英]Will camel respect bean method call annotated with @Transaction?

我使用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持久方法采用消息正文並調用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()));
  }
}

shippingLabel服務的saveAll方法具有@Transactional方法。

@Override
@Transactional
public List<ShippingLabel> saveAll(List<ShippingLabel> labels) {
  if(CollectionUtils.isEmpty(labels)) {
    return Collections.emptyList();
  }

 return repository.saveAll(labels);
}

我想知道,如果駱駝路線調用了數據,持久化數據是否確實會包裹在事務中?

一些背景信息 :如您所見,在這種情況下,我正在使用bean進行數據持久化。 而不是駱駝組件,例如camel-jpa-component 原因是,就項目的范圍和來源而言,目前,我們希望按原樣重用現有代碼。 我們正在從一個遺留的整體應用程序中創建微服務,在該應用程序中,我們還無法完全重寫整個路由,而充分利用the camel-jpa-component 因此,我試圖查看我建議的解決方案是否可以接受。

我也知道駱駝在路由中提供了一個transacted方法調用,它使用了springs事務管理器。 但是,我不知道它是否會干擾對具有@Transactional批注的服務的調用。

我會考慮為此創建測試用例:讓標簽列表包含最后一個對於數據庫不正確的ShippingLabel(太長或某物),斷言沒有插入ShippingLabel,重構saveAll()來調用nonTransactionalSaveAll(),這應該保存除了不正確的ShippingLabel之外的所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM