Tôi đang thiết kế một ứng dụng sẽ chạy trong một thùng chứa OSGi (hiện tại là Equinox). Nó sẽ nhận tin nhắn trên RabbitMQ và xử lý chúng trong nội bộ. Ứng dụng sẽ chạy liên tục dưới dạng một máy chủ. Kế hoạch hiện tại của tôi là có gói trình lắng nghe RabbitMQ định cấu hình các hàng đợi của nó và đặt trình nghe trên chúng, sử dụng QueueingConsumer
và chạy trong các chuỗi riêng của chúng. Người nghe sẽ gọi một hoặc nhiều dịch vụ xử lý để xử lý các tin nhắn. Các bộ vi xử lý cần phải thực hiện các cuộc gọi JDBC để truy cập cơ sở dữ liệu. Tôi muốn có thể kiểm soát thứ tự mà bộ vi xử lý được gọi. Sẽ thật tuyệt khi có thể linh hoạt thêm nhiều dịch vụ hơn vào một thời gian sau mà không cần phải mã hóa lại trình nghe của RabbitMQ.Thiết kế ứng dụng Java OSGi bằng RabbitMQ khi đang sử dụng PreparedStatement
Vấn đề tôi phải đối mặt là thư có thể đến từ các cụm từ hoặc từ từ. Tôi muốn có thể sử dụng PreparedStatement
để tăng tốc độ truy cập cơ sở dữ liệu, nhưng tôi cũng không muốn giữ các kết nối mở dài hạn trong khi không có gì đang xảy ra. Tôi đã suy nghĩ về subclassing DefaultConsumer
trực tiếp và để cho nó chạy trên các chủ đề trong RabbitMQ Connection
, nhưng sau đó tôi mất khả năng để biết khi nào không có gì đang xảy ra. Ý tưởng ban đầu của tôi là giữ các bộ xử lý tin nhắn hoàn toàn tách biệt như các dịch vụ OSGi, và mỗi người lấy một kết nối cơ sở dữ liệu từ một hồ bơi mỗi khi nó được gọi, nhưng mất lợi thế của các câu lệnh chuẩn bị. Tôi đang sử dụng hồ bơi JDBC Tomcat, và nó dường như không có bộ nhớ đệm báo cáo chuẩn bị. Ngoài ra, tôi không chắc làm thế nào đắt tiền tạo ra một tuyên bố chuẩn bị cho mọi cuộc gọi sẽ được, nhưng có vẻ như lãng phí.
Ý tưởng tốt nhất mà tôi đã đưa ra cho đến nay là có quá trình lắng nghe của tôi trong một vòng lặp đôi. Vòng lặp bên ngoài đợi một thông báo, sau đó gọi một vòng lặp bên trong thiết lập các kết nối cơ sở dữ liệu và các câu lệnh đã chuẩn bị và chạy cho đến khi không có thêm thông báo nào hết thời gian chờ, sau đó đóng các kết nối và trả về vòng ngoài. Tôi đã nhận được điều này để làm việc cho một chút xử lý, nhưng tôi gặp khó khăn khi hình dung cách quản lý điều này nếu tôi có nhiều bộ xử lý có thể có các câu lệnh chuẩn bị khác nhau.
Có lẽ tôi phải từ bỏ ý tưởng về nhiều dịch vụ và mã hóa khó xử lý vào người nghe của mình.
Mọi đề xuất? Cảm ơn!
Cảm ơn. Tôi là một người mới của OSGi, học ở trường gõ cứng. Tôi không quen với dịch vụ Điều phối viên, nhưng tôi sẽ kiểm tra nó.Vì tôi đã đăng bài này, tôi đã có ý tưởng đăng ký người tạo dịch vụ thay vì dịch vụ. Người gọi có thể sử dụng chúng để tạo ra các dịch vụ thực sự, cho phép họ tạo các câu lệnh chuẩn bị của họ "chỉ trong thời gian", sử dụng chúng trong các hoạt động, và đóng chúng khi xảy ra sự cố. –
Tôi đã kiểm tra phiên bản Equinox mà tôi đang chạy và tôi không thấy dịch vụ Điều phối viên. Có điều gì đặc biệt mà tôi phải làm để làm cho nó chạy? Tôi nghĩ rằng tôi đang sử dụng Phiên bản 4.3 Phiên bản 4.3. –
Tôi tin rằng * Dịch vụ Điều phối * đề cập đến * "đoạn mã duy nhất [mà] gửi hàng đợi đến các dịch vụ của bạn" *. Tôi chưa bao giờ nghe về bất kỳ dịch vụ OSGi tiêu chuẩn nào gọi là * Điều phối viên *. –