2011-01-02 13 views
5

मुझे खुद को एक बार फिर से एक ही समस्या का सामना करना पड़ता है: कोड का कुछ टुकड़ा है जो डेटा को संसाधित करता है क्योंकि यह उपयोगकर्ता/नेटवर्क/किसी प्रकार के उत्पाद से आता है। दक्षता कारणों से, मैं प्राप्त होने वाले प्रत्येक भाग पर flush() या commit() पर कॉल नहीं करना चाहता, लेकिन केवल कभी-कभी।आवधिक बचत/फ्लश/प्रतिबद्ध - क्या इस पैटर्न का नाम है?

मैं आमतौर पर इस तरह कोड के साथ आते हैं:

class Processor { 
    private final static MAX_SAVE_PERIOD = 60000; 
    private final static MIN_SAVE_PERIOD = 20000; 

    private final static int MAX_BUFFER = 10000; 
    Arraylist<Data> dataBuffer = new Arraylist<Data>(); 

    private long lastSave = 0; 

    public Saver() { 
     new Timer().schedule(new TimerTask() { 
      periodicSave(); 
     }, MAX_SAVE_PERIOD, MAX_SAVE_PERIOD); 
     Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
      public void run() { 
       periodicSave(); 
      } 
     })); 
    } 

    public synchronized void processData(Data data) { 
     dataBuffer.add(data); 
     if(dataBuffer.size() >= MAX_BUFFER) { 
      saveData(); 
     } 
    } 

    private synchronzied void periodicSave() { 
     if(!dataBuffer.isEmpty()) { 
      saveData(); 
     } 
    } 

    private void saveData() { 
     if (System.currentTimeMillis() - lastSave < MIN_SAVE_PERIOD) return; 

     ...   

     lastSave = System.currentTimeMillis(); 
    } 
} 

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

ऐसा लगता है कि यह एक बहुत ही आम पैटर्न है, लेकिन मुझे इसे लाइब्रेरी उपयोगिता के रूप में नामित या लागू करने को याद नहीं है। जब तक मुझे इसे स्वयं लागू करना है, जब भी मैं इसे पुन: कार्यान्वित करता हूं, मुझे विश्लेषण पक्षाघात का सामना करना पड़ता है। कृपया मेरी मदद करें!

अद्यतन: के बाद मैं इस लिखा था, मुझे एहसास हुआ कि मैं JVM बंद से पहले बफर निस्तब्धता के लिए जिम्मेदार नहीं किया है, इसलिए मैं कंस्ट्रक्टर में बंद हुक गयी। अब मुझे एहसास हुआ है कि अंतिम कोड के बाद MIN_SAVE_PERIOD मिलीसेकंड से कम होने पर यह कोड अभी भी ठीक से काम नहीं करेगा, इसलिए मुझे शायद saveData रिफैक्टर करना चाहिए। यह फिर से हो रहा है।

उत्तर

2

आपका कोड पहले से ही यह कहता है: इसे बफर कहा जाता है।

+0

गुगलिंग "बफरिंग पैटर्न" और "बफरिंग मुहावरे" किसी भी रोचक परिणाम का उत्पादन नहीं करता है। क्या ऐसा इसलिए है क्योंकि यह एक अनिच्छुक पैटर्न है? – itsadok

+0

विकिपीडिया की एक अच्छी सामान्य परिभाषा प्रतीत होती है: http://en.wikipedia.org/wiki/Data_buffer –

2

निर्माता/उपभोक्ता एक बाध्य बफर के माध्यम से। Producer consumer problem देखें।

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