多个 azure 队列的一个侦听器
one listener for multiple azure queues
我想创建一个网络作业(侦听器)来侦听存储中的所有队列。如果有任何新消息,则它会触发一个处理程序。
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) 向这个 class 注入一个 class 我认为我不能
所以我正在考虑创建自己的侦听器。我想创建多个威胁,每个威胁都监听一个队列。然后,当我 运行 Web 作业时,它会启动所有威胁。
不知是否有人可以提出更好的解决方案。代码示例真的很好。
谢谢
除非您真的想要,否则您不需要创建自己的侦听器。 Azure Webjobs SDK 已经为你完成了繁重的工作。
下面是一个可以处理来自不同队列的数据的示例Functions.cs。
您可以将服务注入 Functions.cs,这样如果您愿意,不同的队列将由不同的服务处理。
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);
}
希望对您有所帮助
正如@lopezbertoni 所建议的那样,我在 Functions 中创建了两个方法,并且我使用 IJobActivator 将 类 注入到 Functions 中。请参见下面的示例:
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;
}
}
我想创建一个网络作业(侦听器)来侦听存储中的所有队列。如果有任何新消息,则它会触发一个处理程序。
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) 向这个 class 注入一个 class 我认为我不能
所以我正在考虑创建自己的侦听器。我想创建多个威胁,每个威胁都监听一个队列。然后,当我 运行 Web 作业时,它会启动所有威胁。
不知是否有人可以提出更好的解决方案。代码示例真的很好。
谢谢
除非您真的想要,否则您不需要创建自己的侦听器。 Azure Webjobs SDK 已经为你完成了繁重的工作。
下面是一个可以处理来自不同队列的数据的示例Functions.cs。 您可以将服务注入 Functions.cs,这样如果您愿意,不同的队列将由不同的服务处理。
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);
}
希望对您有所帮助
正如@lopezbertoni 所建议的那样,我在 Functions 中创建了两个方法,并且我使用 IJobActivator 将 类 注入到 Functions 中。请参见下面的示例:
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;
}
}