파란색 서비스 버스 대기열을 한 번에 지웁니다.
프로젝트에서는 서비스 버스 큐를 사용하고 있습니다.관리자가 큐를 클리어하도록 선택한 경우 큐에서 모든 메시지를 삭제하는 기능이 필요합니다.했지만, 이 기능은 .QueueClient
를 누릅니다
큐를 클리어하기 위해 모든 메시지를 하나씩 팝한 후 완료로 표시해야 합니까?아니면 더 좋은 방법이 있나요?
QueueClient queueClient = _messagingFactory.CreateQueueClient(
queueName, ReceiveMode.PeekLock);
BrokeredMessage brokeredMessage = queueClient.Receive();
while (brokeredMessage != null )
{
brokeredMessage.Complete();
brokeredMessage = queueClient.Receive();
}
이것은, Azure 포털로부터 간단하게 실시할 수 있습니다.
지난 14일 동안 저장된 큐메시지가 걱정되지 않고 큐를 즉시 클리어할 경우 메시지 라이브 시간을 5초 또는 10초로 변경하고 5~10초간 기다립니다.
중요 절차: 몇 초 후 큐에서 수신하여 강제로 업데이트를 시도합니다.
모든 큐 메시지가 클리어 됩니다.원래 값을 다시 설정할 수 있습니다. 기본값은 14일입니다.
「 」의 Receive()
while 하면 while loop이 비어 됩니다.Receive()
메서드는 큐에 다른 메시지가 나타나기를 기다립니다.
을하십시오.Peek()
★★★★★★ 。
예를 들어 다음과 같습니다.
while (queueClient.Peek() != null)
{
var brokeredMessage = queueClient.Receive();
brokeredMessage.Complete();
}
하면 다시 할수 있어요.ReceiveMode.ReceiveAndDelete
호쵸가 말한 바와 같이
사용방법:
- 양쪽 접근법(@ScottBrady와 @participant)
- MessageReceiver 추상화
서비스 버스 큐 또는 토픽/설명을 비우는 메서드를 작성할 수 있습니다.
MessageReceiver messageReceiver = ...
while (messageReceiver.Peek() != null)
{
// Batch the receive operation
var brokeredMessages = messageReceiver.ReceiveBatch(300);
// Complete the messages
var completeTasks = brokeredMessages.Select(m => Task.Run(() => m.Complete())).ToArray();
// Wait for the tasks to complete.
Task.WaitAll(completeTasks);
}
질문을 읽었을 때 첫 번째로 생각한 것은 큐를 삭제하고 다시 작성하는 것이 어떻겠느냐는 것이었습니다.그게 접근법일 수도 있어그러나 원하지 않는 경우 메시지가 남아 있지 않을 때까지 각 메시지를 수신하고 삭제할 수 있습니다.
최신 Azure 서비스 버스를 사용할 수 있습니다.NET 라이브러리 Azure.메시지두 접근 방식 모두 ServiceBus입니다.
- 하여 큐를 삭제하고 .
AdministrationClient
using Azure.Messaging.ServiceBus.Administration;
ServiceBusAdministrationClient adminClient = new ServiceBusAdministrationClient("<connectionstring>");
await adminClient.DeleteQueueAsync("myqueue");
await adminClient.CreateQueueAsync("myqueue");
★★★★★★ServiceBusAdministrationClient
는 기존 서비스 버스 이름 공간에서의 CRUD 조작용입니다.네임스페이스를 작성하는 기능도 필요한 경우는, Microsoft 를 사용해 주세요.Azure, 관리직입니다.대신 ServiceBus 라이브러리를 사용합니다.
- 메시지가 없을 때까지 수신 및 삭제
using Azure.Messaging.ServiceBus;
await using var client = new ServiceBusClient("<connectionstring>");
ServiceBusReceiver receiver = client.CreateReceiver("myqueue",
new ServiceBusReceiverOptions { ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete });
while ((await receiver.PeekMessageAsync()) != null)
{
// receive in batches of 100 messages.
await receiver.ReceiveMessagesAsync(100);
}
ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete
자동 조절이 가능합니다.는, 「」입니다.PeekLock
큐에서 실제로 메시지가 삭제되지는 않습니다.수신 클라이언트가 수신한 메시지를 명시적으로 해결하고 싶다고 서비스 버스에 알립니다.잠금 부분은 잠금 기간 동안 경쟁 수신자가 메시지에 액세스할 수 없음을 의미합니다.
Peek를 사용하지 않고 ReceiveAndDelete, PrefetchCount, ReceiveBatchAsync 및 단순한 진실 루프를 조합하여 좋은 결과를 얻고 있습니다.다음 Messaging Factory의 예:
var receiverFactory = MessagingFactory.CreateFromConnectionString("ConnString");
var receiver = receiverFactory.CreateMessageReceiver("QName", ReceiveMode.ReceiveAndDelete);
receiver.PrefetchCount = 300;
bool loop = true;
while (loop)
{
var messages = await receiver.ReceiveBatchAsync(300, TimeSpan.FromSeconds(1));
loop = messages.Any();
}
WindowsAzure만 필요합니다.ServiceBus Nuget 패키지
Azure-ServiceBus-Queues에는 n-메시지의 배지를 동시에 수신할 수 있는 - 방식이 있습니다.와의 조합ReceiveMode.ReceiveAndDelete
큐를 보다 효율적으로 클리어할 수 있습니다.
경고 n개의 메시지가 반환될 수 있지만 보장되지는 않습니다.또한 메시지 배치 크기에는 256K의 제한이 있습니다.
Azure ServiceBus 큐를 청소하는 가장 빠른 방법은 매우 짧게 설정하는 것입니다.DefaultMessageTimeToLive
, 잠시 기다려 주세요.큐에서 수신을 강제로 갱신하고 초기화를 복원합니다.DefaultMessageTimeToLive
.
포털 또는 코드에서 실행할 수 있습니다.
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
var queueDescription = _namespaceManager.GetQueue(queueName);
var queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName, ReceiveMode.ReceiveAndDelete);
var dl = queueDescription.EnableDeadLetteringOnMessageExpiration;
var ttl = queueDescription.DefaultMessageTimeToLive;
queueDescription.EnableDeadLetteringOnMessageExpiration = false;
queueDescription.DefaultMessageTimeToLive = TimeSpan.FromSeconds(1);
Thread.Sleep(5000);
var dumy = queueClient.ReceiveBatch(200, TimeSpan.FromSeconds(1)).ToArray();
queueDescription.EnableDeadLetteringOnMessageExpiration = dl;
queueDescription.DefaultMessageTimeToLive = ttl;
심플한 것이 있습니다.Clear()
WindowsAzure 를 사용하고 있는 경우는, 큐 전체를 클리어 합니다.nuget의 스토리지 라이브러리.사용하다Microsoft.Windows.Azure.Queue
큐를 관리할 수 있습니다.그렇지 않으면 문서에 따라 API를 통해 액세스할 수 있습니다.이 메서드가 Azure 라이브러리에 얼마나 오래 존재했는지 알 수 없으며, 처음 질문을 받았을 때는 존재하지 않았을 수도 있지만, REST API는 이 Azure 피드백 게시물에 따르면 적어도 2014년부터 거슬러 올라갑니다.
풀.Azure 라이브러리에서 큐를 클리어하기 위한 NET 코드는 다음과 같습니다.
string connectionString = "YourAzureConnectionStringHere";
string queueName = "YourWebJobQueueName";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
// Create the queue client, then get a reference to queue
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
queue = queueClient.GetQueueReference(GetQueueName(queueName));
// Clear the entire queue
queue.Clear();
- 큐 서비스 REST API를 사용합니다(테스트되지 않음).
[메시지 클리어(Clear Messages)]조작에 의해 지정된 큐에서 모든 메시지가 삭제됩니다.
https://myaccount.queue.core.windows.net/myqueue/messages 삭제
계정 소유자만 이 작업을 호출할 수 있습니다.
추신. URL이 잘못된 것 같습니다.대신 https://myaccount.servicebus.windows.net/myqueue/messages 를 사용해 보세요.
출처 : https://learn.microsoft.com/en-us/rest/api/storageservices/clear-messages
아니면...
- 루프(테스트)에서 메시지를 하나씩 삭제하는 논리 앱을 만듭니다.
언급URL : https://stackoverflow.com/questions/9920323/clearing-azure-service-bus-queue-in-one-go
'itsource' 카테고리의 다른 글
Swift를 사용하여 iOS에서 문자열을 MD5 해시로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
---|---|
WPF C# 패스: 패스 데이터가 있는 문자열에서 코드(XAML 이외)로 지오메트리로 이동하는 방법 (0) | 2023.04.22 |
Objective-C의 typedef 열거란 무엇입니까? (0) | 2023.04.22 |
신호로 인해 명령이 실패했습니다.세그멘테이션 장애: 11 (0) | 2023.04.17 |
테이블이 존재하는지 확인하고 존재하지 않는 경우 SQL Server 2008에서 생성합니다. (0) | 2023.04.17 |