gpt4 book ai didi

java - 如何在具有多个服务器的同一数据库上使用 Camel JPA 组件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:07 24 4
gpt4 key购买 nike

我目前正在设置我的 camel 项目,我无法让我的 JPA 轮询器在多个并发服务器上工作。

这是我的 Camel 路线:

public class TicketPoller extends RouteBuilder {

/** The uri. */
private final String uri = "jpa://Ticket?consumeDelete=false&consumeLockEntity=true&consumer.SkipLockedEntity=true&consumer.query=select t from Ticket t where t.state=1";

@Override
public void configure() {
from(uri).to("log:input");

}
}

当直接在我的 Hibernate 实体中轮询时,我使用 @Consumed 注释来更改票证状态:

@Entity
@Table(name = "TICKET", schema = "TEIKITEL")
public class Ticket implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "TICKET_ID")
private String ticketId;

@Column(name = "STATE")
private int state;

...

@Consumed
public void changeTicketState() {
this.state = 2;
}

@Override
public String toString() {
return "Ticket@ticketId=" + this.ticketId;
}
}

当我从 Eclipse 在一个 Tomcat 服务器 (Tomcat 8) 上启动它时,它工作正常。

但是当我在同一个数据库上启动 2 个服务器轮询时,在我的 TICKET 表中插入一些行时出现这些错误:

在我的第一台服务器上我可以看到这个:

Hibernate: select TICKET_ID from TEIKITEL.TICKET where TICKET_ID =? for update nowait
2016-04-05 15:04:56,796 INFO [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] input(180) - Exchange[ExchangePattern: InOnly, BodyType: com.teikitel.model.entity.Ticket, Body: Ticket@ticketId=TICKET1]
Hibernate: select TICKET_ID from TEIKITEL.TICKET where TICKET_ID =? for update nowait
2016-04-05 15:04:56,812 INFO [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] input(180) - Exchange[ExchangePattern: InOnly, BodyType: com.teikitel.model.entity.Ticket, Body: Ticket@ticketId=TICKET2]

在我的第二台服务器上:

Hibernate: select TICKET_ID from TEIKITEL.TICKET where TICKET_ID =? for update nowait
2016-04-05 15:04:56,859 WARN [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] o.h.e.j.spi.SqlExceptionHelper(144) - SQL Error: 54, SQLState: 61000
2016-04-05 15:04:56,859 ERROR [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] o.h.e.j.spi.SqlExceptionHelper(146) - ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
Hibernate: select TICKET_ID from TEIKITEL.TICKET where TICKET_ID =? for update nowait
2016-04-05 15:04:56,874 WARN [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] o.h.e.j.spi.SqlExceptionHelper(144) - SQL Error: 54, SQLState: 61000
2016-04-05 15:04:56,874 ERROR [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] o.h.e.j.spi.SqlExceptionHelper(146) - ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

有人遇到同样的问题吗?

洛奇

最佳答案

没有错误!

这些错误日志来自 Hibernate,而不是来自 Camel。

Camel 执行其工作并跳过锁定在数据库中的元素(您触发的日志操作仅在一个实例上执行一次)但它使用 Hibernate 来执行其非阻塞选择请求。 Hibernate 抛出一个被 Camel 成功忽略的异常 BUT 在您的日志输出中打印错误。这就是您所看到的。

我猜你的问题的解决方案是将 Hibernate 日志设置到更高的级别。

遇到这些问题(同步),请毫不犹豫地使用 camel 中的 delay 方法来更好地理解:

public class TicketPoller extends RouteBuilder {

/** The uri. */
private final String uri = "jpa://Ticket?consumeDelete=false&consumeLockEntity=true&consumer.SkipLockedEntity=true&consumer.query=select t from Ticket t where t.state=1";

@Override
public void configure() {
from(uri).delay(10000).to("log:input"); //wait 10sec

}

关于java - 如何在具有多个服务器的同一数据库上使用 Camel JPA 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36427487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com