2010-04-21 56 views

Trả lời

10

See java.sun.com

Một đối tượng Session là một bối cảnh đơn luồng cho sản xuất và tiêu thụ thông điệp. Mặc dù nó có thể phân bổ tài nguyên nhà cung cấp bên ngoài máy ảo Java (JVM), nhưng nó được coi là một đối tượng JMS nhẹ.

Một phiên phục vụ nhiều mục đích:

  • Nó là một factory cho các nhà sản xuất và người tiêu dùng thông điệp của nó.
  • Nó cung cấp các nhà máy thông điệp được nhà cung cấp tối ưu hóa.
  • Nó hỗ trợ một loạt các giao dịch kết hợp công việc mở rộng nhà sản xuất và người tiêu dùng thành các đơn vị nguyên tử.
  • Nó xác định thứ tự nối tiếp cho các thư mà nó tiêu thụ và các thư mà nó tạo ra.
  • Nó giữ lại các thông điệp mà nó tiêu thụ cho đến khi chúng được xác nhận.
  • Nó tuần tự thực hiện các trình lắng nghe thông điệp được đăng ký với người tiêu dùng tin nhắn của nó.

Phiên có thể tạo và dịch vụ cho nhiều nhà sản xuất và người tiêu dùng tin nhắn.

Một cách sử dụng điển hình là có một khối chuỗi trên một MessageConsumer đồng bộ cho đến khi một tin nhắn đến. Sau đó, chủ đề có thể sử dụng một hoặc nhiều Trình tạo tin nhắn của Phiên.

+1

Luồng luồng là điểm chính. Phiên làm việc (người sản xuất, người tiêu dùng, tin nhắn) không an toàn. Đối với công cụ này, bạn phải bảo vệ khỏi truy cập đồng thời hoặc tạo nhiều chuỗi để nhiều chủ đề không chia sẻ. –

+2

Thật sao? Sao chép dán từ API Java ... http://docs.oracle.com/javaee/7/api/javax/jms/Session.html –

1

Các Oracle documentation nói:

Một phiên có thể được quy định như giao dịch. Mỗi phiên giao dịch hỗ trợ một chuỗi giao dịch duy nhất. Mỗi giao dịch nhóm một tập hợp các tin nhắn gửi và một tập hợp các tin nhắn nhận được vào một đơn vị nguyên tử của công việc. Trong thực tế, các giao dịch tổ chức luồng thông báo đầu vào của một luồng và luồng thông điệp đầu ra thành chuỗi các đơn vị nguyên tử. Khi một giao dịch cam kết, đơn vị nguyên tử đầu vào của nó được thừa nhận và đơn vị nguyên tử đầu ra liên quan của nó được gửi đi. Nếu một lệnh rollback giao dịch được thực hiện, các tin nhắn được gửi của giao dịch sẽ bị hủy và đầu vào của phiên sẽ tự động được phục hồi.

Nội dung của đơn vị đầu vào và đầu ra của giao dịch đơn giản là những thông điệp được tạo ra và sử dụng trong giao dịch hiện tại của phiên.

Giao dịch được hoàn thành bằng phương pháp commit của phiên hoặc phương thức của phiên là rollback. Việc hoàn thành giao dịch hiện tại của phiên sẽ tự động bắt đầu giao dịch tiếp theo. Kết quả là phiên giao dịch luôn có giao dịch hiện tại trong đó công việc của nó được thực hiện.

Dịch vụ giao dịch Java (JTS) hoặc một số giao dịch khác có thể được sử dụng để kết hợp giao dịch của phiên với các giao dịch trên các tài nguyên khác (cơ sở dữ liệu, các phiên JMS khác, v.v.). Vì các giao dịch phân phối Java được điều khiển thông qua API giao dịch Java (JTA), việc sử dụng các phương thức commitrollback của phiên trong ngữ cảnh này đều bị cấm.

3

Tôi có cùng một câu hỏi và đó là điều dẫn tôi đến đây.Việc trích dẫn Doc không phải là rất hữu ích trong trường hợp này, vì tôi chắc chắn câu hỏi của OP không phải là về cách sử dụng các phiên, hoặc họ làm gì, nhưng tại sao chúng thực sự tồn tại, tại sao không kết hợp khả năng của chúng với Connection. IMHO, đây là một câu hỏi meta.

Nói một cách cơ bản Các phiên về cơ bản là chế độ xem của luồng thành một Kết nối, Dưới đây là những gì thông số JMS phải nói về mối quan hệ giữa một chuỗi và một phiên trong khi truy cập sau này.

Không có giới hạn về số lượng chủ đề có thể sử dụng phiên hoặc bất kỳ đối tượng nào tạo ra. Hạn chế là các tài nguyên của một phiên không nên được sử dụng đồng thời bởi nhiều luồng. Đó là vào người sử dụng để đảm bảo rằng hạn chế concurrency này được đáp ứng. Cách đơn giản nhất để thực hiện việc này là sử dụng một chuỗi. Trong trường hợp phân phối không đồng bộ, hãy sử dụng một chuỗi để thiết lập ở chế độ bị dừng và sau đó bắt đầu phân phối không đồng bộ. Trong các trường hợp phức tạp hơn, người dùng phải cung cấp đồng bộ hóa rõ ràng.

Từ quan điểm nhắn tin, chúng giữ một đơn vị công việc hợp lý. Đó là lý do tại sao Giao dịch được kết hợp với Phiên.

Có nói rằng, khá thường xuyên sẽ có ánh xạ 1: 1 giữa kết nối và Phiên. Đó là lý do tại sao tôi nghĩ rằng JMSContext đã được giới thiệu trong 2.0. để đơn giản hóa mọi thứ.

Nhìn vào ngày của bài đăng của OP, tôi nghĩ rằng tôi gần một thập kỷ muộn. : D

+2

Chỉ hơn bảy năm, nhưng muộn hơn không bao giờ. :) –

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