Tôi đã tạo một AQ trong oracle và đã viết 2 người dùng JMS trong Java để nghe hàng đợi. Tôi đã quan sát đôi khi rằng nếu tôi tạo ra một số thông điệp trong hàng đợi; số lượng các thông điệp dequeued từ hàng đợi lớn hơn những gì enqueued. Nó có nghĩa là một số tin nhắn được tiêu thụ hai lần.Oracle AQ cùng một thông điệp được gửi hai lần
Tôi đã tạo ra hàng đợi với bất động sản: - multiple_consumers => FALSE
Và người tiêu dùng JMS đang làm việc trong CLIENT_ACKNOWLEDGE mode
Xin hãy giúp tôi tìm hiểu những lý do có thể cho hành vi như vậy và đó là giải pháp. Vì vậy, tôi có thể nhân rộng vấn đề và giải quyết vấn đề trên và đảm bảo rằng số lượng thư được enqueued bằng với số lượng thư bị dequeued trong trường hợp nhiều người tiêu dùng JMS đang nghe cùng AQ.
Thực ra quá trình này giống như Người tiêu dùng tiêu thụ thông báo, ghi lại nó trong bảng Cơ sở dữ liệu và gửi ACK. nếu có một số ngoại lệ trong quá trình xử lý thì thư đó được chuyển đến hàng đợi ngoại lệ. Tôi đã tạo ra nhiều người tiêu dùng JMS bởi vì nếu một người khác có thể xử lý các thông điệp tiêu thụ, tức là; để đảm bảo hệ thống hoạt động hiệu quả và có tính khả dụng cao. Vì vậy, điều này đảm bảo trong trường hợp như vậy, nơi ACK không được thực hiện hoặc ngoại lệ được tạo ra tin nhắn được tiêu thụ một lần. –
OK. Nhưng đó là một trong những lý do có khả năng nhất (dù là một ack chưa được gửi đi). Tôi không quen thuộc với các dequeue truy cập và làm thế nào nó tính toán dequeues (tức là là một unacked nhưng gửi tin nhắn dequeued hay không, những gì về một giao dịch quay trở lại vv). Thêm mẫu mã và biết thêm thông tin trong Q của bạn để có câu trả lời tốt hơn. –
Trên thực tế, tôi đã chạy các kịch bản thử nghiệm như vậy, trong đó tôi đếm số lượng thư được enqueued và số lượng thư dequeued và xác suất nhận được kịch bản như vậy là rất hiếm. Trên thực tế nó giống như tôi enqueued 15K tin nhắn và dequeued nó và tôi chạy thử nghiệm này aroungd 20-30 lần và chỉ có hai lần hoặc ba lần tôi quan sát thấy rằng số dequeued lớn hơn số enqueued. –