当我在repository.saveAndFlush
旁边切换断点并在 de 调试模式下,我看到它返回了一个带有新 ID 的新客户端对象,但是当我签入数据库时,我找不到该客户端。但是,如果我做一个简历(F8 与日食(,然后我重新检查数据库,我找到了客户端。
那么如何在驼峰处理器的执行过程中强制持久化数据,而不是在路由结束时强制持久化数据呢?
@Component
public class myRoute extends RouteBuilder {
@Autowired Processor validationDatasProcessor;
@Autowired Processor clientProcessor;
@Autowired Processor endCientProcessor;
@Override
public void configure() throws Exception {
from("queueIn")
.id("route_processing").messageHistory().transacted()
.log(LoggingLevel.DEBUG, log, "reception").pipeline()
.process(validationDatasProcessor)
.id(validationDatasProcessor.getClass().getSimpleName().toLowerCase())
.process(clientProcessor)
.id(clientProcessor.getClass().getSimpleName().toLowerCase())
.process(endCientProcessor).id(endCientProcessor.getClass().getSimpleName().toLowerCase())
.to("outputQueue")
.end();
}
}
处理器:
@Component
public class ValidationDatasProcessor implements Processor {
@Autowired ObjectMapper objectMapper;
@Autowired ClientRepository clientRepository;
@Override
public void process(Exchange exchange) throws Exception {
String clientString = exchange.getIn().getBody(String.class);
Client client = objectMapper.readValue(clientString, Client.class);
clientRepository.saveAndFlush(client)
exchange.setOut(generateOutMessage(client, exchange.getContext()));
}
Message generateOutMessage(Client client, CamelContext camelContext) throws JsonProcessingException {
DefaultMessage outMessage = new DefaultMessage(camelContext);
outMessage.setBody(objectMapper.writeValueAsString(client), String.class);
return outMessage;
}
}
@Component
public class ClientProcessor implements Processor {
@Autowired ObjectMapper objectMapper;
@Autowired ClientRepository clientRepository;
....
@Override
public void process(Exchange exchange) throws Exception {
String clientString = exchange.getIn().getBody(String.class);
Client client = objectMapper.readValue(clientString, Client.class);
client.setAccessDate(LocalDateTime.now);
clientRepository.saveAndFlush(client)
exchange.setOut(generateOutMessage(client, exchange.getContext()));
}
Message generateOutMessage(Client client, CamelContext camelContext) throws JsonProcessingException {
DefaultMessage outMessage = new DefaultMessage(camelContext);
outMessage.setBody(objectMapper.writeValueAsString(client), String.class);
return outMessage;
}
}
您的整个路由都是事务处理;这意味着整个路由都在事务范围内。只有在执行整个路由后才会执行commit
。
如果要在事务边界之外执行处理器,请拆分路由并使用seda
终结点。 seda
是异步的,并启动新线程。它们不会参与活动事务边界。
在事务范围的中间提交部分听起来不是一个好主意。也许您的轮盘需要分成多个片段。
本文档可能会帮助您更好地理解它们。