2009-03-24 9 views
6

मैंने जावा में एक विशिष्ट जावा पैकेज/लाइब्रेरी का लाभ उठाने के लिए एक थ्रिफ्ट सर्वर लिखा है, लेकिन मैं जावा प्रोग्रामर नहीं हूं।जार स्टार्टअप पर जावा क्लास/लाइब्रेरी प्रीलोडिंग?

समस्या है; मैं सर्वर पर पहली आरपीसी कॉल के लिए टाइम-आउट देख रहा हूं। बाद के अनुरोध किसी भी मुद्दे के बिना निष्पादित किए जाते हैं, और यह केवल कुछ (लेकिन आवश्यक) भाषाओं में लिखे गए ग्राहकों को प्रभावित करता है।

मेरा वर्तमान विचार यह है कि प्रतिक्रिया पर सर्वर समय-समय पर होता है क्योंकि पहले कॉल पर इसे अनुरोध के लिए आवश्यक सभी पुस्तकालयों को लोड करना होता है। कुछ थ्रिफ्ट क्लाइंट कार्यान्वयन दूसरों के मुकाबले बेहतर समय-समय पर संभालना चाहिए, संभवतः अनुरोध को थोड़ी देर तक खोलना चाहिए।

क्या जावा में लाइब्रेरी को प्रीलोड करने का कोई तरीका है जिसका उपयोग मैं पहली बार .jar फ़ाइल शुरू करता हूं, इसलिए पहले अनुरोध पर देरी नहीं होती है?

समाधान: मुझे ट्र्रिफ्ट क्लाइंट (ओं) से टाइमआउट बढ़ाने के द्वारा समस्या (और कुछ और उठाए गए) के आसपास मिल गया। हालांकि, मैंने स्टैटिक/क्लास .forName उत्तर भी चीजों की मदद करने के लिए लागू किया है, जो बहुत अच्छा काम करता है। धन्यवाद!

+0

आप कुछ मौजूदा [जावा वर्ग preloader] पर एक नज़र लेने के लिए चाहते हो सकता है (https://github.com ऐसा दिखाई दे सकता/jermainexu/ClassPreloader)। – StarPinkER

उत्तर

3

सर्वर बनने से पहले आप लोड लोड कर सकते हैं। आपने यह निर्दिष्ट नहीं किया है कि आप सर्वर, कक्षाएं और पर्यावरण क्या लोड कर रहे हैं, लेकिन आप इस तथ्य का लाभ उठा सकते हैं कि वर्ग लोड होने पर कक्षा स्थिर प्रारंभकर्ता चलाएगा। इसलिए, यदि आप एक "मुख्य" विधि से चला रहे हैं, अपने वर्ग कुछ

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

यह समाधान नाजुक है। एक बेहतर समाधान हाथ से पहले एक डमी कार्रवाई करना है जो सभी आवश्यक वर्गों को लोड करेगा। 'SendRequest ("/dev/null ") जैसे कुछ अच्छा होगा। लेकिन मूल विचार ठीक है। –

2

एक चीज जिसे आप कोशिश करना चाहते हैं वह जावा सर्वर के अंदर एक साधारण क्लाइंट लिख रहा है। क्लाइंट लोड होने के लिए मजबूर होने पर यह क्लाइंट कुछ भी नहीं करता है, लेकिन सर्वर में कुछ विधि कॉल करता है। इस छोटे ग्राहक को परिणाम (या कॉलबैक) मिलने के बाद, यह सर्वर को "बाहरी दुनिया द्वारा सुलभ" स्थिति में डाल देता है।

0

मैं सर्वर खोलने से ठीक पहले कनेक्शन बनाने का सुझाव देता हूं। यह सुनिश्चित करेगा कि (सबसे) प्रासंगिक आलसी प्रारंभिक प्रदर्शन किया जाएगा।