2012-04-04 17 views
65

बिना प्रिंट नौकरी को संभाल सकता है, मैं PrintServiceLookup से जूझ रहा हूं; शुरुआती रन-इन के साथ हमारे आवेदन में प्रिंटर का पता लगाने के लिए lookupPrintServices(DocFlavor flavor, AttributeSet attributes) विधि अत्यधिक धीमी है। 100 से अधिक नेटवर्क प्रिंटर वाले ग्राहकों ने सूचित किया है कि इस कोड को निष्पादित करने वाले व्यवहार को पहली बार चलाने पर खराब प्रदर्शन किया जा रहा है।यह निर्धारित करना कि कोई प्रिंटर बिना प्रिंट-अप

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

मेरे पास वर्तमान में उनका पर्यावरण नहीं है और यह नहीं देख सकता कि सटीक प्रदर्शन समस्या क्या हो रही है।

मैं एक PrintServiceDocFlavor और AttributeSet की लुक-अप प्रदर्शन कर दिए गए MediaSizeName बिना समर्थन करता है तो देखने के लिए कोशिश कर रहा हूँ।

private static final PrintService[] PRINTSERVICES = 
    PrintServiceLookup.lookupPrintServices(null, null); 

private static final PrintService DEFAULTSERVICE = 
    PrintServiceLookup.lookupDefaultPrintService(); 

और फिर, PrintService और MediaSizeName ग्राहक के अनुरोध से प्राप्त: तो मैं सभी उपलब्ध PrintService रों और डिफ़ॉल्ट PrintService खींच। अंत में, मैं PrintService अगर MediaSizeName द्वारा समर्थित है पूछना:

private void checkPrintServiceForMediaSize(PrintService pservice) throws MediaSizeNotSupportedException{ 
    if(!pservice.isAttributeValueSupported(_mediaSizeName,null,null)) 
      throw new MediaSizeNotSupportedException("This media size is not supported by the selected printer."); 
    } 

API वाणी जब isAttributeValueSupported(Attribute attrval,DocFlavor flavor,AttributeSet attributes) अशक्त DocFlavor और AttributeSet साथ कहा जाता है

इस विधि बताता है इस प्रिंट सेवा दी मुद्रण का समर्थन करता है कि क्या डॉक्टर स्वाद के कुछ संभावित संयोजन और गुणों के सेट के लिए विशेषता मान

और हेक्टेयर अब तक सही ढंग से व्यवहार किया है। हालांकि, अगर मैं प्रिंटर किसी चयनित पृष्ठ आकार का समर्थन करता है तो यह पूरी तरह से सुनिश्चित नहीं है कि यह करने का तरीका है।

मैं इस मुद्दे पर आपकी प्रतिक्रिया और अनुभव की सराहना करता हूं।


अद्यतन

समय मैं अपने दृष्टिकोण को लागू किया आसपास, मेरे कार्य केंद्र गंभीर नेटवर्क समस्याओं का फैसला किया है, जो मुझे कुछ समय ले लिया यह पता लगाने की। अंत में, मेरे कार्यान्वयन का परीक्षण नेटवर्किंग टूल SoftPerfect Connection Emulator (नेटवर्क लोड अनुकरण करने के लिए) के साथ किया गया है और परिणामों में उल्लेखनीय सुधार नहीं हुआ है।

मैं इस प्रश्न का परीक्षण और अद्यतन जारी रखूंगा। उम्मीद है कि मैं एक समाधान पा सकता हूं और इसे यहां लोगों के साथ साझा कर सकता हूं। मुझे लगता है कि प्रारंभिक देखने अनुमान लगा रहा हूँ:

private static final PrintService[] PRINTSERVICES = 
    PrintServiceLookup.lookupPrintServices(null, null); 

अभी भी समस्याएं आ रही हैं।


अद्यतन 2

बीटा निर्माण अंत में ग्राहक वातावरण और मुद्रण संवाद के प्रदर्शन पर परीक्षण किया जाता है में सुधार के बारे में 5 बार है (प्रिंटर की प्रारंभिक पुल अब एक ही के तहत लगभग 1 मिनट लेता है पर्यावरण लगभग 5 मिनट की तुलना में)। फिर भी प्रारंभिक प्रतीक्षा समय स्वीकार्य समय नहीं है, हालांकि, अब मैं सबसे अच्छा कर सकता हूं। हमने क्लाइंट से यह भी सुना है कि एक प्रिंट सर्वर का उपयोग किया जा रहा है और टिप्पणियों (@ वार्डी) में दिए गए सुझावों का पालन करते हुए, मैं इस दिशा में आगे बढ़ रहा हूं। उम्मीद है कि हम प्रिंट सर्वर के फायदों का लाभ उठा सकते हैं।

+3

क्या आप स्टार्टअप पर एक अलग थ्रेड में वास्तविक लुकअप कर सकते हैं? – eabraham

+2

@ इब्राहम जैसा कि मैंने बताया है कि स्टार्टअप पर एक डमी लुकअप किया गया है। किए जाने वाले सभी लुकअप उपयोगकर्ता इनपुट पर निर्भर करते हैं। – arin

+8

क्या आपने यह देखने के लिए प्रोफाइल किया है कि समय कहां बिताया गया है? मेरा अनुमान है कि खराब DNS-सर्वर एंट्री के साथ संयुक्त रूप से विभिन्न प्रकार के होस्ट नाम लुकअप पर बहुत समय व्यतीत होता है। –

उत्तर

0

यदि प्रिंटर की सूची एलडीएपी में संग्रहीत की जाती है, तो आप LDAP का उपयोग कर प्रिंटर को देखने का प्रयास कर सकते हैं।

2

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

मुझे लगता है कि नेटवर्क प्रिंटर और उनकी क्षमताएं अक्सर बदलती नहीं हैं लेकिन आपको अंततः कैश को अपडेट करना होगा, लेकिन "कौन" और "कब" आपके पर्यावरण पर निर्भर है।

कैश के अपडेट क्लाइंट द्वारा किए जा सकते हैं जो पृष्ठभूमि में आपकी वर्तमान खोज चलाता है और यदि परिवर्तनों का पता चला है तो कैश अपडेट करता है। यदि आपके पास एक केंद्रीय घटक है जो लगातार चल रहा है, तो यह एक अच्छी जगह होगी जहां आप निश्चित अंतराल में जांच सकते हैं।

यदि आपके पास किसी प्रकार की निर्देशिका सेवा है तो आप प्रत्येक प्रिंटर से संपर्क करने से पहले अपने प्रिंटर की सूची की तुलना कर सकते हैं ताकि नेटवर्क और सीपीयू लोड को कम करने के लिए अपनी क्षमताओं को प्राप्त किया जा सके।

+0

मुझे यकीन नहीं है कि http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6278300 के कारण MediaSizeName की आक्रामक कैशिंग संभव है – nevets1219

संबंधित मुद्दे