【问题标题】:Updating Apache Camel JPA object in database triggers deadlock更新数据库中的 Apache Camel JPA 对象会触发死锁
【发布时间】:2022-08-22 21:50:35
【问题描述】:

所以我有一个 Apache Camel 路由,它从 JPA 端点读取 Data 元素,将它们转换为 DataConverted 元素,并通过第二个 JPA 端点将它们存储到不同的数据库中。两个端点都是 Oracle 数据库。

现在我想在它被成功复制的原始Data 元素上设置一个标志。实现这一目标的最佳方法是什么?

我是这样尝试的:将ID保存在context中,然后读取它并访问.onCompletion().onCompleteOnly()中的dao方法。

    from(\"jpa://Data\")
        .onCompletion().onCompleteOnly().process(ex -> {    
            var id = Long.valueOf(getContext().getGlobalOption(\"id\"));
            myDao().setFlag(id);
        }).end()
        .process(ex -> {
            Data data = ex.getIn().getBody(Data.class);
            DataConverted dataConverted = convertData(data);
            ex.getMessage().setBody(data);

            var globalOptions = getContext().getGlobalOptions();
            globalOptions.put(\"id\", data.getId().toString());
            getContext().setGlobalOptions(globalOptions);
        })
        .to(\"jpa://DataConverted\").end();

但是,这似乎触发了死锁,dao 方法在更新的提交上停滞不前。唯一的解释可能是 Data 对象被 Camel 锁定并且仍然锁定在路由的 .onCompletion().onCompleteOnly() 部分,因此它无法在那里更新。

有更好的方法吗?

    标签: oracle jpa apache-camel


    【解决方案1】:

    您是否尝试过使用收件人列表 EIP,其中第一个目的地是 jpa:DataConverted 端点,第二个目的地将是设置标志的端点。这种方式都得到相同的消息,并将按顺序执行。

    https://camel.apache.org/components/3.17.x/eips/recipientList-eip.html

    from("jpa://Data")
       .process(ex -> {
                Data data = ex.getIn().getBody(Data.class);
                DataConverted dataConverted = convertData(data);
                ex.getIn().setBody(data);
         })
       .recipientList(constant("direct:DataConverted","direct:updateFlag"))
     .end();
    
     from("direct:DataConverted")
      .to("jpa://DataConverted")
     .end();
    
     from("direct:updateFlag")
      .process(ex -> {    
                var id = ((MessageConverted) ex.getIn().getBody()).getId();
                myDao().setFlag(id);
            })
     .end();
    

    请记住,您可能希望通过添加 .transacted() 使路由具有事务性

    https://camel.apache.org/components/3.17.x/eips/transactional-client.html

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多