我们在以下配置中有ActiveMq 5.15.2:
一切接缝都很好,故障转移按预期工作,但有时在故障转移(或重启整个集群)期间,我们会观察到以下异常:
WARN [ActiveMQ NIO Worker 6] org.apache.activemq.transaction.LocalTransaction - Store COMMIT FAILED:java.io.IOException: Batch entry 2 INSERT INTO ACTIVEMQ_MSGS(ID, MSGID_PROD, MSGID_SEQ, CONTAINER, EXPIRATION, PRIORITY, MSG, XID) VALUES (...) was aborted: Unique-Constraint activemq_msgs_pkey Detail: key(id)=(7095330) alerady exists
ActiveMQ将此异常直接传播到客户端。
我想,ActiveMQ能够识别重复的消息,但这里出了点问题......
客户端尝试传递具有已存在ID的消息,ActiveMQ是否应将此消息与存储中已存在的消息进行比较(如果可能,取决于数据库),如果两个消息相同,则忽略第二条消息?
或者也许ActiveMQ假设允许保留重复的消息并且我们的数据库结构不正确(约束id
)?
CREATE TABLE activemq_msgs
(
id bigint NOT NULL,
container varchar(250),
msgid_prod varchar(250),
msgid_seq bigint,
expiration bigint,
msg bytea,
priority bigint,
xid varchar(250)
);
ALTER TABLE activemq_msgs
ADD CONSTRAINT activemq_msgs_pkey
PRIMARY KEY (id);
我们应该放弃activemq_msgs_pkey
吗?
答案 0 :(得分:0)
我们的JDBC配置不正确 - autocommit设置为false,结果消息在DB中传播延迟。