빠른 시작: Java Durable Functions 앱 만들기
이 문서의 내용
필수 조건
프로젝트에 필요한 종속성 및 플러그인 추가
필요한 JSON 파일 추가
함수 만들기
Maven 명령을 사용하여 로컬 프로젝트 만들기
백 엔드 스토리지 공급자 구성
로컬 프로젝트 만들기
프로젝트 항목에 함수 추가
pom.xml 및 host.json 구성
로컬에서 함수 테스트
6개 더 표시
Azure Functions 의 기능인 Durable Functions를 사용하여 서버리스 환경에서 상태 저장 함수를 작성합니다. Durable Functions는 애플리케이션에서 상태, 검사점 및 다시 시작을 관리합니다.
이 빠른 시작에서는 Java로 "hello world" Durable Functions 앱을 만들고 테스트해 봅니다.
가장 기본적인 Durable Functions 앱에는 다음 세 가지 함수가 있습니다.
오케스트레이터 함수 : 다른 함수를 오케스트레이션하는 워크플로입니다.
작업 함수 : 오케스트레이터 함수에 의해 호출되는 함수로, 작업을 수행하고 선택적으로 값을 반환합니다.
클라이언트 함수 : 오케스트레이터 함수를 시작하는 Azure의 일반 함수입니다. 이 예에서는 HTTP 트리거 함수를 사용합니다.
이 빠른 시작에서는 이 "hello world" 앱을 만드는 다양한 방법을 설명합니다. 페이지 맨 위에 있는 선택기를 사용하여 선호하는 방식을 설정하세요.
이 빠른 시작을 완료하려면 다음이 필요합니다.
Azure를 구독 하고 있지 않다면 시작하기 전에 Azure 체험 계정 을 만듭니다.
pom.xml 파일에 다음 코드를 추가합니다.
<properties>
<azure.functions.maven.plugin.version>1.18.0</azure.functions.maven.plugin.version>
<azure.functions.java.library.version>3.0.0</azure.functions.java.library.version>
<durabletask.azure.functions>1.0.0</durabletask.azure.functions>
<functionAppName>your-unique-app-name</functionAppName>
</properties>
<dependencies>
<dependency>
<groupId>com.microsoft.azure.functions</groupId>
<artifactId>azure-functions-java-library</artifactId>
<version>${azure.functions.java.library.version}</version>
</dependency>
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>durabletask-azure-functions</artifactId>
<version>${durabletask.azure.functions}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-functions-maven-plugin</artifactId>
<version>${azure.functions.maven.plugin.version}</version>
<configuration>
<appName>${functionAppName}</appName>
<resourceGroup>java-functions-group</resourceGroup>
<appServicePlanName>java-functions-app-service-plan</appServicePlanName>
<region>westus</region>
<runtime>
<os>windows</os>
<javaVersion>11</javaVersion>
</runtime>
<appSettings>
<property>
<name>FUNCTIONS_EXTENSION_VERSION</name>
<value>~4</value>
</property>
</appSettings>
</configuration>
<executions>
<execution>
<id>package-functions</id>
<goals>
<goal>package</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
프로젝트 디렉터리에 host.json 파일을 추가합니다. 다음 예와 유사해야 합니다.
{
"version": "2.0",
"logging": {
"logLevel": {
"DurableTask.AzureStorage": "Warning",
"DurableTask.Core": "Warning"
}
},
"extensions": {
"durableTask": {
"hubName": "JavaTestHub"
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
참고
현재 Azure Functions v4 확장 번들만 Java용 Durable Functions에 필요한 지원 기능을 제공합니다. Java용 Durable Functions는 v3 및 초기 확장 번들에서 지원되지 않습니다 . 확장 번들에 대한 자세한 내용은 확장 번들 설명서 를 참조하세요.
Durable Functions에서 런타임 상태를 저장하려면 저장소 공급자가 필요합니다. local.settings.json 파일을 프로젝트 디렉터리에 추가하여 스토리지 공급자를 구성합니다. Azure Storage를 공급자로 사용하려면 AzureWebJobsStorage
의 값을 Azure Storage 계정의 연결 문자열로 설정합니다.
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
다음 샘플 코드는 각 함수 유형의 기본적인 예를 보여줍니다.
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
import java.util.*;
import com.microsoft.durabletask.*;
import com.microsoft.durabletask.azurefunctions.DurableActivityTrigger;
import com.microsoft.durabletask.azurefunctions.DurableClientContext;
import com.microsoft.durabletask.azurefunctions.DurableClientInput;
import com.microsoft.durabletask.azurefunctions.DurableOrchestrationTrigger;
public class DurableFunctionsSample {
/**
* This HTTP-triggered function starts the orchestration.
*/
@FunctionName("StartOrchestration")
public HttpResponseMessage startOrchestration(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
@DurableClientInput(name = "durableContext") DurableClientContext durableContext,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
DurableTaskClient client = durableContext.getClient();
String instanceId = client.scheduleNewOrchestrationInstance("Cities");
context.getLogger().info("Created new Java orchestration with instance ID = " + instanceId);
return durableContext.createCheckStatusResponse(request, instanceId);
}
/**
* This is the orchestrator function, which can schedule activity functions, create durable timers,
* or wait for external events in a way that's completely fault-tolerant.
*/
@FunctionName("Cities")
public String citiesOrchestrator(
@DurableOrchestrationTrigger(name = "taskOrchestrationContext") TaskOrchestrationContext ctx) {
String result = "";
result += ctx.callActivity("Capitalize", "Tokyo", String.class).await() + ", ";
result += ctx.callActivity("Capitalize", "London", String.class).await() + ", ";
result += ctx.callActivity("Capitalize", "Seattle", String.class).await() + ", ";
result += ctx.callActivity("Capitalize", "Austin", String.class).await();
return result;
}
/**
* This is the activity function that is invoked by the orchestrator function.
*/
@FunctionName("Capitalize")
public String capitalize(@DurableActivityTrigger(name = "name") String name, final ExecutionContext context) {
context.getLogger().info("Capitalizing: " + name);
return name.toUpperCase();
}
}
Maven 명령을 사용하여 로컬 프로젝트 만들기
다음 명령을 실행하여 Durable Functions 앱의 기본 함수를 포함하는 프로젝트를 생성합니다.
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.62 -Dtrigger=durablefunctions
mvn archetype:generate "-DarchetypeGroupId=com.microsoft.azure" "-DarchetypeArtifactId=azure-functions-archetype" "-DarchetypeVersion=1.62" "-Dtrigger=durablefunctions"
mvn archetype:generate "-DarchetypeGroupId=com.microsoft.azure" "-DarchetypeArtifactId=azure-functions-archetype" "-DarchetypeVersion=1.62" "-Dtrigger=durablefunctions"
프롬프트에서 다음 정보를 제공합니다.
테이블 확장
프롬프트
작업
groupId
com.function 을 입력합니다.
artifactId
myDurableFunction 을 입력합니다.
version
1.0-SNAPSHOT 을 선택합니다.
패키지
com.function 을 입력합니다.
Y
Y 를 입력하고 Enter 키를 선택하여 확인합니다.
이제 기본 Durable Functions 앱에 있는 세 가지 함수가 포함된 로컬 프로젝트가 생성되었습니다.
com.microsoft:durabletask-azure-functions
가 pom.xml 파일에서 종속성으로 설정되어 있는지 확인합니다.
Durable Functions에서 런타임 상태를 저장하려면 저장소 공급자가 필요합니다. local.settings.json 에서 Azure Storage를 스토리지 공급자로 설정할 수 있습니다. 다음 예와 같이 Azure Storage 계정의 연결 문자열을 AzureWebJobsStorage
의 값으로 사용합니다.
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
Visual Studio Code에서 F1(또는 Ctrl/Cmd+Shift+P) 키를 선택하여 명령 팔레트를 엽니다. 프롬프트(>
)에서 Azure Functions: 새 프로젝트 만들기 를 입력한 다음 선택합니다.
찾아보기 를 선택합니다. 폴더 선택 대화 상자에서 프로젝트에 사용할 폴더로 이동한 다음, 선택 을 선택합니다.
프롬프트에서 다음 정보를 제공합니다.
테이블 확장
프롬프트
작업
언어 선택
Java 를 선택합니다.
Java 버전 선택
Java 8 이상을 선택합니다. Azure에서 함수가 실행되는 Java 버전과 로컬에서 확인한 버전을 선택합니다.
그룹 ID 제공
com.function 을 입력합니다.
아티팩트 ID 제공
myDurableFunction 을 입력합니다.
버전 제공
1.0-SNAPSHOT 을 입력합니다.
패키지 이름 제공
com.function 을 입력합니다.
앱 이름 제공
myDurableFunction 을 입력합니다.
Java 프로젝트에 대한 빌드 도구 선택
Maven 을 선택합니다.
프로젝트를 여는 방법 선택
새 창에서 열기 를 선택합니다.
이제 예시 HTTP 함수가 포함된 프로젝트가 생성되었습니다. 다음 단계에서 Durable Functions 앱의 기본 함수를 추가하므로 원하는 경우 이 함수를 제거해도 됩니다.
명령 팔레트에서 Azure Functions: 함수 만들기 를 입력한 다음 선택합니다.
템플릿 필터 변경 에서 모두 를 선택합니다.
프롬프트에서 다음 정보를 제공합니다.
테이블 확장
프롬프트
작업
함수의 템플릿 선택
DurableFunctionsOrchestration 을 선택합니다.
패키지 이름 제공
com.function 을 입력합니다.
함수 이름 제공
DurableFunctionsOrchestrator 를 입력합니다.
대화 상자에서 스토리지 계정 선택 을 선택하여 스토리지 계정을 설정한 다음, 프롬프트를 따릅니다.
이제 Durable Functions 앱에 대한 세 가지 기본 함수가 생성되었습니다.
pom.xml 파일에 다음 종속성을 추가합니다.
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>durabletask-azure-functions</artifactId>
<version>1.0.0</version>
</dependency>
host.json 파일에 extensions
속성을 추가합니다.
"extensions": { "durableTask": { "hubName": "JavaTestHub" }}
Azure Functions Core Tools를 사용하면 로컬 개발 컴퓨터에서 Azure Functions 프로젝트를 실행할 수 있습니다.
참고
Java용 Durable Functions에는 Azure Functions Core Tools 버전 4.0.4915 이상이 필요합니다. 터미널에서 func --version
명령을 실행하여 설치된 버전을 확인할 수 있습니다.
Visual Studio Code를 사용하는 경우 새 터미널 창을 열고 다음 명령을 실행하여 프로젝트를 만듭니다.
mvn clean package
그런 다음 지속성 함수를 실행합니다.
mvn azure-functions:run
터미널 패널에서 HTTP 트리거 함수의 URL 엔드포인트를 복사합니다.
HTTP 테스트 도구를 사용하여 URL 엔드포인트에 HTTP POST 요청을 보냅니다.
응답은 다음 예제와 유사해야 합니다.
{
"id": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
"purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKo...",
"sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/raiseEvent/{eventName}?code=ACCupah_QfGKo...",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKo...",
"terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/terminate?reason={text}&code=ACCupah_QfGKo..."
}
응답은 HTTP 함수의 초기 결과입니다. 이는 지속 가능한 오케스트레이션이 성공적으로 시작되었음을 알려 줍니다. 아직 오케스트레이션의 최종 결과가 표시되지 않았습니다. 응답에는 몇 가지 유용한 URL이 포함되어 있습니다. 지금은 오케스트레이션 상태를 쿼리합니다.
statusQueryGetUri
의 URL 값을 복사하여 브라우저의 주소 표시줄에 붙여넣고 요청을 실행합니다. 또는 HTTP 테스트 도구를 계속 사용하여 GET 요청을 실행할 수 있습니다.
요청은 상태에 대한 오케스트레이션 인스턴스를 쿼리합니다. 다음 예와 같이 인스턴스가 완료되었으며 지속성 함수의 출력 또는 결과가 포함됨을 확인할 수 있습니다.
{
"name": "Cities",
"instanceId": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
"runtimeStatus": "Completed",
"input": null,
"customStatus": "",
"output":"TOKYO, LONDON, SEATTLE, AUSTIN",
"createdTime": "2022-12-12T05:00:02Z",
"lastUpdatedTime": "2022-12-12T05:00:06Z"
}