2017-05-22 9 views
0

BLOB 저장소에 CSV 파일을 업로드 할 때 CSV 파일을 처리하려고합니다. 이 요구 사항에 대해 Blob 트리거가있는 Web Job을 작성하고 있습니다.동시에 두 개의 웹 작업 실행 중 하나가 실패하면 다른 사람이 파일을 처리합니다.

지속적인 CSV 처리를 위해 블롭 트리거가있는 웹 작업을 하나 더 작성했습니다.

하나의 웹 작업이 실패하면 다른 웹 작업이 csv를 처리합니다.

내 문제는 두 웹 작업이 모두 실행되어 동일한 CSV 파일을 처리하고 중복 데이터를 생성하는 경우입니다.

하나의 웹 작업 만 CSV 파일을 처리하도록 파일을 잠근 방법은 무엇입니까?

또는

어떻게 먼저 웹 작업을 종료하려고하면 두 번째 웹 작업을 트리거 할 수 있습니다?

+0

코드에서 예외가 발생할 경우이 예외가 필요하지 않으므로 적절한 예외 처리는 어떻게됩니까? 그렇지 않으면 아마도 도움이 될 수 있습니다. https://github.com/Azure/azure-webjobs-sdk-extensions#errortrigger? 또한이 답변을 살펴보십시오. https://stackoverflow.com/questions/35166010/azure-triggered-webjob-detecting-when-webjob-stops –

+0

작업을 확장하는 방법은 무엇입니까? 처리하는 동안 BLOB가 잠겨 있다고 확신합니다. – Thomas

+1

@ 토마스. Blob은 파일을 잠그지 않습니다. 그들 (두 개의 웹 작업)이 컨테이너에 새로운 BLOB를 가지고있는 동안, 두 웹 작업에 대한 Blob Trigger가 실행을 시작합니다. – ABB

답변

2

첫 번째 웹 작업을 종료하려면 어떻게해야합니까?

첫 번째 WebJob에서 예외를 처리하기 위해 try-catch를 사용하는 것이 좋습니다. 예외가 발생하면 다른 WebJob을 시작하기 위해 대기열에 blob 이름을 쓸 수 있습니다.

public static void ProcessCSVFile([BlobTrigger("input/{blobname}.csv")] TextReader input, [Queue("myqueue")] out string outputBlobName, string blobname) 
{ 
    try 
    { 
     //process the csv file 

     //if none exception occurs, set the value of outputBlobName to null 
     outputBlobName = null; 
    } 
    catch 
    { 
     //add the blob name to a queue and another function named RepeatProcessCSVFile will be triggered. 
     outputBlobName = blobname; 
    } 
} 

다른 WebJob에 QueueTrigger 기능을 만들 수 있습니다. 이 함수에서 blob 이름을 읽고 csv를 다시 처리 할 수 ​​있습니다. 새로운 예외가 발생하면 큐에 blob 이름을 다시 추가 할 수 있으며이 함수는 csv 파일이 성공적으로 처리 될 때까지 계속해서 다시 실행됩니다.

public static void RepeatProcessCSVFile([QueueTrigger("myqueue")] string blobName, [Queue("myqueue")] out string outputBlobName) 
{ 
    try 
    { 
     //process the csv file 

     //if none exception occurs, set the value of outputBlobName to null. 
     outputBlobName = null; 
    } 
    catch 
    { 
     //re-add the blobName to the queue and this function will be executed again until the csv file has been handled successfully. 
     outputBlobName = blobName; 
    } 
} 
+0

이 솔루션은 좋습니다. 나는 이것에 대해 연구 할 것이다. – ABB

+0

이 솔루션이 도움이 될 수 있다면 돌아와서이 답장을 답으로 표시하십시오. 응답 된 스레드는 쉽게 검색됩니다. 비슷한 문제가있는 다른 사람들을 도울 것입니다. 이 주제에 대해 추가 질문이 있으면 언제든지 알려주십시오. – Amor

0

나는 Amor의 솔루션을 좋아하지만, 여기에 추가 할 몇 가지 제안 사항이 있습니다.

BlobTrigger 접근 방식을 포기하고 처리해야 할 blob을 나타내는 서비스 버스 대기열 메시지를 대기열에 추가하는 경우 ServiceBusTrigger로 처리를 트리거 할 수 있습니다. 예외가 발생하면 메시지를 포기하고 다른 처리 시도에 사용할 수있게됩니다. 이것은 단지 하나의 webjob을 가지고 있고 여전히 중복을 가질 수있게합니다.

서비스 버스 대기열을 사용하는 또 다른 장점은 메시지를 읽을 때 보장 된 메시지 잠금과 함께 적어도 한 번 처리되는 것을 보장받을 수 있다는 것입니다. 표준 저장 대기열에서는 그렇지 않습니다. 또한 동일한 서비스 버스 대기열을 모니터링하기 위해 두 번째 Webjob 인스턴스를 추가하려는 경우 나중에 확장 성 옵션을 제공합니다.

+0

이 솔루션도 좋습니다. – ABB