Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Utilize Durable Functions, uma funcionalidade de Funções do Azure, para criar fluxos de trabalho sem servidor com estado em Java. Neste quickstart, clonas e executas uma aplicação de exemplo que demonstra dois padrões comuns de orquestração:
- Encadeamento de funções: Chama atividades sequencialmente (Tóquio → Seattle → Londres).
- Fan-out/fan-in: Invoca atividades em paralelo em cinco cidades e, em seguida, agrega os resultados.
No final, terá ambas as orquestrações a correr localmente com o emulador Durable Task Scheduler e poderá ver o seu estado no painel.
- Clonar e preparar o projeto de exemplo "Hello Cities".
- Configura o emulador Durable Task Scheduler e o Azurite para desenvolvimento local.
- Compile e execute a aplicação de funções e acione ambas as orquestrações.
- Reveja o estado da orquestração e os resultados no painel do Durable Task Scheduler.
Pré-requisitos
- Java 11+ (JDK) instalado.
- Apache Maven 3.0 ou posterior.
- Funções do Azure Core Tools v4 ou posterior.
- Docker para correr o emulador e o Azurite.
- Clone o repositório GitHub Durable Task Scheduler para usar o exemplo de início rápido.
Configurar o emulador do Durable Task Scheduler
O emulador Durable Task Scheduler fornece um ambiente de desenvolvimento local para que possa testar orquestrações sem uma subscrição Azure. O host Java Functions também requer Azurite para armazenamento local.
Inicie ambos os recipientes:
docker run -d --name dtsemulator -p 8080:8080 -p 8082:8082 \
mcr.microsoft.com/dts/dts-emulator:latest
docker run -d --name azurite -p 10000:10000 -p 10001:10001 -p 10002:10002 \
mcr.microsoft.com/azure-storage/azurite
Gorjeta
Assim que o emulador estiver em execução, pode aceder ao painel do Durable Task Scheduler em http://localhost:8082 para monitorizar as orquestrações.
Executa a amostra de início rápido
Navegue até ao diretório de exemplos Hello Cities:
cd samples/durable-functions/java/HelloCitiesVerifique se o
local.settings.jsonficheiro contém a seguinte configuração:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "java", "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None" } }Compile o projeto:
mvn clean packageInicie a aplicação de funções:
mvn azure-functions:runNoutro terminal, desencadeie a orquestração de encadeamento de funções:
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartChaining $responseA resposta contém URLs de estado da instância de orquestração. Copie o
statusQueryGetUrivalor e execute para verificar o resultado:Invoke-RestMethod -Uri $response.statusQueryGetUriAccione a orquestração fan-out/fan-in:
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartFanOutFanIn Invoke-RestMethod -Uri $response.statusQueryGetUri
Resultados esperados
O pedido POST devolve uma resposta JSON com URLs de estado. Por exemplo:
{
"id": "<instanceId>",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
"sendEventPostUri": "...",
"terminatePostUri": "...",
"purgeHistoryDeleteUri": "..."
}
Quando consulta statusQueryGetUri e o runtimeStatus da orquestração é Completed, pode encontrar os resultados da saudação no campo output. A orquestração de encadeamento regressa:
{
"name": "ChainingOrchestration",
"runtimeStatus": "Completed",
"output": "Hello Tokyo! Hello Seattle! Hello London!"
}
A orquestração de fan-out/fan-in regressa:
{
"name": "FanOutFanInOrchestration",
"runtimeStatus": "Completed",
"output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!", "Hello Paris!", "Hello Berlin!"]
}
Gorjeta
Se runtimeStatus mostrar Running ou Pending, espere um momento e faça a pergunta statusQueryGetUri novamente.
Abra o painel do Durable Task Scheduler em http://localhost:8082 para ver o estado da orquestração e o histórico de execução.
Entenda o código
O projeto de exemplo em src/main/java/com/example/Functions.java contém os três tipos de funções necessários para uma aplicação Durable Functions.
Função de atividade
A SayHello atividade adota o nome da cidade e responde com uma saudação:
@FunctionName("SayHello")
public String sayHello(
@DurableActivityTrigger(name = "city") String city) {
return "Hello " + city + "!";
}
Funções de orquestrador
O orquestrador de encadeamento chama SayHello sequencialmente para três cidades:
@FunctionName("ChainingOrchestration")
public String chainingOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
String result = "";
result += ctx.callActivity("SayHello", "Tokyo", String.class).await();
result += " " + ctx.callActivity("SayHello", "Seattle", String.class).await();
result += " " + ctx.callActivity("SayHello", "London", String.class).await();
return result;
}
O orquestrador fan-out/fan-in programa as atividades em paralelo:
@FunctionName("FanOutFanInOrchestration")
public List<String> fanOutFanInOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
String[] cities = {"Tokyo", "Seattle", "London", "Paris", "Berlin"};
List<Task<String>> parallelTasks = new ArrayList<>();
for (String city : cities) {
parallelTasks.add(ctx.callActivity("SayHello", city, String.class));
}
List<String> results = new ArrayList<>();
for (Task<String> task : parallelTasks) {
results.add(task.await());
}
return results;
}
Funções do cliente
As funções cliente ativadas por HTTP iniciam cada orquestração:
@FunctionName("StartChaining")
public HttpResponseMessage startChaining(
@HttpTrigger(name = "req", methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Void> request,
@DurableClientInput(name = "durableContext") DurableClientContext durableContext) {
DurableTaskClient client = durableContext.getClient();
String instanceId = client.scheduleNewOrchestrationInstance("ChainingOrchestration");
return durableContext.createCheckStatusResponse(request, instanceId);
}
Configuração
O exemplo utiliza o emulador Durable Task Scheduler como backend de armazenamento. Isto está configurado em host.json:
{
"extensions": {
"durableTask": {
"hubName": "default",
"storageProvider": {
"type": "azureManaged",
"connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
}
}
}
}
A cadeia de ligação do emulador está definida em local.settings.json:
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "java",
"DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
}
}
Limpeza de recursos
Pare os contentores do emulador quando terminar:
docker stop dtsemulator azurite && docker rm dtsemulator azurite
Passos seguintes
- Aprenda sobre padrões comuns de aplicações de Durable Functions.
- Implemente uma aplicação Durable Functions para Azure.
- Saiba mais sobre os fornecedores de armazenamento do Durable Functions.