我正在创建一个作为 ServiceBus 触发器的 Azure 函数。
[FunctionName("RetryRack")]
public async Task Run([ServiceBusTrigger("%RackIntegration:topic%", "%RackIntegration:subscription%")] ServiceBusReceivedMessage sbMessage, ILogger log, MessageReceiver messageReceiver)
Run Code Online (Sandbox Code Playgroud)
我正在使用 Azure.Messaging.ServiceBus (7.6.0)。
当我使用同一库中的 ServiceBusMessage 发送消息时,我在消息中发送了几个自定义属性。我可以在 SB Explorer 中看到这些自定义属性,因此我知道它们设置正确。
现在,当我在函数中收到消息时,ApplicationProperties 为空。
谁能帮我弄清楚为什么当我知道从 SB Explorer 中正确设置了自定义属性时,当我收到消息时自定义属性没有被填充?
仅供参考,我在发送消息时设置了这样的属性。
message.ApplicationProperties.Add("@message.event","eventName");
Run Code Online (Sandbox Code Playgroud)
这是我用来发送消息的方法
public async Task SendMessage<T>(T messageObject)
{
ServiceBusMessage message = new ServiceBusMessage(JsonConvert.SerializeObject(messageObject));
message.ApplicationProperties.Add(MessageProperties.Event, "RackIntegration");
message.ApplicationProperties.Add(MessageProperties.Plant, "CNW");
try
{
await sender.SendMessageAsync(message);
}
finally
{
await sender.DisposeAsync();
await client.DisposeAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
一旦服务总线触发器收到消息,我就会尝试获取这样的自定义属性
string prop1 = receivedMessage.ApplicationProperties[MessageProperties.Event].toString();
Run Code Online (Sandbox Code Playgroud)
正如我在上面的屏幕打印中所示,当函数触发器检索消息时,ApplicationProperties 集合为空。
我编写了一个小型控制台应用程序来使用 ServiceBusProcessor 手动接收消息。当我这样做时,ApplicationProperties 已正确填充。
所以看来这是 Function ServiceBus 触发器的问题......也许?
我正在使用Window Server Service Bus 1.1。我可以使用以下基地址从Window Server Service Bus生成OAuth令牌
string baseAddressHttp = "https://" + ServerName + ":9355/" + Namespace + "/$STS/OAuth/";
Run Code Online (Sandbox Code Playgroud)
对于用于将消息发送到队列的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 WebClient();
webClient.Headers[HttpRequestHeader.Authorization] = token;
webClient.UploadData(baseAddress, "POST", Encoding.UTF8.GetBytes(message));
Run Code Online (Sandbox Code Playgroud)
但是对于窗口服务器服务总线,什么相同的技术不起作用。
Window Server Service Bus 1.1是否支持REST API?任何帮助将不胜感激。
提前致谢!!
我一直在阅读2013年4月推出的事件驱动消息编程模型,OnMessageOptions.ExceptionReceived 事件,内置RetryPolicy(2013年5月,RetryPolicy.Default),瞬态故障处理应用程序块(2011)已过时等等(见下).
我一直在监视通过消息泵收到的异常错误,我每天都会收到MessagingCommunicationExceptions.此文章(更新日期:2014年9月16日),提出以下建议:
此异常表示当无法成功建立从消息传递客户端到Service Bus基础结构的连接时可能出现的通信错误.在大多数情况下,如果存在网络连接,则可以将此错误视为瞬态错误.客户端可以尝试重试导致此类异常的操作.还建议您验证域名解析服务(DNS)是否可操作,因为此错误可能表示无法解析目标主机名.
我的理解是,在版本2.1(2013)之后,没有额外的代码可用于处理服务总线上的瞬态错误.除非我的前提是错误的,为什么我每天都会收到瞬态错误?是否应忽略通过消息泵收到的异常?如果忽略,我只能假设意外的异常也会被忽略..我当然不希望这种情况发生.
Microsoft.ServiceBus的版本是2.4.0.0
同样感兴趣:从1.x的升级Windows Azure的服务总线2.0 -重试政策,介绍了Windows Azure的服务总线事件驱动的消息编程模型,是什么在Azure的SDK 2.0版本(2013年4月)的新功能,什么是新Service Bus 2.1版本(2013年5月),瞬态故障处理.
我已使用WebJobs SDK将长时间运行的进程实现为WebJob.期待长时间运行的过程,因为我想要结果.
public async Task ProcessMessage([ServiceBusTrigger("queuename")] MyMessage message)
{
await Run(message.SomeProperty); // takes several minutes
// I want to do something with the result here later..
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的是为什么消息有时会被放弃,这当然会再次触发处理程序.我试图调试(本地),在ProcessMessage完成之前设置断点,我可以看到它似乎成功完成.
WebJobs SDK的Sevice Bus部分负责消息锁更新,因此就我所理解的而言,这应该不是问题.
我错过了什么以及如何排除故障?
由于公司的限制,我无法使用旧的Azure门户。但是我有一个在项目中使用ServiceBus的要求。我可以使用创建服务总线ns resource.azure.com,但是找不到找到该服务总线名称空间的连接字符串的方法。我尝试使用天蓝色的电源外壳,但是它也需要访问旧的天蓝色的门户……在此先感谢。
我正在尝试确定是否需要在Azure Service Bus上使用MassTransit或直接使用ASB.我不打算使用saga或中间件等高级功能,但需要一个支持命令和pub/sub样式消息传递的简单ESB.
有关选择运输的MassTransit文档仍在开发中.看看ASB文档,似乎Azure提供的不仅仅是传输.
我没有使用其他ESB的经验,所以我不确定我需要什么功能.
我正在寻找一些关于为什么我应该使用其中一个的指导.更具体一点:MassTransit仅提供ASB所必需的功能(如果有的话)?
我正在运行Visual Studio 2017 Preview并在本地运行功能代码,我正在使用开箱即用的Azure Function项目模板.我正在尝试使用定时器触发的Azure功能使用输出绑定将消息发送到服务总线队列,但看起来WebJob SDK无法将输出绑定到字符串类型.
捆绑
"bindings": [
{
"type": "serviceBus",
"name": "msg",
"queueName": "myqueue",
"connection": "ServiceBusQueue",
"accessRights": "manage",
"direction": "out"
}
]
Run Code Online (Sandbox Code Playgroud)
定时器功能
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
namespace MyFunctionApp
{
public static class TimerTrigger
{
[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("1 * * * * *", RunOnStartup = true)]TimerInfo myTimer, TraceWriter log, out string msg)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
msg = "Hello!";
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误信息
TimerTriggerCSharp:Microsoft.Azure.WebJobs.Host:错误索引方法'Functions.TimerTriggerCSharp'.Microsoft.Azure.WebJobs.Host:无法将参数'msg'绑定到String&.确保绑定支持参数Type.如果您正在使用绑定扩展(例如ServiceBus,Timers等),请确保您已在启动代码中调用扩展的注册方法(例如config.UseServiceBus(),config.UseTimers()等).
我错过了设置中的一个步骤,或者Service Bus绑定是否真的不支持out参数的字符串
我正在将.NET Core 2用于需要将消息放在Service总线上并由旧版.NET 4.6接收器读取的应用程序。接收者也收听来自其他传统应用程序的消息。
旧版寄件者:
UserData obj = new UserData()
{
id = 1,
name = "Alisha"
};
BrokeredMessage message = new BrokeredMessage(consentInstated);
_client.Send(message);
Run Code Online (Sandbox Code Playgroud)
旧版接收器:
var dataObj = objBrokeredMessage.GetBody<UserData>();
businessFunc(dataObj.id, dataObj.name);
Run Code Online (Sandbox Code Playgroud)
.NET Core 2发件人:如/sf/answers/3154859641/中所述
var ser = new System.Runtime.Serialization.DataContractSerializer(typeof(UserData));
var ms = new MemoryStream();
ser.WriteObject(ms, objUserData);
var message = new Message(ms.ToArray());
_client.Send(message);
Run Code Online (Sandbox Code Playgroud)
但是,收件人无法反序列化该消息并引发以下错误
System.Runtime.Serialization.SerializationException:反序列化UserData类型的对象时发生错误。输入源的格式不正确。---> System.Xml.XmlException:输入源的格式不正确。
如何使两个发送方与同一接收方一起工作?
我正在帮助调查和诊断我们遇到的一些问题,并注意到服务总线队列上的“用户错误”指标正在发生变化。我想确切了解此指标的含义,因为https://docs.microsoft.com/zh-cn/azure/service-bus-messaging/service-bus-metrics-azure-monitor中的文档有点模糊。
谢谢您的帮助。
如何使用Camel作为独立的Java应用程序使用Apache Camel访问Azure Service Bus?
azureservicebus ×10
azure ×5
c# ×4
servicebus ×3
.net-core ×1
apache-camel ×1
asp.net-core ×1
java ×1
masstransit ×1
queue ×1
rest ×1
retrypolicy ×1