2012-04-28 25 views
7

Tôi đã cố gắng chia sẻ kết nối giữa các chủ đề và có các kênh chỉ mở trên quá trình tạo chuỗi nhưng sau khi nghiên cứu thêm một chút, tôi nghĩ mình cũng muốn thử connection pooling. Làm thế nào tôi có thể làm điều này trên thỏmq? hay đây là một ý tưởng chung tôi có thể áp dụng chung? Mục tiêu của tôi là để sinh ra X chủ đề và sau đó có họ không phải mở các kênh mới (đòi hỏi phải thiết lập vòng robin giữa khách hàng và máy chủ).Tôi làm cách nào để có thể gộp các kênh trong thỏmq?

Vì chủ đề là lớp riêng của họ, tôi không chắc liệu mình có cần đặt hồ bơi trong chính lớp đó để sinh ra các chủ đề hoặc nơi chúng đi không? Tôi cũng có nhiều loại chủ đề mà tôi muốn chia sẻ kết nối giữa (không chỉ một duy nhất). Điều đó có thể không?

Chỉ cần để cung cấp cho bạn một ý tưởng chung, đây là cách kết nối/kênh được Estblished trong RabbitMQ:

ConnectionFactory factory = new ConnectionFactory(); 
    factory.setHost("localhost"); 
    Connection connection = factory.newConnection(); 
    Channel channel = connection.createChannel(); //I want to share several of these between threads 

Trả lời

6

Tất cả bạn cần là một vũng Channel đối tượng mà đề của bạn có thể kéo từ.

Apache commons thực sự đã có chung ObjectPool bạn có thể sử dụng.

Các javadoc cho giao diện có thể được tìm thấy ở đây: http://commons.apache.org/pool/api-1.6/org/apache/commons/pool/ObjectPool.html

Các javadoc cho một trong những triển khai xây dựng trước của họ có thể được tìm thấy ở đây: http://commons.apache.org/pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.html

Một hướng dẫn để sử dụng nó có thể được tìm thấy ở đây: http://commons.apache.org/pool/examples.html

Nếu điều này quá phức tạp đối với các nhu cầu đơn giản của bạn, thực sự tất cả những gì bạn cần làm là viết một lớp quản lý một tập hợp các đối tượng Channel, cho phép chủ đề kiểm tra chúng và gửi chúng trở lại hồ bơi. để ngăn hai chủ đề nhận được cùng một địa chỉ Channel

+0

Cảm ơn, tôi sẽ nghiên cứu nó để tìm hiểu thêm nhưng đối tượng có thể chia sẻ giữa các lớp khác không? Giả sử tôi có một lớp tải lên và lớp khác tải xuống, cả hai có thể sử dụng Kênh từ cùng một đối tượng không? – Lostsoul

+0

@Lostsoul - đã lâu rồi kể từ khi tôi bị nhốt thỏ, nhưng nếu lớp 'Channel' được sử dụng cho cả sản xuất cũng như tiêu thụ thì có. –

+0

Tôi hiểu rằng, những gì tôi có nghĩa là sẽ có nhiều lớp học có quyền truy cập vào cùng một hồ bơi đối tượng hoặc tôi cần phải tạo hồ bơi đối tượng cho mỗi lớp học sẽ sử dụng nó? – Lostsoul

3

Bạn cũng có thể sử dụng đối tượng ThreadLocal, trong trường hợp bạn sử dụng kênh.

RabbitMq khuyên bạn nên sử dụng các kênh cho mỗi Chủ đề, vì vậy đó sẽ là một kết hợp hoàn hảo.

Mẫu mã:

private final ThreadLocal<Channel> channels = new ThreadLocal<>(); 
    ... 
    Channel channel = channels.get(); 
    if (channel == null){ 
      channel = connection.createChannel(); 
      channels.set(channel); 
     } 

không cần phải đóng các kênh truyền hình, vì họ sẽ được đóng lại bởi ứng dụng của bạn khi kết nối được đóng lại. Mặc dù giải pháp này có thể không phù hợp với bạn nếu bạn tạo nhiều chủ đề mới vì sẽ phân bổ nhiều kênh mới sẽ không bao giờ bị đóng. Nhưng nếu bạn làm điều gì đó như thế, bạn có thể làm điều gì sai.

Các vấn đề liên quan