2015-07-20 6 views
5

मेरे पास कुछ सौ हजार यूआरएल हैं जिन्हें मुझे कॉल करने की आवश्यकता है। ये एक एप्लिकेशन सर्वर पर कॉल हैं जो उन्हें संसाधित करेंगे और एक तालिका में स्टेटस कोड लिखेंगे। मुझे प्रतिक्रिया (सफलता/असफल) की प्रतीक्षा करने की आवश्यकता नहीं है, केवल सर्वर को अनुरोध मिला है। मैं यह भी निर्दिष्ट करने में सक्षम होना चाहता हूं कि एक साथ कई समवर्ती नौकरियां कैसे चल रही हैं क्योंकि मैंने काम नहीं किया है कि टॉमकैट कितने समवर्ती अनुरोधों को संभाल सकता है।मैं सूची से कई यूआरएल को असीमित रूप से कैसे कॉल कर सकता हूं

यहां तक ​​कि मैंने जो कुछ हासिल किया है, मूल रूप से किसी और के प्रयास से लिया गया है, केवल यूआरएल कॉल के साथ नहीं। टेक्स्ट फ़ाइल में प्रत्येक यूआरएल अपनी लाइन पर होती है। यूआरएल इस तरह दिखता है:

http://webserver:8080/app/mwo/services/create?server=ServerName&e1user=admin&newMWONum=123456&sourceMWONum=0&tagNum=33-A-1B 

और कोड:

$maxConcurrentJobs = 10 
$content = Get-Content -Path "C:\Temp\urls.txt" 

foreach ($url in $content) { 
    $running = @(Get-Job | Where-Object { $_.State -eq 'Running' }) 
    if ($running.Count -le $maxConcurrentJobs) { 
     Start-Job { 
      Invoke-WebRequest -UseBasicParsing -Uri $using:url 
     } 
    } else { 
     $running | Wait-Job -Any 
    } 
    Get-Job | Receive-Job 
} 

समस्याओं मैं आ रही है कि यह प्रति "नौकरी" 2 त्रुटियों दे रहा है और मुझे यकीन है कि क्यों नहीं कर रहा हूँ है। जब मैं url सरणी $ सामग्री को डंप करता हूं तो यह ठीक दिखता है और जब मैं अपना Invoke-WebRequest एक-एक करके चलाता हूं तो वे बिना त्रुटि के काम करते हैं।

126 Job126   BackgroundJob Running  True   localhost   ...     
Invalid URI: The hostname could not be parsed. 
    + CategoryInfo   : NotSpecified: (:) [Invoke-RestMethod], UriFormatException 
    + FullyQualifiedErrorId : System.UriFormatException,Microsoft.PowerShell.Commands.InvokeRestMethodComman 
    d 
    + PSComputerName  : localhost 

Invalid URI: The hostname could not be parsed. 
    + CategoryInfo   : NotSpecified: (:) [Invoke-RestMethod], UriFormatException 
    + FullyQualifiedErrorId : System.UriFormatException,Microsoft.PowerShell.Commands.InvokeRestMethodComman 
    d 
    + PSComputerName  : localhost 

कोई भी सहायता या वैकल्पिक कार्यान्वयन की सराहना की जाएगी। मैं पावरहेल का उपयोग न करने के लिए खुला हूं, लेकिन मैं विंडोज 7 डेस्कटॉप या विंडोज 2008 आर 2 सर्वर तक सीमित हूं, और शायद मैं नेटवर्क विलंब पर कटौती करने के लिए यूआरएल में लोकलहोस्ट का उपयोग कर सर्वर पर अंतिम स्क्रिप्ट चला रहा हूं।

उत्तर

7

नौकरियों के साथ आपको बड़ी मात्रा में ओवरहेड होता है, क्योंकि प्रत्येक नई नौकरी एक नई प्रक्रिया पैदा करती है।

इसके बजाय Runspaces का उपयोग करें!

$maxConcurrentJobs = 10 
$content = Get-Content -Path "C:\Temp\urls.txt" 

# Create a runspace pool where $maxConcurrentJobs is the 
# maximum number of runspaces allowed to run concurrently  
$Runspace = [runspacefactory]::CreateRunspacePool(1,$maxConcurrentJobs) 

# Open the runspace pool (very important) 
$Runspace.Open() 

foreach ($url in $content) { 
    # Create a new PowerShell instance and tell it to execute in our runspace pool 
    $ps = [powershell]::Create() 
    $ps.RunspacePool = $Runspace 

    # Attach some code to it 
    [void]$ps.AddCommand("Invoke-WebRequest").AddParameter("UseBasicParsing",$true).AddParameter("Uri",$url) 

    # Begin execution asynchronously (returns immediately) 
    [void]$ps.BeginInvoke() 

    # Give feedback on how far we are 
    Write-Host ("Initiated request for {0}" -f $url) 
} 

के रूप में जुड़ा हुआ ServerFault पोस्ट में बताया गया है, तो आप भी एक अधिक सामान्य समाधान, Invoke-Parallel, जो मूल रूप से ऊपर

+0

इस पूरी तरह से काम करता है की तरह उपयोग कर सकते हैं। धन्यवाद! – trueimage

+0

@ mathias-r-jessen वास्तव में कोई प्रतिक्रिया है जो आप प्रतिक्रिया जांच में डाल सकते हैं जो असीमित रूप से चल रहा है? इस कार्यान्वयन में समवर्ती नौकरियों की सीमा वास्तव में कुछ भी नहीं करती है क्योंकि यह केवल सभी यूआरएल को कॉल करती है। मुझे यह सुनिश्चित करने की ज़रूरत है कि कम से कम एक कोड 200 प्राप्त हो रहा है, यदि ऐप सर्वर कनेक्शन से इंकार कर रहा है तो इसे संसाधित नहीं किया जाएगा। – trueimage

+0

@trueimage मैंने सोचा था कि आपने कहा था "मुझे प्रतिक्रिया के लिए इंतजार करने की आवश्यकता नहीं है" :) जब आप उन्हें एसिंक कहते हैं तो यह प्रतिक्रिया को पुनः प्राप्त करने में कुछ जटिल बनाता है, लेकिन हाँ, यह किया जा सकता है। –

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