如何在执行 Camel 处理器而不是路由结束期间强制持久化数据



当我在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是异步的,并启动新线程。它们不会参与活动事务边界。

在事务范围的中间提交部分听起来不是一个好主意。也许您的轮盘需要分成多个片段。

本文档可能会帮助您更好地理解它们。

最新更新