2013-10-10 29 views
1

我有一個外部REST API處理將數據存儲在「數據存儲」中。多個捲曲會導致Windows上的「打開的文件太多」錯誤

在文件上傳時,它們是一個Ruby庫,它調用此API並將其傳遞給數據數組,然後通過外部API將其存儲在數據庫中。

我嘗試將小數組數組傳遞給API,以便在任何捲曲調用中限制後主體內容長度。

庫調用看起來像這樣

def add_data(table_name, table_data) 

    url = "#{ExternalAPI::URL}/addData" 
    m_curl = Curl::Multi.new 

    begin 

    chunks = table_data.each_slice(ExternalAPI::BATCH_SIZE).to_a 

    chunks.each do |data_chunk| 

     data = { 
      "tableName" => table_name, 
      "data"  => data_chunk 
     }.to_json 

     curl = Curl::Easy.new(url) 
     curl.headers = {} 
     curl.headers['Content-type'] = 'text/plain' 
     curl.timeout = 300 
     curl.post_body = data 
     m_curl.add(curl) 
    end 

    m_curl.perform 
    true 

    rescue Exception => e 
    puts "Curl Failed #{e.message}" 
    puts "#{e.backtrace}" 
    Rails.logger.error "Curl Failed #{e.message}" 
    return false 
    end 

end 

這會導致過多的開放連接錯誤的WEBrick發展模式。 我假設Multi::Curl要麼重新連接的連接,但我不知道這是否發生在內部。

我也嘗試在for循環中創建一個新的curl連接,並在循環結束時關閉它(我知道它效率低下),但它仍導致相同的錯誤。

任何人都可以請擺脫這一點?

回答

0

我認爲Multi::Curl會嘗試同時執行所有連接。您可能需要將它們分批到較小的組中。