我正在尝试在Azure中构建一个简单的Web API REST服务,并在后端使用服务总线队列工作程序。我可以从Web API向工作人员发送一条消息就好了。但是,我试图发送更多消息只是为了看看一切是如何工作的。所以,我创建了一个简单的控制器,如下所示:
for (int i = 0; i < 100; i++)
{
var msg = new BrokeredMessage("Ping");
BioConnector.QueueConnector.OrdersQueueClient.Send(msg);
}
当我打电话给控制器时,我只得到工人收到的消息的大约1/2左右。其余的似乎都被放弃了。
答案 0 :(得分:3)
我遇到的问题是只使用发布的示例代码here获取大约一半的消息,所以我编写了自己的测试代码。我用&gt;尝试过100个队列消息,并且始终具有100%发送/记录的奇偶校验。也许你的代码有类似的问题。
在app.config中,使用您自己提供的值将其更改为:
<appSettings>
<add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://blahblah.servicebus.windows.net/;SharedSecretIssuer=owner;SharedSecretValue=pDk0b....=" />
</appSettings>
使用指令添加这些:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
using System.Configuration;
using System.Threading;
将代码方法更改为以下内容:
class Program
{
static void Main(string[] args)
{
string connectionString = ConfigurationSettings.AppSettings["Microsoft.ServiceBus.ConnectionString"];
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
QueueDescription queueDesc = new QueueDescription("TestQueue");
if (!namespaceManager.QueueExists(queueDesc.Path))
{
namespaceManager.CreateQueue(queueDesc);
}
QueueClient topicClient = QueueClient.CreateFromConnectionString(connectionString, queueDesc.Path);
int sentMsgCount = 0;
int recdMsgCount = 0;
for (int i = 0; i < 100; i++)
{
BrokeredMessage msg = new BrokeredMessage("Test message " + i);
topicClient.Send(msg);
sentMsgCount++;
Console.WriteLine("Sent Message: " + msg);
}
QueueClient subClient = QueueClient.CreateFromConnectionString(connectionString, queueDesc.Path);
bool moreMessages = true;
while (moreMessages)
{
BrokeredMessage recdMsg = subClient.Receive(TimeSpan.FromSeconds(3));
if (recdMsg != null)
{
Console.WriteLine("Received Message: " + recdMsg);
recdMsgCount++;
recdMsg.Complete();
}
else
{
moreMessages = false;
}
}
Console.WriteLine("# of sent msgs: " + sentMsgCount + ", # of rec'd msgs: " + recdMsgCount);
Console.Read();
}
}
答案 1 :(得分:2)
这是一个奇怪的问题。通过随机浏览“尝试的东西”,我最终改变了队列的字符串名称,然后一切都开始工作了。我没有更改除队列名称之外的任何内容 - 根本不更改任何配置参数。
Azure上的特定队列似乎有些问题。
答案 2 :(得分:2)
Azure Service Bus提供持久的消息传递,因此您不会丢失任何消息。有些项目需要进一步调查: 1)是否有另一个worker角色实例从该队列中提取消息 2)你使用peek-lock作为接收模式,因为这将是保证至少一次交付的唯一方法。接收和删除模式没有保证 3)由于消息过期或超过最大传送计数,消息进入死信队列,即。它们已收到但未完成多次 4)如果以上都不适用,那么提出支持票,Azure产品团队可以调查症状,因为我提到这是一个持久的消息传递系统,所以没有消息会“丢失”。
答案 3 :(得分:0)
我在项目中使用了WindowsAzure.ServiceBus NuGet package,并使用QueueClient.Send()
发送邮件,并遇到了相同的邮件丢失问题。
我的解决方案可以完全解决问题:
在发送方,我不得不use REST API to send messages。
在接收方,这是我提取消息正文的方式:
using (var stream = brokeredMessage.GetBody<Stream>())
{
using (var streamReader = new StreamReader(stream, Encoding.UTF8))
{
var msg = streamReader.ReadToEnd();
// Convert the JSON message to an object
// var obj = JsonConvert.DeserializeObject<ObjectType>(msg);
}
}