Tag: azureservicebus

服务总线 – 单例连接类?

我试图找出从Web-API使用Service Bus的最佳实践。 我已经读过,重新创建像QueueClient,SubscriptionClient等对象是错误的方法,所以我需要重用工厂和客户端。 Service Bus客户端对象(如Microsoft.ServiceBus.Messaging.QueueClient或Microsoft.ServiceBus.Messaging.MessageSender)是通过MessagingFactory对象创建的,该对象还提供连接的内部管理。 发送消息后,不应关闭消息传递工厂或队列,主题和订阅客户端,然后在发送下一条消息时重新创建它们。 关闭消息传递工厂将删除与Service Bus服务的连接,并在重新创建工厂时建立新连接。 建立连接是一项昂贵的操作,可以通过为多个操作重复使用相同的工厂和客户端对象来避免这种操作。 参考 我需要实现一个特殊的类来保存与Service Bus的连接,我正在考虑一个将保存特定操作的Singleton类(像EnqueueJobToArchiveQueue(Job job)这样的函数,构造函数将初始化QueueClient,MessageFactory等等)将由“特定操作function”使用。 我的问题是我需要关闭对象( QueueClient.Close() ),我什么时候需要关闭对象? 到目前为止,这是我的class级: public class ServiceBusHelper { private static readonly ServiceBusHelper instance = new ServiceBusHelper(); private static MessagingFactory msgFactory; private static NamespaceManager namespaceManager; private const string jobQueueName = “job”; private const string responseTopicName = “jobResult”; private const string archiveQueueName = “jobArchive”; […]

Azure Service Bus – 使用OnMessage()方法接收消息

在MS文档之后,从订阅接收消息并不困难。 但是,如果我希望我的应用程序每次发布新消息时都会收到消息 – 持续轮询。 因此, SubscriptionClient类的OnMessage()方法。 MS文档说: “ ……当调用OnMessage时,客户端启动一个内部消息泵,不断轮询队列或订阅。这个消息泵包含一个发出Receive()调用的无限循环。如果调用超时,它发出下一个Receive()调用…. “ 但是当应用程序运行时,调用OnMessage()方法时,只接收最新消息。 发布新消息时,常量轮询似乎不起作用。 在尝试了许多不同的方法之后,我可以使这项工作成为唯一的方法并让应用程序在收到新消息时做出反应,即将代码放入具有无限循环的单独任务中。 在如此多的层面上,这似乎完全错了! (见下面的代码)。 任何人都可以帮我修正我的代码或发布一个工作样本来完成相同的function而不需要循环吗? 谢谢! public void ReceiveMessageFromSubscription(string topicName, string subscriptionFilter) { var newMessage = new MessageQueue(); int i = 0; Task listener = Task.Factory.StartNew(() => { while (true) { SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, topicName, subscriptionFilter); Dictionary retrievedMessage = new Dictionary(); OnMessageOptions options […]

Azure ServiceBus AutoRenewTimeout

我通过.net SDK使用Azure ServiceBus队列。 OnMessageHandler / OnMessageOptions上有一个名为“AutoRenewTimeout”的标志,但似乎对这个值的实际含义感到困惑。 在这里的官方文档https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.onmessageoptions.aspx它建议AutoRenewTimeout应该大于队列锁定。 获取或设置自动续订锁定的最长持续时间。 该值应大于最长的消息锁定持续时间; 例如,LockDuration属性。 这似乎表明AutoRenewTimeout或多或少是处理消息所需的最长时间。 例如,如果您的锁定持续时间为1分钟,并且自动续订时间为5分钟,则该消息将在放弃之前总共续订5次,并再次在队列中显示。 还有其他StackOverflow答案确认这种情况,例如https://stackoverflow.com/a/36051408 要处理长消息处理,您应该设置AutoRenewTimeout == 10分钟(在您的情况下)。 这意味着每次LockDuration过期时,锁定将在这10分钟内更新。 因此,例如,如果您的LockDuration为3分钟且AutoRenewTimeout为10分钟,则每3分钟锁定将自动续订(3分钟,6分钟和9分钟后),并且自消息消耗后12分钟后锁定将自动释放。 然而,在更多的研究中,我偶然发现了一条旧的推文( https://twitter.com/clemensv/status/649940087267041284 ),它看起来像是微软消息传递的首席架构师。 在这条推文中,它似乎表明AutoRenewTimeout是调用“RenewLock”方法的时间间隔。 它是在回调处于活动状态时在消息上调用https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.renewlock.aspx的时间间隔 因此,例如,如果您的锁定时间是1分钟,则AutoRenewTimeout应该是30秒,以确保在释放之前更新消息锁定。 在我自己的测试中,我倾向于前者是正确的,但推文让我怀疑的事实可能我不知道充分利用AutoRenewTimeout

无法将REST API用于Windows Server 1.1的Service Bus(OnPremises)

我正在使用Window Server Service Bus 1.1。 我能够使用以下基址从Window Server Service Bus生成OAuth令牌 string baseAddressHttp = “https://” + ServerName + “:9355/” + Namespace + “/$STS/OAuth/”; 对于用于将消息发送到队列的Window Azure Service Bus,我可以在以下队列地址上发出请求 string serviceNamespace = “ServiceBusDefaultNamespace”; string queueName = “SampleQueuName”; string message =”This is my first message”; string queueAddress = “https://” + serviceNamespace + “.servicebus.windows.net/”+ queueName + “/messages”; WebClient webClient = new […]

有没有办法从.Net内创建一个azure服务总线命名空间?

我们正在使用.Net framework 4.6.x并寻找一种从azure.management sdk创建azure服务总线命名空间的方法。 我们无法使用C#在.Net中以编程方式实现,任何参考或直接文档都会有所帮助。 msdn上的文档似乎使用了旧的REST api,我们现在需要升级,因为windows已经完成了相同的操作。 任何不在物理门户中创建服务总线或使用REST API的方向或引用。

是什么导致Azure事件中心ReceiverDisconnectedException / LeaseLostException?

我正在使用EventProcessorHost和一个IEventProcessor类(调用它:MyEventProcessor)从EventHub接收事件。 我通过在两台服务器上运行我的EPH,并使用相同的ConsumerGroup连接到Hub,但使用唯一的hostName(使用机器名称)将其扩展到两台服务器。 问题是:在白天/黑夜的随机时间,应用程序记录此: Exception information: Exception type: ReceiverDisconnectedException Exception message: New receiver with higher epoch of ‘186’ is created hence current receiver with epoch ‘186’ is getting disconnected. If you are recreating the receiver, make sure a higher epoch is used. at Microsoft.ServiceBus.Common.ExceptionDispatcher.Throw(Exception exception) at Microsoft.ServiceBus.Common.Parallel.TaskHelpers.EndAsyncResult(IAsyncResult asyncResult) at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result) 此exception与LeaseLostException同时发生,当它尝试检查点时,从MyEventProcessor的CloseAsync方法抛出。 (由于ReceiverDisconnectedException,可能正在调用Close?) 我认为这是由于Event Hubs在扩展到多台机器时的自动租赁管理而发生的。 但我想知道我是否需要做一些不同的事情,以使其工作更干净,避免这些例外? […]