2010-07-18 27 views
5

Tôi đang gặp khó khăn khi cấu hình Restlet cho mã phía máy khách của mình. Tôi đang sử dụng Restlet 2 và HttpClient 4. Tôi đã thêm jar mở rộng và các lọ HttpClient vào đường dẫn xây dựng và dường như nó hoạt động.Định cấu hình HttpClient để sử dụng làm máy khách Restlet

Tuy nhiên, tôi không biết cách định cấu hình chi tiết. Tôi không tạo bất kỳ khách hàng nào theo cách thủ công, thay vào đó tôi sử dụng ClientResource giây cho các tương tác, đây là phần duy nhất tôi sử dụng Restlet trực tiếp. Sự khởi tạo cụ thể của khách hàng dường như bị ẩn trong việc thực hiện khung công tác. Tôi tìm thấy một số gợi ý làm thế nào tôi có thể cấu hình máy khách, nhưng tất cả chúng đều được viết cho Restlet 1.x.

Cụ thể, tôi muốn cấu hình các phần sau đây:

  • Thay đổi User Agent cho các yêu cầu của khách hàng. clientResource.getClientInfo().setAgent(…) không hoạt động.
  • Tăng số lượng kết nối song song trên mỗi máy chủ.
  • Bật kết nối liên tục và tổng hợp trên mỗi máy chủ lưu trữ. Rõ ràng, Restlet cho đến nay tạo ra một kết nối mới cho mỗi ClientResource, mà không thực sự hiệu quả.

Tất nhiên, tôi đã xem HttpClientHelper, nhưng tôi không biết ở đâu và cách thêm. Đã tìm kiếm tài liệu cho điều đó, nhưng không có lần truy cập nào.

Cảm ơn bạn đã trợ giúp!

+2

Tôi khuyên bạn nên đăng câu hỏi này trên danh sách gửi thư thảo luận Restlet (http://restlet.tigris.org/ds/viewForums.do). Restlet 2.0 sẽ được phát hành trong vài ngày tới, vì vậy nó có thể đáng báo cáo nếu có lỗi. – Bruno

+0

Tôi đồng ý với Bruno. Nó sẽ là tốt để xem những gì các nhà phát triển Restlet nghĩ về điều này. Bạn đúng về sự thiếu hiệu quả của hành vi 'ClientResource' mặc định và vấn đề an toàn thread làm trầm trọng thêm nó. – laz

+0

Có vẻ như câu hỏi đã được đặt ra: http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2635381 – laz

Trả lời

4

Trước tiên, để đảm bảo rằng bạn Restlet sử dụng HttpClient của Apache cho các kết nối, bạn cần có org.restlet.ext.httpclient.jar trên đường dẫn lớp. Thứ hai, Bạn có đang chuyển số Context vào hàm tạo của ClientResource không? Nếu không, bạn sẽ cần phải:

final Context context = new Context(); 
    context.getParameters().set("maxConnectionsPerHost", "20"); 

    final ClientResource requestResource = new ClientResource(context, "http://localhost:8182/request"); 
    requestResource.getClientInfo().setAgent("Example-Client/1.0"); 

đó sẽ chăm sóc của maxConnectionsPerHost thiết lập mà bạn quan tâm ở Đồng thời, kêu gọi setAgent đang làm việc như mong đợi đối với tôi.. Tôi không chắc chắn những gì có thể là vấn đề trong trường hợp của bạn.

Liên quan đến các kết nối liên tục, có vẻ như HttpClient đảm nhiệm điều đó cho bạn. Restlet sử dụng của HttpClient ThreadSafeClientConnManager được mô tả here. Nó đề cập đến hỗ trợ cho các kết nối liên tục tại liên kết đó. Dường như đối tượng này cũng sẽ chăm sóc các mối quan tâm gộp chung của bạn. Bạn sẽ muốn sử dụng lại cùng một phiên bản ClientResource để tận dụng điều này. Tôi không biết ngay chính sách an toàn chủ đề của an toàn của ClientResource nhưng tôi hy vọng rằng đó là an toàn chỉ.

+0

Cảm ơn câu trả lời của bạn. Rất tiếc, việc đặt tác nhân người dùng vẫn không hoạt động và http://www.restlet.org/documentation/2.0/jse/api/org/restlet/resource/ClientResource.html nói rằng ClientResources không được thiết kế để được chia sẻ giữa nhiều luồng, điều này thực sự rất tệ. –

+1

Tôi nên chỉ cần đọc Javadoc! Tôi tìm thấy một cái gì đó thú vị mà có thể không phải là một tác dụng phụ dự định của việc sử dụng 'ClientResource'. Sau khi thực hiện một yêu cầu với cá thể 'ClientResource', kết quả của' requestResource.getNext() 'sẽ trả về đối tượng' Client' được sử dụng để thực hiện cuộc gọi. Bạn có thể lưu tham chiếu đến đối tượng đó và tái sử dụng nó trong tương lai 'ClientResources' bằng cách cung cấp cho' setNext (Uniform next) '. Vì 'Client' đóng gói tất cả các đối tượng HttpClient bạn sẽ lưu vào việc tái tạo tất cả các đối tượng đó. Tôi không chắc chắn có bao nhiêu một sự lạm dụng mà cách tiếp cận sẽ được! – laz

+0

Bí quyết đó thực sự hoạt động đối với một số yêu cầu đồng thời. Tuy nhiên, nếu số lượng yêu cầu tăng lên và có nhiều yêu cầu hơn so với kết nối, nó bắt đầu ném một số ngoại lệ bên trong một cách ngẫu nhiên. Vì vậy, tôi muốn một giải pháp chính thức. Tuy nhiên cảm ơn cho gợi ý của bạn. –

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