2017-10-26 8 views
0

저장소의 모든 대기열을 수신 대기하는 하나의 웹 작업 (수신기)을 만들고 싶습니다. 새 메시지가 있으면 핸들러를 트리거합니다.여러 azure 대기열에 대한 하나의 리스너

푸른 WebJobs SDK는 하나의 큐에 수신 솔루션을 제공 :

public class Functions 
{ 

    // This function will get triggered/executed when a new message is written 
    // on an Azure Queue called queue. 
    public static async Task ProcessQueueMessage(
     [QueueTrigger("%test%")] CloudQueueMessage message, 
     IBinder binder) 
    { 
     //do some stuff 
    } 
} 

이 방법은 좋은,하지만 난이 필요합니다 1) 다른 큐 2)을 듣고이에 클래스를 주입 내가 할 수 없다고 생각하는 수업

그래서 내 자신의 청취자를 창조하려고합니다. 몇 가지 위협을 만들고 각 위협을 하나의 대기열에서 수신하려고합니다. 그런 다음 웹 작업을 실행하면 모든 위협이 시작됩니다.

누구든지 더 나은 해결책을 제안 할 수 있을지 궁금합니다. 코드 샘플은 실제로 유용 할 것입니다.

감사합니다.

+1

Funcions.cs에서 원하는만큼 많은 큐를들을 수 있습니다. 다른 큐에 다른 트리거를 넣으면됩니다. – lopezbertoni

+1

@ lopezbertoni, 답으로 써야합니다. –

답변

1

을하는 데 도움이됩니다. 아래 예를 참조하십시오.

public class Program 
{ 
    static void Main() 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<MyMessageHandler>().As<IMessageHandler>(); 
     builder.RegisterType<Functions>() 
      .InstancePerDependency(); 


     var host = new JobHost(new JobHostConfiguration 
     { 
      JobActivator = new AutofacJobActivator(builder.Build()) 
     }); 

     host.RunAndBlock(); 
    } 
} 

public class AutofacJobActivator : IJobActivator 
{ 
    private readonly IContainer _container; 

    public AutofacJobActivator(IContainer container) 
    { 
     _container = container; 
    } 

    public T CreateInstance<T>() 
    { 
     return _container.Resolve<T>(); 
    } 
} 

public class Functions 
{ 
    private IMessageHandler _myService; 

    //You can use Dependency Injection if you want to. 
    public Functions(IMessageHandler myService) 
    { 
     _myService = myService; 
    } 

    // This function will get triggered/executed when a new message is written 
    // on an Azure Queue called queue. 
    public async Task ProcessQueueMessage1(
     [QueueTrigger("test1")] CloudQueueMessage message, 
     IBinder binder) 
    { 
     _myService.HandleMessage(message.AsString); 
     Console.WriteLine("ProcessQueueMessage1 was run"); 
     await Task.CompletedTask; 
    } 

    public async Task ProcessQueueMessage2(
     [QueueTrigger("test2")] CloudQueueMessage message, 
     IBinder binder) 
    { 
     _myService.HandleMessage(message.AsString); 
     Console.WriteLine("ProcessQueueMessage2 was run"); 
     await Task.CompletedTask; 
    } 
} 
1

정말로 원하지 않는 한 나만의 수신기를 만들 필요는 없습니다. Azure Webjobs SDK는 이미 당신을 위해 무거운 짐을 덜어줍니다.

다음은 다른 대기열의 데이터를 처리 할 수있는 Functions.cs의 예입니다. 원하는 경우 Functions.cs에 서비스를 주입하여 다른 서비스에서 다른 큐를 처리 할 수 ​​있습니다. @lopezbertoni 내가 기능의 두 가지 방법을 만들어 내가 함수에 클래스를 주입하는 IJobActivator을 사용했습니다 제안으로

private readonly IMyService _myService; 

    //You can use Dependency Injection if you want to. 
    public Functions(IMyService myService) 
    { 
     _myService = myService; 
    } 

    public void ProcessQueue1([QueueTrigger("queue1")] string item) 
    { 
     //You can get the message as a string or it can be strongly typed 
     _myService.ProcessQueueItem1(item); 
    } 

    public void ProcessQueue2([QueueTrigger("queue2")] MyObject item) 
    { 
     //You can get the message as a string or it can be strongly typed 
     _myService.ProcessQueueItem2(item); 
    } 

희망이

+1

게시물 주셔서 감사합니다. 귀하의 솔루션이 부분적으로 작동합니다. 네, 이제 환상적인 다른 대기열을들을 수 있습니다. 그러나 응용 프로그램을 실행할 때 생성자가 실행되지 않습니다. 사실,이 오류가 발생합니다. Microsoft.Azure.WebJobs.Host.FunctionInvocationException : 함수를 실행하는 중 예외가 발생했습니다 : Functions.ProcessQueueMessage1 ---> System.MissingMethodException :이 개체에 대해 정의 된 매개 변수없는 생성자가 없습니다. 빈 생성자를 추가하면 다른 생성자는 호출되지 않습니다. 이견있는 사람? –