Azure 服务总线主题上下文中的 Receive 和 Peek 有什么区别?
我有一个在 azure web 作业中处理的主题和订阅,但在一定数量的重试后,一些消息应该被移动到死信(队列或主题?)。我不知道处理死信消息需要什么。有人有代码示例吗?这对 azure web 工作有可能吗?
我几乎要放弃并使用重试计数器手动完成。目前,这就是我正在做的,但我真的不喜欢将消息添加回同一个队列的想法:
public void SynchronizeConsumer(
[ServiceBusTrigger("topic")] Consumer consumer,
[ServiceBus("topic")] ICollector withError)
{
try
{
this.consumerSync.SyncConsumer(consumer);
}
catch (Exception ex)
{
consumer.NbOfRetries++; consumersWithError.Add(consumer);
}
}
Run Code Online (Sandbox Code Playgroud) azure azureservicebus azure-webjobs azure-webjobssdk azure-servicebus-topics
我想将消息推送到 azure 服务总线,比如大小为 3 MB。为此,我写道:
QueueInfo queueInfo = new QueueInfo("sq-jcibe-microservice-plm-qa");
long maxSizeInMegabytes = 5120;
queueInfo.setMaxSizeInMegabytes(maxSizeInMegabytes);
service.updateQueue(queueInfo);
service.sendQueueMessage("sq-jcibe-microservice-plm-qa", brokeredMessage);
Run Code Online (Sandbox Code Playgroud)
我收到以下异常。
com.microsoft.windowsazure.exception.ServiceException: com.sun.jersey.api.client.UniformInterfaceException: PUT https://sb-jcibe-microservice-qa.servicebus.windows.net/sq-jcibe-microservice-plm-qa?api-version=2013-07 returned a response status of 400 Bad Request
Response Body: <Error><Code>400</Code><Detail>SubCode=40000. For a Partitioned Queue, ordering is supported only if RequiresSession is set to true.
Parameter name: SupportOrdering. TrackingId:59bb3ae1-95f9-45e1-8896-d0f6a9ac2be8_G3, SystemTracker:sb-jcibe-microservice-qa.servicebus.windows.net:sq-jcibe-microservice-plm-qa, Timestamp:11/30/2016 4:52:22 PM</Detail></Error>
Run Code Online (Sandbox Code Playgroud)
我不明白这是什么意思,我应该如何解决这个问题。请帮我解决这个问题。?
我设置了一个名为“state-changed”的 Azure 服务总线主题,并且它有一个名为“reverb”的订阅。我正在尝试设置一种方法来@JmsListener订阅该主题,但收到错误:
2017-03-22 18:34:41.049 WARN 23356 --- [enerContainer-6] o.s.j.l.DefaultMessageListenerContainer : Setup of JMS message listener invoker failed for destination 'state-changed' - trying to recover. Cause: The messaging entity 'sb://[MySERVICEBUS].servicebus.windows.net/state-changed' could not be found. TrackingId:d2b442f79e0f44bdb449861ea57155ce_G44, SystemTracker:gateway6, Timestamp:3/22/2017 6:34:37 PM
javax.jms.JMSException: The messaging entity 'sb://[MySERVICEBUS].servicebus.windows.net/state-changed' could not be found. TrackingId:d2b442f79e0f44bdb449861ea57155ce_G44, SystemTracker:gateway6, Timestamp:3/22/2017 6:34:37 PM
at org.apache.qpid.amqp_1_0.jms.impl.TopicSubscriberImpl.createClientReceiver(TopicSubscriberImpl.java:111) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32]
at org.apache.qpid.amqp_1_0.jms.impl.MessageConsumerImpl.<init>(MessageConsumerImpl.java:129) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32]
at org.apache.qpid.amqp_1_0.jms.impl.TopicSubscriberImpl.<init>(TopicSubscriberImpl.java:46) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32]
at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createDurableSubscriber(SessionImpl.java:544) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32]
at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createDurableSubscriber(SessionImpl.java:59) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32]
at org.springframework.jms.listener.AbstractMessageListenerContainer.createConsumer(AbstractMessageListenerContainer.java:870) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer(AbstractPollingMessageListenerContainer.java:215) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1189) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at …Run Code Online (Sandbox Code Playgroud) 我正在使用 Microsoft.Azure.ServiceBus, Version=2.0.0.0 程序集连接到 Azure 主题。代码如下
public void SendMessage(Message brokeredMessage)
{
var topicClient = new TopicClient(_configuration.ConnectionString, topicName, _defaultRetryPolicy);
await topicClient.SendAsync(brokeredMessage);
await topicClient.CloseAsync();
}
Run Code Online (Sandbox Code Playgroud)
我想知道每次需要向主题发送消息时创建主题客户端是否是一个好习惯,还是应该在应用程序启动时创建主题客户端并在每次需要发送消息时继续使用相同的客户端?
我需要考虑任何性能或可扩展性问题吗?
Azure 服务总线上有哪些开放端口?
我可以找到有关其他端口(例如 9350-9354、5671、5672 等)的文档,但找不到上面列表中的文档。我需要记录这些以对项目进行渗透测试。
问候, 莫腾
更新:下面是服务总线端点的 NMap 扫描的屏幕截图
我正在尝试从 azure 函数向 azure 消息队列添加消息。为此,我正在关注这篇文章,其中我添加了对 Microsoft.Azure.ServiceBus 的引用。
尝试添加此引用时,Visual Studio 2017 中的 Azure 函数项目会抱怨 Newtonsoft.Json (=9.0.1) 相对于 Microsoft.NET.Sdk.Functions 引用的受限版本。
检测到 Newtonsoft.Json 的版本冲突。将 Newtonsoft.Json 10.0.1 直接安装/引用到项目 IHA.Functions 以解决此问题。IHA.Functions -> Microsoft.Azure.ServiceBus 3.1.0 -> System.IdentityModel.Tokens.Jwt 5.2.2 -> Newtonsoft.Json (>= 10.0.1)
IHA.Functions -> Microsoft.NET.Sdk.Functions 1.0 .14 -> Newtonsoft.Json (= 9.0.1)。IHA.Functions C:\TFS\IHA\Misc\IHA.CSL\IHA.Functions\IHA.Functions.csproj 1
据我了解,Microsoft.Azure.ServiceBus 需要 Newtonsoft.Json 10.0.1。如果我删除9.0版本并添加10.0版本,我可以成功添加Microsoft.Azure.ServiceBus包,但是Azure Functions项目抱怨Microsoft.NET.Sdk.Functions需要9.0的Newtonsoft。
基于这些理解,我似乎无法从 Azure 函数写入 Azure 消息队列。这是正确的还是我做错了什么?
我正在做一个项目,我想在 Web 作业中实现 Service Buss 触发器。我已按照此处的说明进行操作:https : //docs.microsoft.com/en-us/azure/app-service/webjobs-sdk-get-started。
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger)
{
logger.LogInformation(message);
}
}
Run Code Online (Sandbox Code Playgroud)
但我想使用 ServiceBus 的 Microsoft.Azure.WebJobs.ServiceBusTrigger 而不是存储队列 (QueueTrigger)。在文档中声明使用以下内容:https : //docs.microsoft.com/en-us/azure/app-service/webjobs-sdk-how-to#service-bus-trigger-configuration-version-3x
static void Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddServiceBus(sbOptions =>
{
sbOptions.MessageHandlerOptions.AutoComplete = true;
sbOptions.MessageHandlerOptions.MaxConcurrentCalls = 16;
});
});
var host = builder.Build();
using (host)
{
host.Run();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,问题是 b.AddServiceBus 甚至不可用(我有最新的 Web 作业版本)。因此,当我运行该项目时,出现“未找到工作职能”错误。任何想法或指示?
我确实尝试过:
public static void ProcessQueueMessage([Microsoft.Azure.WebJobs.ServiceBusTrigger("queue")] string …Run Code Online (Sandbox Code Playgroud) 使用服务总线触发器创建 Azure 函数并部署在 azure 门户中。使用 servicebusexplorer,将队列发送到门户并正常工作。但是在azure中停止该功能后,将消息从资源管理器发送到visual studio中的本地代码进行调试。但它不会火。
我在 local.settings.json 中给出了服务连接字符串,队列名称是正确的。从 Visual Studio 运行该函数后,它会在 azure CLI 中抛出错误。
错误:
MessageReceiver 错误 (Action=Receive, ClientId=MessageReq.queue, Endpoint=sss-bbbb.servicebus.windows.net)xxxxx.queue, EntityPath=sss.ccccc
Microsoft.Azure.ServiceBus:连接尝试失败,因为连接方没有一段时间后正常响应,或建立连接失败,因为连接的主机未能响应 ErrorCode: TimedOut。System.Private.CoreLib:连接尝试失败,因为连接方在一段时间后没有正确响应,或者因为连接的主机没有响应而建立连接失败。
本地设置.json
{
"IsEncrypted": false,
"Values":
{
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"AzureWebJobsDashboard": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"ServiceBusConnectionString": "Endpoint=//",
"RequestTimeout": "600000"
}
Run Code Online (Sandbox Code Playgroud) azureservicebus azure-servicebus-queues azure-functions visual-studio-2017 service-bus-explorer
我们正在接收来自 Azure 服务总线队列的消息。队列上的接收者(消息处理程序)调用应用程序服务,更新 SQL 数据库表中的百万条记录,处理时间超过 30 分钟。
Azure 服务总线队列是否有超时限制?这会导致 SQL 表进程停止更新行吗?
正在发送的实际服务总线消息队列非常小,它只是一个Year和ProductType。然后app service方法会带上这两个参数,更新整个sql表。
Azure 服务总线队列方法 ---> 服务总线消息接收(事件处理程序)---> 调用应用服务更新 SQL 表
.net azure azureservicebus azure-servicebus-queues asp.net-core