2011-01-02 8 views
5

Tôi thấy mình một lần nữa và một lần nữa phải đối mặt với một vấn đề tương tự: có một số đoạn mã xử lý dữ liệu khi nó đến từ người dùng/mạng/sản xuất của một số loại. Vì lý do hiệu quả, tôi không muốn gọi số flush() hoặc commit() trên mọi phần dữ liệu mà tôi nhận được, nhưng thỉnh thoảng.lưu/tuôn ra/cam kết định kỳ - có tên cho mẫu này không?

Tôi thường đưa ra với mã như thế này:

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(); 
    } 
} 

tôi nhận được cảm giác khác biệt mà tôi reinventing the wheel mỗi khi tôi viết những dòng này, và còn gì nữa, tôi liên tục thay đổi thứ mỗi khi tôi viết loại mã này, tùy thuộc vào các phần khác nhau có ý nghĩa trong ngữ cảnh cụ thể hay không.

Dường như với tôi rằng đây là một mẫu rất phổ biến, nhưng tôi không nhớ thấy nó được đặt tên hoặc triển khai như một tiện ích thư viện. Miễn là tôi phải thực hiện điều này bản thân mình, tôi tiếp tục phải đối mặt với phân tích tê liệt bất cứ khi nào tôi reimplement nó. Làm ơn giúp tôi!

CẬP NHẬT: Sau khi tôi đã viết điều này, tôi nhận ra rằng tôi đã không chiếm bộ đệm trước khi JVM tắt, vì vậy tôi đã thêm một móc tắt trong hàm khởi tạo. Bây giờ tôi đã nhận ra rằng mã này sẽ vẫn không hoạt động đúng nếu tắt máy xảy ra ít hơn MIN_SAVE_PERIOD mili giây sau lần lưu cuối cùng, vì vậy tôi có lẽ nên refactor saveData. Điều đó một lần nữa lại xảy ra.

Trả lời

2

Mã của bạn đã nói: nó được gọi là đệm.

+0

Googling "mẫu đệm" và "thành ngữ đệm" không tạo ra bất kỳ kết quả thú vị nào. Đây có phải vì đó là một mẫu không thú vị? – itsadok

+0

Wikipedia dường như có định nghĩa chung tốt: http://en.wikipedia.org/wiki/Data_buffer –