我正在使用服务总线在网络角色和工作者角色之间进行通信,但它一直给我带来一些不稳定的结果。我已经将我的云计划部署到了天蓝。如此令人惊讶的是,当我只运行已部署的项目时,服务总线工作正常,但是当我也在使用服务总线的本地模拟器上运行相同的项目时,服务总线变得有问题,因为在所有消息中,或者不被工作者角色接收。这是服务巴士的正常行为吗?如果不是,可能是什么问题,我该如何解决它?为什么Azure服务总线在由两个工作角色访问时不起作用?
这对我来说很刺激,因为现在当我在本地模拟器上运行我的项目时,服务总线从未正常工作。
这就是发送和接收消息的方式,但是我猜这个问题可能不在其中,因为当服务总线被部署的项目使用时,它可以正常工作。
Worker角色:
public override void Run()
{
while (!IsStopped)
{
try
{
if (BroadcastReceived)
{
BroadcastReceived = false;
// Receive the message from Web Role to upload the broadcast to queue
BroadcastClient.BeginReceive(OnWebRoleMessageReceived, null);
}
if (SignalRMessageReceived)
{
SignalRMessageReceived = false;
// Receive the message from SignalR BroadcastHub
SignalRClient.BeginReceive(OnSignalRMessageReceived, null);
}
if (SignalRFirstTimeMessageReceived)
{
SignalRFirstTimeMessageReceived = false;
// Receive the message from SignalR BroadcastHub
SignalRFirstTimeClient.BeginReceive(OnSignalRFirstTimeMessageReceived, null);
}
}
}
public void OnWebRoleMessageReceived(IAsyncResult iar)
{
BrokeredMessage receivedBroadcastMessage = null;
receivedBroadcastMessage = BroadcastClient.EndReceive(iar);
if (receivedBroadcastMessage != null)
{
// Process the message
receivedBroadcastMessage.Complete();
}
BroadcastReceived = true;
}
Web角色:
var queueClient = CloudStorageHelper.GetServiceBusQueueClient(Queuenames.ApiToWorkerRole);
BrokeredMessage message = new BrokeredMessage(record);
queueClient.Send(message);
如何正在创建的服务总线队列:
public static QueueClient GetServiceBusQueueClient(string queuename)
{
string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
if (!namespaceManager.QueueExists(queuename))
{
namespaceManager.CreateQueue(queuename);
}
QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, queuename);
return Client;
}
您可能想要以线程安全的方式读取/写入跨线程共享的变量。 (例如Volatile.Read和Volatile.Write)。您可能由于缓存或由于运行时编译器优化而缺少值。 –
您可以在我的上下文中使用一些代码片段来详细说明吗?或任何链接? – Bitsian