Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Utilize Durable Functions, um recurso do Azure Functions, para criar fluxos de trabalho sem servidor com estado em Java. Neste início rápido, você clona e executa um aplicativo de exemplo que demonstra dois padrões comuns de orquestração:
- Encadeamento de funções: chama as atividades sequencialmente (Tóquio → Seattle → Londres).
- Fan-out/fan-in: chama atividades em paralelo em cinco cidades e agrega os resultados.
No final, você terá as duas orquestrações em execução localmente com o emulador do Agendador de Tarefas Duráveis e poderá exibir seu status no painel.
- Clone e prepare o projeto de exemplo Hello Cities.
- Configure o emulador do Agendador de Tarefas Duráveis e o Azurite para desenvolvimento local.
- Crie e execute o aplicativo de função e acione ambas as orquestrações.
- Verifique o status e a saída da orquestração no dashboard do Durable Task Scheduler.
Pré-requisitos
- Java JDK (11+) instalado.
- Apache Maven 3.0 ou posterior.
- Azure Functions Core Tools v4 ou posterior.
- Docker para executar o emulador e o Azurite.
- Clone o repositório Durable Task Scheduler GitHub para usar o exemplo de início rápido.
Configurar o emulador do Agendador de Tarefas Duráveis
O emulador Durable Task Scheduler fornece um ambiente de desenvolvimento local para que você possa testar orquestrações sem uma assinatura Azure. O host do Java Functions também requer Azurite para armazenamento local.
Inicie ambos os contêineres:
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
Dica
Depois que o emulador estiver em execução, você poderá acessar o painel http://localhost:8082 do Agendador de Tarefas Duráveis para monitorar orquestrações.
Executar o exemplo de início rápido
Navegue até o diretório de exemplo Hello Cities:
cd samples/durable-functions/java/HelloCitiesVerifique se o
local.settings.jsonarquivo 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 o aplicativo de funções:
mvn azure-functions:runEm um terminal separado, dispare 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 status para a instância de orquestração. Copie o valor
statusQueryGetUrie execute-o para verificar o resultado:Invoke-RestMethod -Uri $response.statusQueryGetUriAcione a orquestração fan-out/fan-in:
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartFanOutFanIn Invoke-RestMethod -Uri $response.statusQueryGetUri
Resultado esperado
A solicitação POST retorna uma resposta JSON com URLs de status. Por exemplo:
{
"id": "<instanceId>",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
"sendEventPostUri": "...",
"terminatePostUri": "...",
"purgeHistoryDeleteUri": "..."
}
Quando você consulta statusQueryGetUri e o runtimeStatus da orquestração é Completed, você pode encontrar os resultados da saudação no campo output. A orquestração de encadeamento retorna:
{
"name": "ChainingOrchestration",
"runtimeStatus": "Completed",
"output": "Hello Tokyo! Hello Seattle! Hello London!"
}
A orquestração fan-out/fan-in retorna:
{
"name": "FanOutFanInOrchestration",
"runtimeStatus": "Completed",
"output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!", "Hello Paris!", "Hello Berlin!"]
}
Dica
Se runtimeStatus mostrar Running ou Pending, aguarde um momento e consulte statusQueryGetUri novamente.
Abra o painel do Agendador de Tarefas Duráveis em http://localhost:8082 para ver o status da orquestração e o histórico de execução.
Entender o código
O projeto de exemplo em src/main/java/com/example/Functions.java contém todos os três tipos de função necessários para um aplicativo Durable Functions.
Função de atividade
A SayHello atividade usa um nome de cidade e retorna 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 de cliente disparadas 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);
}
Configuration
O exemplo usa o emulador do Agendador de Tarefas Duráveis como seu back-end de armazenamento. Isso está configurado em host.json:
{
"extensions": {
"durableTask": {
"hubName": "default",
"storageProvider": {
"type": "azureManaged",
"connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
}
}
}
}
O cadeia de conexão do emulador é definido 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"
}
}
Limpar os recursos
Interrompa os contêineres do emulador quando terminar:
docker stop dtsemulator azurite && docker rm dtsemulator azurite
Próximas Etapas
- Saiba mais sobre os padrões comuns de aplicativos do Durable Functions.
- Implantar um aplicativo Durable Functions no Azure.
- Saiba mais sobre os provedores de armazenamento do Durable Functions.