![](/img/trans.png)
[英]Changing a class annotated @Component to @Bean annotated method
[英]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.