2008-10-01 16 views
9

मेरे पास डेटा के साथ एक अस्थायी फ़ाइल है जो एक एमओओएम बाइनरी अटैचमेंट के माध्यम से एसओएपी प्रतिक्रिया के हिस्से के रूप में वापस आती है। जैसे ही विधि कॉल "समाप्त होता है" जैसे ही मैं इसे मिटा देना चाहता हूं (यानी, स्थानांतरित करना समाप्त हो जाता है)। ऐसा करने के लिए मेरे लिए सबसे अच्छा तरीका क्या है? सत्र को नष्ट होने पर उन्हें हटाने का सबसे अच्छा तरीका यह है कि मुझे यह कैसे करना है, लेकिन मुझे यकीन नहीं है कि ऐसा करने के लिए 'तत्काल' तरीका है या नहीं।टॉमकैट 6: वेब विधि कॉल समाप्त होने के बाद अस्थायी फ़ाइलों को कैसे हटाया जाए?

एफवाईआई, मैं एक्सिस का उपयोग नहीं कर रहा हूं, अगर मैं मायने रखता हूं तो मैं जैक्स-डब्ल्यू का उपयोग कर रहा हूं।

अद्यतन: मुझे यकीन नहीं है कि उत्तरकर्ता वास्तव में इस मुद्दे को समझ रहे हैं। मुझे पता है कि जावा में एक फाइल को कैसे हटाया जाए। मेरी समस्या यह है:

@javax.jws.WebService 
public class MyWebService { 
... 

@javax.jws.WebMethod 
public MyFileResult getSomeObject() { 
    File mytempfile = new File("tempfile.txt"); 
    MyFileResult result = new MyFileResult(); 
    result.setFile(mytempfile); // sets mytempfile as MTOM attachment 

    // mytempfile.delete() iS WRONG 
    // can't delete mytempfile because it hasn't been returned to the web service client 
    // yet. So how do I remove it? 

    return result; 
} 
} 

उत्तर

15

मैं इसी समस्या में भाग गया। मुद्दा यह है कि जेएक्स-डब्ल्यूएस स्टैक फ़ाइल का प्रबंधन करता है। जब आपके पास JAX-WS फ़ाइल के साथ किया जाता है तो आपके कोड में निर्धारित करना संभव नहीं है, इसलिए आपको यह नहीं पता कि इसे कब हटाना है।

मेरे मामले में, मैं एक फ़ाइल के बजाए अपने ऑब्जेक्ट मॉडल पर डेटाहैंडलर का उपयोग कर रहा हूं। MyFileResult बजाय एक फ़ाइल क्षेत्र के निम्नलिखित क्षेत्र होगा:

private DataHandler handler; 

मेरे समाधान FileDataSource का अनुकूलित संस्करण बनाने के लिए किया गया था।

private class TemporaryFileInputStream extends FileInputStream { 
    public TemporaryFileInputStream(File file) throws FileNotFoundException { 
     super(file); 
    } 

    @Override 
    public void close() throws IOException { 
     super.close(); 
     file.delete(); 
    } 
} 

अनिवार्य रूप से डेटा स्रोत केवल एक बार पढ़ने की अनुमति देता है: इसके बजाय एक FileInputStream लौटने फ़ाइल की सामग्री को पढ़ने के लिए की, मैं FileInputStream की निम्न विस्तार लौट आते हैं। स्ट्रीम बंद होने के बाद, फ़ाइल हटा दी जाती है। चूंकि जेएक्स-डब्ल्यूएस स्टैक केवल फाइल को एक बार पढ़ता है, यह काम करता है।

समाधान एक हैक का थोड़ा सा है लेकिन इस मामले में सबसे अच्छा विकल्प प्रतीत होता है।

+0

मुझे यह समाधान पसंद है! मेरा हैक फ़ाइल को एक सत्र चर में जोड़ना था, और उसके बाद उपयोगकर्ता का सत्र समाप्त होने पर फ़ाइल को हटाने के लिए। मैंने अंतिम रूप में फ़ाइल को हटाने के लिए एक अतिरिक्त जांच भी की है()। –

0

क्या आप मानक जावा temp फ़ाइलों का उपयोग कर रहे हैं? यदि ऐसा है, तो आप यह कर सकते हैं:

File script = File.createTempFile("temp", ".tmp", new File("./")); 
... use the file ... 
script.delete(); // delete when done. 
+0

क्षमा करें, शायद मुझे और अधिक विशिष्ट होना चाहिए था। मैं किस बिंदु पर फाइल को हटा सकता हूं? मैं सीधे अपने @WebMethod एनोटेटेड फ़ंक्शन में नहीं जा सकता क्योंकि वेब विधि प्रतिक्रिया अभी तक वापस नहीं की गई है। –

0

जो कार्य फ़ोल्डर आपने इस वेबपैप के संदर्भ में स्थापित किया है, जिसके बारे में आप बात कर रहे हैं। क्या आप इस कार्य निर्देशिका को एक ज्ञात निर्देशिका में सेट कर सकते हैं? यदि हां, तो आप अस्थायी कार्य निर्देशिका (जिसे आप जानते हैं) के भीतर temp फ़ाइल पा सकते हैं। एक बार जब आप पाते हैं, तो आप इसे हटा सकते हैं।