배치작업 WebJob
Ex) 일일 재고수준 파악 후 외부 서비스에 보고
Azure function 말고 , 웹작업으로 하고 싶은 경우
그리고 기존 웹서비스에는 영향없이 백그라운드로 돌리고 싶은 경우
Ex) 고해상도이미지들 -> 썸네일 추출
특정 DB 프로시져 호출하는 웹 job 도 가능
모두 지원
Windows 배치 파일
PowerShell 스크립트
Bash 셸 스크립트
업로드 가능
Visual Studio를 사용하여 웹 작업을 컴파일된 콘솔 애플리케이션으로도 가능
파이썬 , node.js 기반
크게 두 종류
연속
트리거
Auzre Function 과 Webjob의 차이점
거의 같으나 ,
Fuction
WebJob
기존 웹소스와 별개로 관리
기존 웹소스와 하나의 패키지로 관리가능
JobHost 개체의 동작에 대해 더 정교하게 제어할 수 있다
VS 에서 실습
콘솔애플리케이션을 만들어 , webjob템플릿 사용가능, 기존 웹앱 솔루션에 추가
각 프로그램, config 설명
Program.cs
애플리케이션의 진입점인 Main() Main 에서 JobHost개체를 시작하고 구성
JobHost 는 웹 작업이 배포된 후 Azure와 통신하는 개체
new H ostBuilder ()
Functions.cs
웹 작업이 실행하는 실제 작업 내용 코딩
settings.json
cron 식으로 일정 기록
{ "schedule" : "0 0 12 * * ?" }
App.config
DB 연결 , Azure Storage 정보 등 연결문자열 기록
functions.json
바인딩을 사용하려면 사용
Direction in / out
CRON 식
설명
0 0 12 * * ?
매일 낮 12시에 실행
0 15 10 * * ?
매일 오전 10시 15분에 실행
0 15 10 ? * MON-FRI
매주 평일 오전 10시 15분에 실행
0 15 10 ? * 6L
매월 마지막 주 금요일 10시 15분에 실행
APP 템플릿 통해서 만들면 , 아래와 같은 네임스페이스가 그냥 들어오겠지 ?
타 프로그램에서 활용하려면 위와 같은 네임스페이스 추가
예시 )
Azure Storage SDK를 사용하여 설정된 간격으로 스토리지 계정에 큐 메시지를 만듭니다.
스토리지 계정에서 로그 확인 가능
단순하게 , 특정 메시지 ( 시간기록 ) Azure Queue 에 기록
var queue = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageAccount"].ConnectionString)
.CreateCloudQueueClient()
.GetQueueReference("stockchecks");
queue.CreateIfNotExists();
while (true)
{
var timestamp = DateTimeOffset.UtcNow.ToString("s");
var message = new CloudQueueMessage($"Stock check at {timestamp} completed");
queue.AddMessage(message);
Thread.Sleep(TimeSpan.FromSeconds(30));
}
Main 함수에 아래와 같이 사용
( 기존 무한루프 형식 안써도 됨 )
static void Main(string[] args)
{
var builder = new HostBuilder ();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
});
var host = builder.Build();
using (host)
{
host.Run();
}
}
< 바인딩 >
아래 각종 트리거를 바인딩하는 형태 예시
각 트리거 발동 시 비즈니스 로직 수행하도록 개발
바인딩을 사용하려면 웹 프로젝트에 functions.jso n 에 기록 Direction in/out 이 있음
Azure 큐에 메시지가 들어올때
public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger)
{
logger.LogInformation(message);
}
Azure Storage 에 신규 blob파일이 추가될때
[FunctionName("BlobTriggerCSharp")]
public static void Run([BlobTrigger("watchescontainer/{name}")] Stream watchInstructions, string name, ILogger log)
{
log.LogInformation($"A new blob was added.\n Name:{name} \n Size: {watchInstructions.Length}");
}
Azure CosmosDB 에 신규 데이터가 들어올 때 특정 database명 , 컬력션명 지정
[FunctionName("CosmosTrigger")]
public static void Run([CosmosDBTrigger(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
LeaseCollectionName = "leases",
CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
TraceWriter log)
{
if (documents != null && documents.Count > 0)
{
log.Info($"Documents modified: {documents.Count}");
log.Info($"First document Id: {documents[0].Id}");
}
}
추가 예시
기존 ProcessQueueMessage 메서드를 아래와 같이 바꿔서 사용가능
public static void ConfirmStockCheck([QueueTrigger(" stockchecks ")] string message, [Blob("confirmations/{id}")] out string output)
{
var timestamp = message.Split()[3];
output = $"{timestamp} stock check successfully processed";
}
stockchecks 큐 의 메시지를 처리하고 해당 메시지를 사용하여 confirmations 컨테이너 에 BLOB을 만듭니다. 웹 작업 SDK는 stockchecks 큐의 모든 메시지에 대해 이 함수를 한 번 호출하며, message 매개 변수는 메시지 내용을 포함합니다. output 의 값은 confirmations 컨테이너의 새 BLOB에 자동으로 기록됩니다. 새 BLOB의 이름은 함수를 트리거한 큐에서 수신된 메시지의 메시지 ID 입니다.