故障转移时检测到重复的消息

时间:2018-03-02 09:23:02

标签: activemq

我们在以下配置中有ActiveMq 5.15.2:

  • PostgreSQL for persistance
  • 两个节点,一个处于待机状态
  • 带有共享数据库的JDBC主从
  • 静态群集发现

一切接缝都很好,故障转移按预期工作,但有时在故障转移(或重启整个集群)期间,我们会观察到以下异常:

 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吗?

1 个答案:

答案 0 :(得分:0)

我们的JDBC配置不正确 - autocommit设置为false,结果消息在DB中传播延迟。