service bus를 트리거로 하는 azure function을 로컬에서 테스트해볼 예정이다.
visual studio로 azure function 프로젝트를 설정했다.
using System;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace ServiceBusTriggerTest;
public class ServiceBusFunction
{
private readonly ILogger<ServiceBusFunction> _logger;
public ServiceBusFunction(ILogger<ServiceBusFunction> logger)
{
_logger = logger;
}
[Function(nameof(ServiceBusFunction))]
public async Task Run(
[ServiceBusTrigger("myqueue", Connection = "")]
ServiceBusReceivedMessage message,
ServiceBusMessageActions messageActions)
{
_logger.LogInformation("Message ID: {id}", message.MessageId);
_logger.LogInformation("Message Body: {body}", message.Body);
_logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);
// Complete the message
await messageActions.CompleteMessageAsync(message);
}
}
위 코드처럼 세팅이 된다. Azure Function은 그냥 프레임워크인 것 같다. 프로젝트를 보면 자동으로 local.settings.json 파일이 만들어진다.

서비스 버스 -> 큐 -> 설정 -> 공유 액세스 정책에서 기본 연결 문자열을 복사해서
local.settings.json에 넣어주면 된다.

큐이름과 설정한 키값을 넣어주면 자동으로 찾아준다.
로컬에서 실행을 시키면 끝이다. 아주 간단하다.
Service Bus 탐색기에서 메시지를 보낼 수 있다. 메시지를 보내게 되면 실행해놓은 azure function이 트리거 되어서 메시지를 받을 것이다.

피킹 모드와 수신 모드가 있다.
https://www.youtube.com/watch?v=-pRJ5L2rdHg
https://learn.microsoft.com/ko-kr/azure/service-bus-messaging/explorer
위 사이트를 참고하면 된다.
간단히 설명하면, 피킹 모드는 메시지를 소비하지 않고 확인하는 거라고 보면 된다. 큐에서 지워지지 않는다.
서비스 버스 트리거는 기본적으로 PeekLock 모드이다.
await messageActions.CompleteMessageAsync(message);
위 함수를 명시적으로 호출해주지 않아도 자동으로 완료 메시지를 보내게 되어있다.

위 사진 처럼 AutoCompleteMessages를 false로 처리하고 메시지를 보냈더니 정상으로 트리거 되어 메시지는 수신이 되는데

큐에 메시지가 쌓이는 것을 확인할 수 있었다.
추가로 throw new Exception("재시도를 위해 처리 실패를 강제합니다.");을 마지막에 넣어줬더니, 재시도를 반복하더니

배달 못한 편지로 옮겨지는 것을 확인할 수 있다.
서비스 버스를 트리거로 하여 Azure Function을 만들어봤는데 왜 C#으로 해야 하는지 알았다. 호환성이 좋고 개발하기 편한 것 같다. 그리고 문서화가 잘되어 있어서 편했다.