骆驼尊重bean方法调用是否带有@Transaction注释?

时间:2019-01-18 09:35:21

标签: java spring spring-data-jpa apache-camel

我用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批注的服务的调用。

1 个答案:

答案 0 :(得分:0)

我会考虑为此创建测试用例: 让标签列表包含最后一个对于数据库不正确的ShippingLabel(太长或某物),断言没有插入ShippingLabel, 重构saveAll()来调用nonTransactionalSaveAll(),它将保存除错误的ShippingLabel之外的所有内容。