在尝试解析订阅Azure Service Bus主题时收到的消息时,我收到了序列化异常.有人看到我错过了吗?我正在使用Microsoft.ServiceBus.Samples.Messaging作为Silverlight代码.
我有一个带有以下代码的web服务:
public void PushCommand(Command command, int posLocationId)
{
var topicName = "topicName";
var topicClient = TopicClient.CreateFromConnectionString(ConnectionString, topicName);
try
{
var message = new BrokeredMessage("test");
topicClient.Send(message);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我有一个SilverLightClient,代码如下:
private void OnReceiveMessageCompleted(IAsyncResult result)
{
var subscriptionClient = (SubscriptionClient)result.AsyncState;
try
{
var message = subscriptionClient.EndReceive(result);
if (message != null)
{
String s = message.GetBody<string>();
}
// prep for next message
subscriptionClient.BeginReceive(this.OnReceiveMessageCompleted, subscriptionClient);
}
catch (Exception e)
{
//unknown error
}
}
Run Code Online (Sandbox Code Playgroud)
捕获了SerializationException反序列化System.String类型的对象时出错.根级别的数据无效.第1行,第1位.
堆栈跟踪:
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName) …Run Code Online (Sandbox Code Playgroud) azure azureservicebus azure-sdk-.net azure-servicebus-queues
我正在尝试与Azure Service Bus集成以执行代理消息传递.我以前成功使用过托管的.NET API,但这次我需要使用HTTP API.
处理消息时,如果我确定消息有毒(即永远无法成功处理),我想将消息移动到死信队列.
在托管API中,我调用BrokeredMessage.DeadLetterAsync()它可以让我指定对消息进行死字的原因,并将其作为原子操作移动到死信队列.
在阅读了HTTP API文档后,我发现并调用了操作来执行其他操作,例如peek-lock,删除锁定的消息或放弃锁定,但我找不到对死信的显式操作一个消息.
HTTP API中是否存在此操作?
我有一个运行第三方服务器进程的 Azure VM。这个服务器进程通过调用我给它的可执行文件来通知我重要的事件,将一些数据作为命令行参数传递。
这些数据需要排队并由另一个工作人员处理。
不要错过这些通知非常重要,所以我想知道:
将消息直接排队到 Azure 服务总线是否可以接受(根据我的要求)?
或者我应该先排队到本地 MSMQ,然后让另一个工作人员从 MSMQ 读取消息并将它们推送到 Azure 服务总线?
谢谢
我想从Azure连接到On-Premises数据库.基本上我将在azure上托管我的Web应用程序,并将使用On-Premises的数据库.
根据www.WindowsAzure.com,Azure Service Bus和Windows Azure虚拟网络都用于连接到本地数据库.但是这两者之间有什么区别,哪些应该根据不同的情况使用?
我参与了一个多层项目,其中一部分正在消耗来自第三方系统的"事件"流.供应商通过Azure Service Bus主题发布这些主题 - 它们提供,控制和管理总线.我们只提供了URI,TopicName和Subscription详细信息.
我们的方法是使用ServiceBusTriggerSDK中提供的Webjob组合来处理侦听新消息并触发将它们处理到我们的系统中.然而,由于这项工作一直无法从主题中读取,我们似乎已经遇到了障碍.这项工作失败了,含糊不清Timeout Exception:
Unhandled Exception: System.TimeoutException: The timeout elapsed upon attempting to obtain a token while accessing 'https://****-sb.accesscontrol.windows.net/WRAPv0.9/'.
---> System.IdentityModel.Tokens.SecurityTokenException: The token provider was unable to provide a security token while accessing 'https://****-sb.accesscontrol.windows.net/WRAPv0.9/'.
Token provider returned message: 'The operation has timed out'.
Run Code Online (Sandbox Code Playgroud)
但进一步下来,跟踪包括:
[ERR] at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
[ERR] at Microsoft.ServiceBus.NamespaceManager.OnEndTopicExists(IAsyncResult result)
[ERR] at Microsoft.ServiceBus.NamespaceManager.EndTopicExists(IAsyncResult result)
Run Code Online (Sandbox Code Playgroud)
供应商随后确认了Subscription对主题的唯一许可/声明是 Listen
任何人都可以确认许可要求是ServiceBusTrigger什么?
而作为一个+1,假设它,无论出于何种原因,需要更多Listen(即需求Manage),是否有人愿意提出另一种方法?丢失WebJob基础设施似乎很遗憾(该项目已经有3个其他工作) - 特别是丢失了来自主题的消息的异步和并发处理等功能
我想创建一个在将新消息添加到主题/订阅时触发的Azure功能.
目前我使用ServiceBusQueueTrigger C#模板创建了Azure函数, 并将队列名称设置为
topicPath + "/Subscriptions/" + subscriptionName
Run Code Online (Sandbox Code Playgroud)
但我有这个例外:
Microsoft.ServiceBus:无法获取实体'topic-test/Subscriptions/subscription-test',因为它不是QueueDescription类型.检查您使用的是具有正确实体类型的方法.System.Runtime.Serialization:第1行位置错误1762.期望来自命名空间' http://schemas.microsoft.com/netservices/2010/10/servicebus/connect '的元素'QueueDescription '..遇到'无',名称为' ',命名空间''..
我认为Azure功能正在使用MessagingFactory.CreateMessageReceiver初始化消息泵但不是.
目前是否有对主题/订阅的支持?
我正在尝试了解Azure Service Bus上的重试策略,但是它没有按我期望的方式工作。我有以下代码,它们既侦听消息,又将消息发送到特定的天蓝色队列。
using System;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
namespace ServiceBusTester
{
class Program
{
static void Main(string[] args)
{
var connectionString = "Endpoint=sb://<NamespaceName>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<SharedAccessKey>";
var queueName = "MyTestQueue";
var retryPolicy = new RetryExponential(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(30), 15);
var ns = NamespaceManager.CreateFromConnectionString(connectionString);
ns.Settings.RetryPolicy = retryPolicy;
if (!ns.QueueExists(queueName))
ns.CreateQueue(queueName);
var mf = MessagingFactory.CreateFromConnectionString(connectionString);
mf.RetryPolicy = retryPolicy;
var mr = mf.CreateMessageReceiver(queueName);
mr.RetryPolicy = retryPolicy;
var retryCount = 0;
mr.OnMessage(_ =>
{
retryCount++;
Console.WriteLine($"{retryCount.ToString().PadLeft(4, ' ')} - Message Received: {_.GetBody<string>()}");
_.Abandon();
}, new OnMessageOptions() { AutoComplete …Run Code Online (Sandbox Code Playgroud) 我想使用n服务总线发布大量消息.我找到了一个重载的Publish方法,它将消息列表作为参数.当我尝试使用它时,它显示以下错误
var message= new Message
{
Id = id,
Timestamp = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local),
PublishingStartTimestamp = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local)
};
bus.Publish(new[] { message, message});
Run Code Online (Sandbox Code Playgroud)
错误:'NServiceBus.IBus.Publish(params T [])'已过时:'已删除以减少复杂性和API混淆.有关更多信息,请参阅https://github.com/Particular/NServiceBus/issues/1346.将在5.0.0版本中删除.
什么是发布大量邮件的替代方法. 我的任务是每秒发布600个事件. 有人可以帮忙吗?
提前致谢!
我们使用 Azure 服务总线队列在不同系统之间交换消息。我们想使用 Java 代码将无效消息移动到死信队列。
我能够将消息移动到主队列,但不能移动到死信队列。我试图将队列名称指定为“BasicQueue/$deadletterqueue”,但出现错误。
我有一种情况,我有一个 asp.net 核心应用程序,它在启动时将订阅客户端注册到一个主题 ( IHostedService),这个订阅客户端本质上有一个回调字典,每当它检测到一个主题中的新消息时,它就需要触发一个 id(这个 id 存储在消息属性中)。这本字典存在于应用程序的整个生命周期中,并且在内存中。
在 azure 上的 asp.net 核心应用程序服务的单个实例上一切正常,一旦我扩展到 2,我注意到有时订阅中的回调没有触发。这是有道理的,因为我们现在有两个实例,每个实例都有自己的回调字典存储。
所以我更新了代码来检查订阅的id是否存在,如果不存在,则放弃消息,如果存在,则获取回调并调用它。
public async Task HandleMessage(Microsoft.Azure.ServiceBus.Message message, CancellationToken cancellationToken)
{
var queueItem = this.converter.DeserializeItem(message);
var sessionId = // get the session id from the message
if (string.IsNullOrEmpty(sessionId))
{
await this.subscriptionClient.AbandonAsync(message.SystemProperties.LockToken);
return;
}
if (!this.subscriptions.TryGetValue(sessionId, out var subscription))
{
await this.subscriptionClient.AbandonAsync(message.SystemProperties.LockToken);
return;
}
await subscription.Call(queueItem);
// subscription was found and executed. Complete message
await this.subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
}
Run Code Online (Sandbox Code Playgroud)
但是,问题仍然存在。我唯一的猜测是,在调用时AbandonAsync,同一个实例再次接收消息?
我想我真正想问的是,如果我有多个主题订阅客户端实例都指向该主题的同一个订阅者,是否所有实例都可以获得消息的副本?或者是不能保证的。