使用 AMQP、rhea 和 Node 从 Azure 服务总线队列查看消息时获取 "amqp:internal-error"
Getting "amqp:internal-error" when peeking messages from Azure Service Bus Queue using AMQP, rhea and Node
几天前我问了同样的问题:Unable to "Peek" messages from an Azure Service Bus Queue using AMQP and Node。我再次问同样的问题,但有一些不同(因此,请不要将此问题标记为另一个问题的重复):
- 在上一个问题中,我使用的是
nodeamqp10
库,但是根据该库 Github 页面上的一些评论,我最终使用 rhea
而不是 nodeamqp10
图书馆。
- 在 Azure 服务总线团队的帮助下,我取得了一些进展,现在我从 Azure 服务总线返回错误,告诉我我走在正确的轨道上。
这是我使用的新代码:
var client = require('rhea');
const keyName = 'MyCustomPolicy';
const sasKey = 'SAS Key'
const serviceBusHost = 'account.servicebus.windows.net';
const queueName = '003';
client.on('connection_open', (context) => {
context.connection.open_sender({
target: { address: `${queueName}/$management` }
});
});
client.once('sendable', (context) => {
console.log('messages can be sent now....');
var receiver = context.connection.open_receiver({
source: { address: `${queueName}/$management` },
autoaccept: false,
target: { address: 'receiver-link' }
});
receiver.once('receiver_open', (context) => {
console.log('receiver is now open....');
});
receiver.once('message', (context) => {
console.log('message received by receiver....');
console.log(context.message);
});
var messageBody = {
'from-sequence-number': 1,
'message-count': 5
};
const msg = {
application_properties: {
operation: 'com.microsoft:peek-message'
},
body: client.types.wrap_map(messageBody),
reply_to: 'receiver-link'
};
context.sender.send(msg);
console.log('message sent....');
});
client.connect({
transport: 'tls',
host: serviceBusHost,
hostname: serviceBusHost,
username: keyName,
password: sasKey,
port: 5671,
reconnect_limit: 10
});
现在,当我 运行 此代码时,我从 Azure 服务总线收到 500
错误:
{
"application_properties":
{
"statusCode":500,
"errorCondition":"amqp:internal-error",
"statusDescription":"The service was unable to process the request; please retry the operation. For more information on exception types and proper exception handling, please refer to http://go.microsoft.com/fwlink/?LinkId=761101 Reference:ab667ed6-1565-4728-97b7-6ae4a33468b9, TrackingId:538f93a1-2c07-4bc0-bf41-dc00d7ae963c_B13, SystemTracker:account-name:Queue:003, Timestamp:8/2/2018 7:43:52 AM",
"com.microsoft:tracking-id":"538f93a1-2c07-4bc0-bf41-dc00d7ae963c_B13"
}
}
我什至检查了错误消息中包含的 link (http://go.microsoft.com/fwlink/?LinkId=761101),但没有提到 link.
中与 amqp 相关的错误
与上一个问题一样,如果我只使用地址作为队列名称而不是 queue-name/$management
,我能够获取消息,但消息被锁定并且消息的传递计数正在增加。此外,它返回队列中的所有消息,而不是我请求的 5 条消息。
我不确定我做错了什么。有人可以帮忙吗?
在 Azure 服务总线团队的帮助下,我找到了这个问题的解决方案(事实上,他们给了我这个解决方案)。本质上 messageBody
的元素应该使用 AMQP 类型正确编码。
以下代码有效:
var messageBody = {
'from-sequence-number': client.types.wrap_long(1),
'message-count': client.types.wrap_int(5)
};
const msg = {
application_properties: {
operation: 'com.microsoft:peek-message'
},
body: messageBody,
reply_to: 'receiver-link'
};
几天前我问了同样的问题:Unable to "Peek" messages from an Azure Service Bus Queue using AMQP and Node。我再次问同样的问题,但有一些不同(因此,请不要将此问题标记为另一个问题的重复):
- 在上一个问题中,我使用的是
nodeamqp10
库,但是根据该库 Github 页面上的一些评论,我最终使用rhea
而不是nodeamqp10
图书馆。 - 在 Azure 服务总线团队的帮助下,我取得了一些进展,现在我从 Azure 服务总线返回错误,告诉我我走在正确的轨道上。
这是我使用的新代码:
var client = require('rhea');
const keyName = 'MyCustomPolicy';
const sasKey = 'SAS Key'
const serviceBusHost = 'account.servicebus.windows.net';
const queueName = '003';
client.on('connection_open', (context) => {
context.connection.open_sender({
target: { address: `${queueName}/$management` }
});
});
client.once('sendable', (context) => {
console.log('messages can be sent now....');
var receiver = context.connection.open_receiver({
source: { address: `${queueName}/$management` },
autoaccept: false,
target: { address: 'receiver-link' }
});
receiver.once('receiver_open', (context) => {
console.log('receiver is now open....');
});
receiver.once('message', (context) => {
console.log('message received by receiver....');
console.log(context.message);
});
var messageBody = {
'from-sequence-number': 1,
'message-count': 5
};
const msg = {
application_properties: {
operation: 'com.microsoft:peek-message'
},
body: client.types.wrap_map(messageBody),
reply_to: 'receiver-link'
};
context.sender.send(msg);
console.log('message sent....');
});
client.connect({
transport: 'tls',
host: serviceBusHost,
hostname: serviceBusHost,
username: keyName,
password: sasKey,
port: 5671,
reconnect_limit: 10
});
现在,当我 运行 此代码时,我从 Azure 服务总线收到 500
错误:
{
"application_properties":
{
"statusCode":500,
"errorCondition":"amqp:internal-error",
"statusDescription":"The service was unable to process the request; please retry the operation. For more information on exception types and proper exception handling, please refer to http://go.microsoft.com/fwlink/?LinkId=761101 Reference:ab667ed6-1565-4728-97b7-6ae4a33468b9, TrackingId:538f93a1-2c07-4bc0-bf41-dc00d7ae963c_B13, SystemTracker:account-name:Queue:003, Timestamp:8/2/2018 7:43:52 AM",
"com.microsoft:tracking-id":"538f93a1-2c07-4bc0-bf41-dc00d7ae963c_B13"
}
}
我什至检查了错误消息中包含的 link (http://go.microsoft.com/fwlink/?LinkId=761101),但没有提到 link.
中与 amqp 相关的错误与上一个问题一样,如果我只使用地址作为队列名称而不是 queue-name/$management
,我能够获取消息,但消息被锁定并且消息的传递计数正在增加。此外,它返回队列中的所有消息,而不是我请求的 5 条消息。
我不确定我做错了什么。有人可以帮忙吗?
在 Azure 服务总线团队的帮助下,我找到了这个问题的解决方案(事实上,他们给了我这个解决方案)。本质上 messageBody
的元素应该使用 AMQP 类型正确编码。
以下代码有效:
var messageBody = {
'from-sequence-number': client.types.wrap_long(1),
'message-count': client.types.wrap_int(5)
};
const msg = {
application_properties: {
operation: 'com.microsoft:peek-message'
},
body: messageBody,
reply_to: 'receiver-link'
};