【发布时间】:2016-11-19 00:51:24
【问题描述】:
我有三个队列和一个工作人员,我想监控三个队列(或仅其中两个)
一个队列是 qPirate 一个队列是 qShips 一个队列是 qPassengers
这个想法是,工作人员要么查看全部 3 个,要么查看其中 2 个,要么查看其中一个,并根据消息内容执行不同的操作。
关键是说消息失败是因为 ship1 离线,qships 中的所有队列都将刷新,正在查看该消息的工作人员和其他队列将稍微挂起,因为他们将尝试处理消息该队列只查看其他队列一点点,而正在查看其他 2 个队列并跳过 qships 的其他工作人员将继续处理消息,而不会出现阻塞或延迟。
public static void GotMessage([ServiceBusTrigger("%LookAtAllQueuesintheservicebus%")] BrokeredMessage message)
{
var handler = new MessageHandler();
var manager = new MessageManager(
handler,
"PirateShips"
);
manager.ProcessMessageViaHandler(message);
}
在网上环顾四周,我猜这不是可能的,但它似乎是可能的?无论哪种方式都提前感谢!
Edit1:我也会添加 Job Host 以尝试澄清一下
JobHostConfiguration config = new JobHostConfiguration()
{
DashboardConnectionString = "DefaultEndpointsProtocol=https;AccountName=PiratesAreUs;AccountKey=Yarr",
StorageConnectionString = "DefaultEndpointsProtocol=https;AccountName=PiratesAreUs;AccountKey=Yarr",
NameResolver = new QueueNameResolver()
};
ServiceBusConfiguration serviceBusConfig = new ServiceBusConfiguration()
{
ConnectionString = "Endpoint=AllPirateQueuesLocatedHere;SharedAccessKeyName=PiratesAreUs;SharedAccessKey=Yarr"
};
serviceBusConfig.MessageOptions.AutoComplete = false;
serviceBusConfig.MessageOptions.AutoRenewTimeout = TimeSpan.FromMinutes(1);
serviceBusConfig.MessageOptions.MaxConcurrentCalls = 1;
config.UseServiceBus(serviceBusConfig);
JobHost host = new JobHost(config);
host.RunAndBlock();
QueueNameResolverClass 也很简单
public class QueueNameResolver : INameResolver
{
public string Resolve(string name)
{
return name;
}
}
我似乎没有让 NameResolver 成为多个队列,虽然我可以说我希望作业主机查看某个 ServiceBus,但我不知道如何告诉它查看所有队列在服务总线内。
换句话说,我想在这个worker上有多个servicebustriggers,这样如果一条消息被发送到qpirate1和qships1,它们都位于服务总线AllPirateQueuesHere中,worker可以在qpirate1中获取消息,处理它,然后获取qships1 中的消息并进行处理。
【问题讨论】:
-
这些消息是从 Azure Webjobs 消费的吗?
-
看签名,是的,约翰。
-
@ivan-s,你能解释一下吗?我真的很难理解你想要达到的目标......谢谢
-
添加了更多代码和解释。希望能帮助到你。无论哪种方式都提前感谢!
标签: azure message-queue azureservicebus