6 CHƯƠNG V I: THIẾT KẾ DỊCH VỤ IPTV
6.1.2 Các khái niệm chính của SIPServlet API
Khái niệm chính của SIP Servlet tương tự như HTTP Servlet.Các phần dưới đây sẽ mô tả phần chính của một vài khái niệm.
6.1.2.1 Mục đích của SIP Servlet API
Một số thuộc tính quan trọng của API bao gồm:
• SIP Signaling: chấp nhận cho các ứng dụng thực hiện hoàn thành một chuỗi các hành động của tín hiệu SIP, bao gồm hỗ trợ các nhiệm vụ như User Agent Client (UAC), User Agent Server (UAS) và proxy.
• Tính đơn giản: các Container xử lý các việc phức tạp không cần thiết như quản lý các điểm lắng nghe mạng, truyền lại, Cseq, Call-ID thông qua các trường điều khiển, định tuyến,…
• Các ứng dụng hội tụ: các Container có khả năng hỗ trợ cho các ứng dụng hội tụ, đó là các ứng dụng có thể chia ra thành nhiều các giao thức và các loại media khác nhau, ví dụ như web, telephony và presence.
• Phát triển ứng dụng tại nhà cung cấp thứ ba: mô hình servlet hỗ trợ việc phát triển ứng dụng cho bên thứ ba. Việc mô tả triển khai XML thường được sử dụng để giao tiếp thông tin ứng dụng từ các bên thiết kế ứng dụng cho tới bên triển khai.
• Thành phần ứng dụng: có thể dùng cho một vài các ứng dụng thực thi trên các yêu cầu hoặc hồi đáp theo chiều đến hoặc đi. Mỗi một ứng dụng có một bộ các quy tắc của nó và thực thi một cách độc lập với các ứng dụng khác một cách rành mạch và tạo thành theo thứ tự. • Carrier grade (cấp độ carrier): các servlet lưu trữ dữ liệu ứng dụng
trong các container quản lý các phiên đối tượng. Việc triển khai có thể tiếp tục tái tạo dữ liệu này để đạt được hiệu quả cao.
6.1.2.2 Vòng đời của SIP Servlet
Vòng đời của một servlet được bắt đầu tính từ khi nó được nạp vào trong bộ nhớ của máy chủ ứng dụng (AS) và kết thúc khi servlet bị ngắt hoặc nạp lại.
Vòng đời của servlet bao gồm các bước sau:
• Lớp servlet được nạp bởi container trong suốt quá trình khởi động. •
toàn bộ vòng đời của một servlet, phương thức init() chỉ được gọi một lần.
• Sau quá trình khởi tạo, servlet có thể phục vụ các yêu cầu từ phía client. Mỗi một yêu cầu được phục vụ trong một chuỗi riêng biệt mà nó sở hữu. Bộ chứa gọi phương thức nào được làm và gửi nó đi với một phương thức thích hợp với yêu cầu đẻ xử lý yêu cầu đo. Người phát triển servlet phải cung cấp việc triển khai cho các phương thức này. Nếu một yêu cầu cho phương thức mà không được triển khai bởi servlet, phương thức của lớp cha sẽ được gọi, thường là kết quả của một lỗi được trả lại từ người yêu cầu.
• Cuối cùng, bộ chứa gọi phương thức destroy() để cho container làm cho servlet không thực hiện phục vụ. Phương thức destroy() tương tự như phương thức init() chỉ được gọi một lần trong vòng đời của servlet.
Hình 6-41 : Vòng đời của Servlet
Có thể hiểu vòng đời của một servlet thông qua các phương thức sau: đoạn mã (code) được nạp vào server; sau đó các lớp servlet được thực hiện và khởi tạo; servlet được gọi nhiều lần để xử lý các bản tin đến; cuối cùng servlet được phá hủy.
6.1.2.3 Ngữ cảnh SIP Servlet
Ngữ cảnh servlet được định nghĩa trong đặc tả servlet cũng được áp dụng cho SIP servlet. Đặc tả servlet định nghĩa các thuộc tính ngữ cảnh cụ thể
được sử dụng để lưu trữ và truy nhập thông tin tới SIP servlet và các giao diện từ ngữ cảnh. Ngữ cảnh servlet có thể dùng chung với HTTP servlet trong cùng một ứng dụng.
6.1.2.3.1 SIP Factory
SIP Factory là một lớp xưởng (factory) để tạo các đối tượng chuẩn SIP Servlet cần thiết cho việc thực thi ứng dụng. Giao diện của SIPFactory được sử dụng bởi các servlet để tạo các thực thể của các giao diện khác nhau:
Tên lớp Mô tả
URI, Sip URI, Address có thể tạo ra thông tin địa chỉ bao gồm SIP URI từ một chuỗi.
SipApplicationSession tạo một phiên ứng dụng mới. Nó được gọi khi một SIP Servlet bắt đầu xử lý một tín hiệu SIP mới. Điều đó có nghĩa là các phiên ứng dụng thường được sử dụng trong thời gian khởi động khi một ứng dụng được gọi để khởi chạy nó và nên được sử dụng tiết kiệm.
SipServletRequest sử dụng khi một SIP servlet hoạt động như một UAC
tạo một yêu cầu. Thí dụ như các yêu cầu có thể không được gửi với Proxy.proxyTo. Chúng có thể được gửi với SipServletRequest.send. Nói cách khác:
• Các phương thức creatRequest tạo các thực thể của giao diện SipServletRequest và được sử dụng bởi các ứng dụng UAC khi khởi tạo các yêu cầu trong một hộp thoại mới.
• Khi khởi tạo một chuỗi con các yêu cầu trong hộp thoại đang tồn tại, SipSession.createRequest được sử dụng thay thế.
SIPFactory được đặt trong ngữ cảnh servlet dưới tên mặc định. Ta có thể thực hiện nó với đoạn mã dưới đây:
ServletContext context = getServletContext(); SipFactory factory =
Tất cả các container servlet phải thực hiện một trường hợp của giao diện javax.servlet.sip.SipFactory tồn tại với các servlet thông qua ngữ cảnh có cùng tên, javax.servlet.sip.SipFactory.
6.1.2.3.2 Đường dẫn ngữ cảnh
Servlet API định nghĩa về khái niệm đường dẫn ngữ cảnh. Đây là một tiền tố đường dẫn URL kết hợp với một ứng dụng web. Tất cả các yêu cầu HTTP URL bắt đầu với đường dẫn ngữ cảnh của một ứng dụng web sẽ được định tuyến tới ngữ cảnh servlet tương ứng. Trong khi SIP URIs không có khái niệm về các đường dẫn, các phương thức ServletContext dưới đây không có nghĩa cho các ứng dụng hoặc bộ chứa servlet SIP và phải trở về giá trị rỗng:
ServletContext getContext(String uripath); String getRealPath(String path);
RequestDispatcher getRequestDispatcher(String path);
Để việc nạp tài nguyên được đề cập tới, đường dẫn ngữ cảnh của SIP servlet luôn luôn có “/”. Tổ hợp giữa thực thi ứng dụng HTTP và SIP trong bộ chứa HTTP Servlet, đường dẫn ngữ cảnh được định nghĩa bởi HTTP Servlet API và việc nạp tài nguyên xử lý theo chuẩn Java Servlet [Servlet API].
6.1.2.3.3 Các tham số ngữ cảnh
Các bộ chứa với các chuẩn phải được thực hiện theo các thông số của bảng tham khảo dưới đây với các ứng dụng có ngữ cảnh Servlet:
Thông số Mô tả
javax.servlet.sip.supported Một thực thể không đổi của giao diện java.util.List chứa các tên xâu của phần mở rộng SIP hỗ trợ bởi bộ chứa.
javax.servlet.sip.supportedRfcs Một thực thể không đổi của giao diện java.util.List chứa các số RFC mô tả như xâu của SIP RFC hỗ trợ bởi bộ chứa
javax.servlet.sip.100rel Thông số mà giá trị đề xuất được bộ chứa hỗ trợ phần mở rộng 100rel.
Thông số này không được tán thành trong chuẩn của tham số javax.sip.supported
javax.servlet.sip.SipSessionsUtil Bộ chứa lớp SipSessionUtil cho ID trên cơ sở tìm kiếm thực thể SipApplicationSession javax.servlet.sip.SipFactory Thực thể của các ứng dụng SipFactory
javax.servlet.sip.outboundInterfaces Một thực thể không đổi của giao diện java.util.List chứa trong Sip URI mô tả bởi địa chỉ IP được sử dụng bởi bộ chứa để gửi đi các bản tin
javax.servlet.sip.TimeService Thực thể của lớp TimeService
6.1.2.4 SIPServletRequest và SIPServletResponse
Phương pháp luận yêu cầu–hồi đáp trong SIP cũng tương tự như trong HTTP Servlet. Một yêu cầu được định nghĩa trong đối tượng SipServletRequest và một hồi đáp được định nghĩa trong đối tượng SipServlerResponse. Tuy nhiên, chỉ có một đối tượng ServletRequest hoặc ServletReponse là có giá trị. Điều này là do một yêu cầu SIP không đưa ra một hồi đáp đối xứng. Cũng có một giao diện chung gọi là SipServletMessage cho cả đối tượng SipServletRequest và SipServletResponse. Giao diện SipServletMessage định nghĩa các phương thức chung cho các đối tượng SipServletRequest và SipServletResponse.
Hình 6-42 : Minh họa cấu trúc phân cấp của đối tượng SipServletRequest và SipServletResponse
6.1.2.5 Đóng gói ứng dụng
Các ứng dụng SIP có thể được đóng gói với cùng cấu trúc của các ứng dụng web. Chúng được đóng gói trong định dạng JAR cùng với phần mở rộng là .sar (Sip archive) hoặc .war (web archive).
6.1.2.6 Mô tả triển khai (deployment descriptor)
Một bản mô tả triển khai trên nền XML thường được dùng để mô tả SIP Servlet, các nguyên tắc để khởi tạo chúng cũng như các đặc tính về nguồn tài nguyên và đặc tính môi trường được sử dụng trong ứng dụng. Bản mô tả này nằm trong tập tin sip.xml và cũng giống như tập tin được sử dụng trong HTTP servlet. Sip.xml được định nghĩa bởi một giản đồ XML.
6.1.2.7 Ngữ cảnh hội tụ và ứng dụng hội tụ (converged context – converged application)
Một ứng dụng có thể sử dụng cả SIP Servlet và HTTP Servlet để tạo ra dịch vụ. Để cho phép HTTP và SIP Servlet nằm trong cùng một gói ứng dụng, đặc tả SIP servlet định nghĩa một đối tượng ConvergedContext. Đối tượng này nắm giữ ngữ cảnh servlet chia sẻ bởi cả HTTP và SIP servlet và cung cấp một tầm nhìn ứng dụng chung cho cả SIP và HTTP servlet trong các khái niệm thuộc tính ngữ cảnh servlet, nguồn tài nguyên và JNDI namespaces.
Khi một ứng dụng bao gồm cả SIP và HTTP servlet thì ứng dụng đó có thể được hiểu là ứng dụng hội tụ. Điều này trái ngược với ứng dụng chỉ có SIP được gọi là một ứng dụng SIP. Một ứng dụng hội tụ cũng tương tự như một ứng dụng SIP về cấu trúc ngoại trừ nó có thêm tập tin web.xml như là một bản mô tả triển khai thêm vào một tập tin sip.xml. Trong SIP Servlet API 1.1 (JSR289), khái niệm ứng dụng hội tụ có thể được mở rộng để bao hàm cả các ứng dụng thương mại. Một ứng dụng thương mại có thể được gọi là ứng dụng hội tụ.
6.1.2.8 Phiên SIP
Đặc tả SIP Servlet định nghĩa các đối tượng SipSession để thể hiện một phiên thông qua SIP trong cùng một cách với HttpSession để thể hiện phiên thông làm việc thông qua HTTP. Bởi vì một ứng dụng đơn như ứng dụng hội tụ có thể thực hiện một phiên thông qua cả HTTP và SIP, đặc tả này có thể định nghĩa SipApplicationSession là một đối tượng session ở mức ứng dụng. Đối tượng SipApplicationSession có thể hoạt động như một lớp cha với các phiên HTTP và SIP trong một ứng dụng. SipApplicationSession phục vụ hai mục đích: cung cấp kho chứa dữ liệu cho ứng dụng và phối hợp