我有一个问题让我感到困惑的是,服务总线类型,代理消息传递和中继消息传递之间有什么区别?我不是从开发的角度来看它,但我想更多地了解它们之间的概念和差异.
谢谢.
QueueClient.OnMessage方法是否总是在不同的线程上执行回调参数?
我假设如果MaxConcurrentCalls设置为10,那么queueClient将最多启动10个线程来并行处理消息.如果传入MaxConcurrentConnection值为1或者它是否在当前线程上执行,是否会创建新线程?
我的实际问题:
在一个Worker角色中我想处理多个队列,但是它们都会同时处理.例如
_queueClient1.OnMessage(x =>
{
// Do something
}, new OnMessageOptions { MaxConcurrentCalls = 1});
_queueClient2.OnMessage(x =>
{
// Do something
}, new OnMessageOptions { MaxConcurrentCalls = 1 });
_queueClient3.OnMessage(x =>
{
// Do something
}, new OnMessageOptions { MaxConcurrentCalls = 1 });
_queueClient4.OnMessage(x =>
{
// Do something
}, new OnMessageOptions { MaxConcurrentCalls = 1 });
Run Code Online (Sandbox Code Playgroud)
这是否会导致每个回调并行执行,以便_queueClient4回调不等待_queueClient2完成才能执行?
Service Bus Gateway未启动.
首先,我尝试完全卸载所有Azure/Fabric/Service Bus类型的SDK和安装.我已经安装了两个Windows Azure Pack: Service Bus 1.1并Windows Azure Pack: Security Update for Service Bus 1.1 (KB2972621)从头开始.
删除所有与服务总线相关的数据库后,启动"服务总线配置"向导,开始使用自定义设置启动新服务器场.
除了添加我自己的证书,当然输入我的密码,我保留所有默认值.
点击进入该服务总线配置向导最终卡住后进行:
Starting
Created and configured Service Bus farm management database.
Created and configured Service Bus gateway database.
Creating default container.
Processing completed
Validating input and configuration parameters.
Granting 'Log on as Service' privilege to the run as account.
Windows Fabric configuration started.
Running Windows Fabric deployment.
Windows Fabric starting.
Service Bus configuration started. …Run Code Online (Sandbox Code Playgroud) 目前使用Azure Service Bus主题并遇到使用ReceiveBatch方法接收我的消息的问题.问题是预期的结果实际上并不是我得到的结果.这是基本的代码设置,用例如下:
SubscriptionClient client = SubscriptionClient.CreateFromConnectionString(connectionString, convoTopic, subName);
IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(100);
foreach (BrokeredMessage message in messageList)
{
try
{
Console.WriteLine(message.GetBody<string>() + message.MessageId);
message.Complete();
}
catch (Exception ex)
{
message.Abandon();
}
}
client.Close();
MessageBox.Show("Done");
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,如果我发送4条消息,那么在第一次运行时轮询我得到第一条消息.在第二轮比赛中,我得到了另外一部分.我期待在同一时间获得全部4分.它似乎总是在第一次民意调查中返回一个单数值,然后在随后的民意调查中返回其余值.(与3和5的结果相同,我在第二次尝试时发送n个消息中的n-1个,第一次尝试时发送1条消息).
如果我有0条消息要接收,则操作需要大约30-60秒才能获得messageList(具有0计数).我需要它立即返回.
如果我将代码更改为IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(100, new Timespan(0,0,0));然后问题#2消失,因为问题1仍然存在,我必须两次调用代码以获取所有消息.
我假设问题#2是由于我在#3中覆盖的默认超时值(尽管我发现如果有消息,它会立即响应而不等待默认时间,这令人困惑).我不知道为什么我从未在单个ReceiveBatch中收到全部消息.
我正在使用应用程序(.Net Core)通过Azure服务总线发送对象并通过Web作业(.Net Core)接收
问题是如何serialize/deserialize来send/receive的对象?
我找到了很多关于遗留BroakerMessage.GetBody()接收消息的参考,但不是新的.Net Core方法,请建议,谢谢.
发件人代码:
using Microsoft.Azure.ServiceBus;
MyClass object = new MyClass();
var message = new Message(object);
await queueClient.SendAsync(message);
Run Code Online (Sandbox Code Playgroud)
接收者代码:
using Microsoft.Azure.ServiceBus;
public void ProcessQueueMessage([ServiceBusTrigger("queue")] Message message, TextWriter log)
{
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个非常简单的控制台应用程序,它连接到Azure ServiceBus并发送一条消息.我尝试了Microsoft(Microsoft.Azure.ServiceBus)的最新库,但不管我做什么,我只是得到这个错误:
无法建立连接,因为目标计算机主动拒绝它ErrorCode:ConnectionRefused
我在Service Bus Explorer中尝试了完全相同的连接字符串,它确实工作正常.此外,我使用Microsoft(WindowsAzure.ServiceBus)的旧库连接没有问题.
var sender = new MessageSender("endpoint", "topicName");
sender.SendAsync(new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject("test"))));
Run Code Online (Sandbox Code Playgroud)
我尝试使用.NET Framework 4.6.2和Core,同样的例外.我怀疑这些库使用的默认协议可能存在一些差异,但我无法确定这一点.
PS尝试过Microsoft docs中的示例,但结果仍然是同样的例外
我正在编写一个使用Microsoft.ServiceBus.dll 1.0.0.0(.NET 3.5版本)的POC应用程序.
我的WCF合同和服务如下所示:
[ServiceContract(Name="MyServiceContract", Namespace = "http://mydomain.com/")]
internal interface IServiceContract
{
[WebInvoke(Method = "POST", UriTemplate = "/DoOperation")]
[OperationContract]
Stream RelayRequest(Stream requestBody);
}
[ServiceBehavior(Name = "Service1", Namespace = "http://mydomain.com/Service1/", InstanceContextMode = InstanceContextMode.Single)]
internal class Service1 : IServiceContract
{
Stream RelayRequest(Stream requestBody)
{
var contents = GetJsonResponse();
var responseStream = new MemoryStream();
var streamWriter = new StreamWriter(responseStream);
streamWriter.AutoFlush = true;
var writer = new JsonTextWriter(streamWriter);
var serializer = new JsonSerializer();
serializer.Serialize(responseStream, contents);
responseStream.Position = 0 // reset the position of the …Run Code Online (Sandbox Code Playgroud) 我试图在将BrokeredMessage.Properties集合属性发送到Azure Service Bus之前将其添加到集合中.自定义属性类型是枚举:
[Serializable, DataContract]
public enum FooBar
{
[EnumMember]
Foo = 0,
[EnumMember]
Bar = 1
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过各种各样的属性组合,以及没有属性的版本.
这是添加属性并发送消息的代码:
var brokeredMessage = new BrokeredMessage(new MessageObject(){ //etc });
brokeredMessage.Properties.Add("FooBar", FooBar.Foo);
queueClient.Send(brokeredMessage);
Run Code Online (Sandbox Code Playgroud)
尝试发送消息时返回以下错误:
System.Runtime.Serialization.SerializationException : Serialization operation failed due to unsupported type Namespace.FooBar.
Run Code Online (Sandbox Code Playgroud)
我试图找到一些关于BrokeredMessage.Properties限制的详细文档(如果有的话),并且找不到任何指定只能使用基本类型的文档.
关于为什么这不起作用的任何想法?
编辑:
应该说我使用的是Microsoft.ServiceBus的V2.1.0.0.
我最近创建了一些分区队列,从我发送和接收的所有时间.他们过去没有分区,没有我当前的任何问题.
问题是,队列中有一些我无法接收的消息.在没有向队列发送任何其他消息时我总是得不到任何回报,但是当我向队列发送消息时,我收到新消息没有问题.卡在队列中的消息是活动消息,而不是死信.
我怀疑他们被困在一个特定的分区,但我不知道如何接收它们.
由于我无法接收这些消息,有没有办法重置ServiceBus队列?
有任何想法吗?
更新:
数量不是恒定的,而是非常缓慢地增加.在我们的测试环境中,我们每小时收到的消息少于2000条,并且在重置为0(零)后,队列在过去12小时内每次收到大约20条消息.那些消息就在那里但不可接收.至少不是以通常的方式.
分区后,问题仅出现在两个名称空间中.问题不在我们不使用分区队列的实时环境中.
嗨,我有一个用于创建带有主题和订阅的ServiceBus的ARM模板。但是我只能完成1个主题-1个订阅,因为我无法进行嵌套循环来为每个主题创建多个订阅。
我希望我可以执行这样的模板:
参数:
{
"serviceBusName": "mybus",
"topics":
[
{
"topicName": "mytopic1",
"subscriptions": [ "mysubscription1", "mysubscription2"]
},
{
"topicName": "mytopic2",
"subscriptions": [ "mysubscription1"]
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是我的实际模板:
{
"$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"ServiceBusNamespaceName": {
"type": "string"
},
"ServiceBusSku": {
"type": "string",
"allowedValues": [
"Basic",
"Standard"
],
"defaultValue": "Standard"
},
"ServiceBusSmallSizeTopicInMb": {
"type": "int",
"defaultValue": 1024
},
"ServiceBusMaxSizeTopicInMb": {
"type": "int",
"defaultValue": 1024
},
"Topics": {
"type": "array"
}
},
"variables": {
"DefaultSASKeyName": "RootManageSharedAccessKey",
"DefaultAuthRuleResourceId": "[resourceId('Microsoft.ServiceBus/namespaces/authorizationRules', parameters('ServiceBusNamespaceName'), variables('DefaultSASKeyName'))]",
"SbVersion": "2017-04-01" …Run Code Online (Sandbox Code Playgroud) servicebus azure azureservicebus azure-resource-manager azure-servicebus-topics