【问题标题】:Trigger filter on POCO property在 POCO 属性上触发过滤器
【发布时间】:2016-04-07 03:20:31
【问题描述】:

我正在尝试创建一个由每个步骤的 QueueTrigger 处理的多步骤流程。如何在没有每个状态的队列的情况下过滤 QueueMessage 对象的“状态”属性? 消息类型:

public partial class TaskType{
    string BlobPathToProcess {get; set;}
    int State {get; set;}
}


 public static void Task(
     [QueueTrigger(queueName: "taskq")] TaskType msg
     TextWriter log,
     IBinder binder)
{
     //currently I use a switch statement on (TaskType.State == 1)

所以不是:

[QueueTrigger(queueName: "taskqstate1")] TaskType msg

[QueueTrigger(queueName: "taskqstate2")] TaskType msg

等等

也许像@pranav-rastogi 说关于MSDN Ch9 cloud cover at min 24 上的Singleton attribute

[Singleton(@"{Region}\{Zone}"]
public static void Task([QueueTrigger(singleto-test")] WorkItem workItem, ...

其中 {Region} 和 {Zone} 是“workItem”对象的属性。

更像:

[PocoFilter(PocoProperty="{State}", PocoValue="1"]
public static void Task1([QueueTrigger(queueName: "taskq")] TaskType msg ...

[PocoFilter(PocoProperty="{State}", PocoValue="2"]
public static void Task2([QueueTrigger(queueName: "taskq")] TaskType msg ...

【问题讨论】:

  • 要创建工作流,您可以使用 servicebus 主题并使用 sqlfilter 创建订阅。我明天会发布答案

标签: azure azure-webjobs azure-webjobssdk


【解决方案1】:

据我所知,Azure Queue 没有消息过滤功能。

如果您移至 Azure 服务总线主题和订阅,您将能够根据消息属性进行筛选。

要创建主题和订阅,您可以查看这篇文章:

所以说,你已经创建了

  • 名为“MyTestTopic”的主题
  • 一个名为“MySubscription1”和SqlFilter“Status = 1”的订阅

    • 只有发送到属性 Status = 1 的主题的消息才会被路由到此订阅。
  • 名称为“MySubscription2”且 SqlFilter 为“Status = 2”的订阅

    • 只有发送到属性 Status = 2 的主题的消息才会被路由到此订阅。

在您的 webjob 中,您可以拥有如下所示的二元函数:

public static void ProcessQueueMessage1(
    [ServiceBusTrigger("MyTestTopic", "MySubscription1")] BrokeredMessage incomingMessage,
    ServiceBus("MyTestTopic")] out BrokeredMessage outputMessage)
{
    // Status should be 1
    Console.Out.WriteLine(incomingMessage.Properties["Status"]);

    // Get your poco
    var myPoco = incomingMessage.GetBody<TaskType>();

   //Process your message ...
   ....

   // clone the message
   outputMessage = incomingMessage.Clone();

   // Set the status to 2
   outputMessage.Properties["Status"] = 2
}

public static void ProcessQueueMessage2(
    [ServiceBusTrigger("MyTestTopic", "MySubscription2")] BrokeredMessage incomingMessage)
{
    // Status should be 2
    Console.Out.WriteLine(incomingMessage.Properties["Status"]);

    // Do what you need
}

在第一个方法中,我们使用 ServiceBusTriggerAttribute 来监听来自订阅 1 的消息,并使用 ServiceBusAttribute 来向主题发送消息。

当你想发送消息时,别忘了设置 BrokeredMessage 的“状态”属性。

【讨论】:

  • SqlFilter 是否正确?您说:“状态 = 2 -> 仅发送到具有属性状态 == 1 的主题的消息”。它应该是“状态== 2”吗?您是否建议升级我的 Q 以使用 ServiceBus?
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多