2009-03-24 9 views
6

Tôi đã viết một máy chủ Thrift trong Java để tận dụng lợi thế của một gói Java/thư viện cụ thể, nhưng tôi không phải là một lập trình viên java.Tải trước các lớp/thư viện java khi khởi động jar?

Vấn đề là; Tôi thấy một thời gian chờ cho cuộc gọi RPC đầu tiên đến máy chủ. Các yêu cầu tiếp theo được thực hiện mà không có bất kỳ vấn đề nào và chỉ các khách hàng ảnh hưởng của nó được viết bằng một số ngôn ngữ nhất định (nhưng cần thiết).

Suy nghĩ hiện tại của tôi là máy chủ hết thời gian chờ phản hồi bởi vì khi gọi đầu tiên nó phải tải tất cả các thư viện cần thiết cho yêu cầu. Một số ứng dụng khách của Thrift phải xử lý hết thời gian chờ hơn những người khác, có thể giữ yêu cầu mở lâu hơn một chút.

Có cách nào trong java để tải trước các thư viện tôi đang sử dụng khi lần đầu tiên tôi bắt đầu tệp .jar để không có sự chậm trễ về yêu cầu đầu tiên không?

Giải pháp: Tôi gặp vấn đề (và một số vấn đề khác được nêu ra) bằng cách tăng thời gian chờ từ (các) khách hàng tiết kiệm. Tuy nhiên, tôi đã thực hiện câu trả lời tĩnh/Class.forName cũng để giúp mọi thứ cùng, hoạt động tốt. Cảm ơn!

+0

Bạn có thể xem qua một số trình tải trước lớp Java hiện có (https://github.com)/jermainexu/ClassPreloader). – StarPinkER

Trả lời

3

Bạn có thể chạy tải trước khi máy chủ hoạt động. Bạn chưa chỉ rõ cách bạn đang nạp máy chủ, các lớp và môi trường là gì, nhưng bạn có thể tận dụng thực tế là một trình khởi tạo tĩnh lớp sẽ chạy khi lớp được nạp. Vì vậy, nếu bạn đang chạy từ phương thức "chính", lớp học của bạn có thể trông giống như thế này

public class Foo { 

    static { 
    //this will be run when the class is loaded 
    try { Class.forName("fully.qualified.class.name.that.i.want.to.Load"); } 
    catch ... 
    } 

    public static void main (string args[]) 
    { 
    //run my server... 
    } 
} 
+0

Giải pháp này rất dễ vỡ. Một giải pháp tốt hơn là làm một hành động giả trước khi tay sẽ tải tất cả các lớp cần thiết. Một cái gì đó như 'sendRequest ("/dev/null ")' sẽ là tốt. Nhưng ý tưởng cơ bản là ổn. –

2

Một điều bạn có thể muốn thử là viết một máy khách đơn giản bên trong chính máy chủ Java. Máy khách này không làm gì ngoài việc gọi một số phương thức trong máy chủ khi nó khởi động, buộc các lớp được nạp. Sau khi máy khách nhỏ này nhận được kết quả (hoặc gọi lại), thì nó sẽ đặt máy chủ vào trạng thái "có thể truy cập bởi thế giới bên ngoài".

0

Tôi đề xuất giả mạo kết nối ngay trước khi mở máy chủ. Điều đó sẽ đảm bảo rằng (hầu hết) khởi tạo lười biếng có liên quan sẽ được thực hiện.