Azure ServiceBus returns null on Client.Receive()

2019-05-19 03:12发布

I have a problem with receiving messages from a queue i have set up in azure. I have done this successfully using the same code before but now i just get null when i try to fetch messages. When i view the queue in azure management console i clearly see that the queue contains 5 messages.

Here is the code:

ServiceBus SB = new ServiceBus();
Microsoft.ServiceBus.Messaging.BrokeredMessage message;
while (true)
{
    message = SB.ReceiveMessage("orders");
    if (message == null)
    {
        break;
    }
    Procurement.Order order = message.GetBody<Procurement.Order>();
    order.id = Guid.NewGuid().ToString();
    order.remindercount = 0;

    using (DbManager db = new DbManager())
    {
        if (db.SetSpCommand("CreateOrderHead",
            db.Parameter("@companyId", order.companyId),
            db.Parameter("@orderId", order.orderId),
            db.Parameter("@suppliercode", order.suppliercode),
            db.Parameter("@supplierorderId", order.supplierorderId),
            db.Parameter("@orderdate", order.orderdate),
            db.Parameter("@desireddate", order.desireddate),
            db.Parameter("@ordertext", order.ordertext),
            db.Parameter("@name", order.name),
            db.Parameter("@street", order.street),
            db.Parameter("@zip", order.zip),
            db.Parameter("@city", order.city),
            db.Parameter("@country", order.country),
            db.Parameter("@countrycode", order.countrycode),
            db.Parameter("@deliveryterms", order.deliveryterms),
            db.Parameter("@reference", order.reference),
            db.Parameter("@deliveryinstruction", order.deliveryinstruction),
            db.Parameter("@id", order.id),
            db.Parameter("@partycode", order.partyCode)
            ).ExecuteNonQuery() == 1)
        {
            message.Complete();
            message = null;
        }

        db.SetSpCommand("DeleteOrderRows",
            db.Parameter("@orderid", order.orderId),
            db.Parameter("@companyId", order.companyId)
            ).ExecuteNonQuery();

        foreach (Procurement.Orderrow r in order.Orderrows)
        {
            db.SetSpCommand("CreateOrderRow",
            db.Parameter("@companyId", r.companyId),
            db.Parameter("@orderId", r.orderId),
            db.Parameter("@orderrowId", r.orderrowId),
            db.Parameter("@itemId", r.itemId),
            db.Parameter("@itemdesc", r.itemdesc),
            db.Parameter("@orderqty", r.orderqty),
            db.Parameter("@desireddate", r.desireddate),
            db.Parameter("@rowtext", r.rowtext),
            db.Parameter("@supplieritemId", r.supplieritemId),
            db.Parameter("@unit", r.unit),
            db.Parameter("@id", order.id),
            db.Parameter("@unitprice", r.unitprice),
            db.Parameter("@rowprice", r.rowprice)
            ).ExecuteNonQuery();
        }
    }
}
Thread.Sleep(new TimeSpan(0, 1, 0));

And this is the ServiceBus-class:

public class ServiceBus
{
    TokenProvider TokenProvider;
    MessagingFactory Factory;

    public ServiceBus()
    {
        TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(GetIssuerName(), GetSecret());
        Factory = MessagingFactory.Create(
            GetURINameSpace(),
            TokenProvider
            );
    }

    public void SendMessage(string queue, BrokeredMessage message)
    {
        var client = Factory.CreateQueueClient(queue);
        client.Send(message);
    }

    public BrokeredMessage ReceiveMessage(string queue)
    {
        var client = Factory.CreateQueueClient(queue, ReceiveMode.ReceiveAndDelete);
        BrokeredMessage message = client.Receive();
        return message;
    }

    private static Uri GetURINameSpace()
    {
        return ServiceBusEnvironment.CreateServiceUri("sb", GetNamespace(), string.Empty);
    }

    private static string GetNamespace()
    {
        return "Namespace i have verified its the right one";
    }

    private static string GetIssuerName()
    {
        return "Issuer i have verified its the right one";
    }

    private static string GetSecret()
    {
        return "Key i have verified its the right one";
    }
}

I think this should be pretty straight forward but i cant find out what im doing wrong. Its probably something small that im missing...

Anyways, thanks in advance!

2条回答
The star\"
2楼-- · 2019-05-19 03:33

Those BrokeredMessages you see in your SubcriptionDescription.MessageCount are not just regular messages but also the count of the messages in the $DeadLetterQueue-sub queue!!!

Use this code snippet to retrieve all messages from that sub-queue and print out their details. Rename [topic] and [subscription] to your actual ones:

MessagingFactory msgFactory = MessagingFactory.Create(_uri, _tokenProvider);
        MessageReceiver msgReceiver = msgFactory.CreateMessageReceiver("[topic]/subscriptions/[subscription]/$DeadLetterQueue", ReceiveMode.PeekLock);

        while (true)
        {
            BrokeredMessage msg = msgReceiver.Receive();

            if (msg != null)
            {
                Console.WriteLine("Deadlettered message.");

                Console.WriteLine("MessageId:                  {0}", msg.MessageId);
                Console.WriteLine("DeliveryCount:              {0}", msg.DeliveryCount);
                Console.WriteLine("EnqueuedTimeUtc:            {0}", msg.EnqueuedTimeUtc);
                Console.WriteLine("Size:                       {0} bytes", msg.Size);
                Console.WriteLine("DeadLetterReason:           {0}",
                    msg.Properties["DeadLetterReason"]);
                Console.WriteLine("DeadLetterErrorDescription: {0}",
                    msg.Properties["DeadLetterErrorDescription"]);
                Console.WriteLine();
                msg.Complete();
            }
        }
查看更多
劳资没心,怎么记你
3楼-- · 2019-05-19 03:43

The solution to this problem was either a bug in azure management-portal making it show the wrong number of messages on the queue or the messages somehow got flagged so that they would not be read. In other words it worked all along, i just had to add some new messages to the queue.

查看更多
登录 后发表回答