Мне удалось настроить функцию Azure Durable, и я могу выполнить ее и увидеть активацию триггера http, о чем свидетельствуют файлы журнала. Я также вижу вызов оркестратора_триггера.
Я настроил параметры конфигурации, чтобы включить модель программирования v2:
AzureWebJobsFeatureFlags=EnableWorkerIndexing
По инструкции здесь Вот код
import json
import logging
from typing import Any
import azure.functions as func
import azure.durable_functions as df
myapp = df.Blueprint(http_auth_level=func.AuthLevel.ANONYMOUS)
@myapp.route(route = "synthetic/solar/snapshot")
@myapp.durable_client_input(client_name = "client")
async def http_start(req: func.HttpRequest, client):
function_name = 'my_orchestrator_function'
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response
@myapp.orchestration_trigger(context_name = "context")
def my_orchestrator_function(context):
test_act_data = {"testdata": "test"}
test_serialised_act_data = json.dumps(test_act_data)
logging.info(f"Activity result: {test_serialised_act_data}")
test_result = yield context.call_activity("hello_activity", test_serialised_act_data)
return test_result
@myapp.activity_trigger(input_name = "test_json")
def hello_activity(test_json: str):
json_activity_data = json.loads(test_json)
data = json_activity_data["testdata"]
logging.info("Hello Test, Executing Activity Trigger")
return data
Мой хост.json:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
И function_app.py:
import azure.functions as func
app = func.FunctionApp()
app.register_functions(myapp)
Я попытался улучшить ведение журнала. Я пытался пройтись по этапам и сослаться на множество примеров, но на самом деле нет никаких намеков на то, почему Activity_trigger не запускается.
Устойчивая функция Azure с использованием модели программирования Python V2 без вызова Activity_trigger
Для вызова триггера активности устойчивых функций используйте приведенный ниже код:
function_app.py:
import azure.functions as func
import azure.durable_functions as df
import json
import logging
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.route(route = "orchestrators/{functionName}")
@myApp.durable_client_input(client_name = "client")
async def http_start(req: func.HttpRequest, client):
function_name = req.route_params.get('functionName')
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response
@myApp.orchestration_trigger(context_name = "context")
def rith_orchestrator(context):
rith_act_data = {"testdata": "Rithwik"}
rith_serialised_act_data = json.dumps(rith_act_data)
logging.info(f"Activity result: {rith_serialised_act_data}")
rith_result = yield context.call_activity("hello_rithwik", rith_serialised_act_data)
return rith_result
@myApp.activity_trigger(input_name = "rithjson")
def hello_rithwik(rithjson: str):
json_activity_data = json.loads(rithjson)
data = json_activity_data["testdata"]
logging.info("Helo Rithwik, Executing Activity Trigger")
return data
требования.txt
azure-functions
azure-functions-durable
хост.json
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
локальные.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=rithwik;AccountKey=pPBW9jWu77Sqp5F+NLWkA==;EndpointSuffix=core.windows.net",
"FUNCTIONS_WORKER_RUNTIME": "python",
"AzureWebJobsFeatureFlags": "EnableWorkerIndexing"
}
}
Вызов функции:
В URL-адресе замените имя функции на имя оркестратора, как показано ниже:
http://localhost:7071/api/orchestrators/rith_orchestrator
Выход:
Теперь используйте первый URL statusQueryGetUri
. Вы получите сериализованные данные:
Он вызывает только тогда, когда после сериализации вы получаете вывод как рифвик. Попробуйте использовать мой полный код и изменить его в соответствии с вашими требованиями, поскольку мой правильный. Попробуйте использовать мой, тогда он сработает, могут быть небольшие изменения, которых вы, возможно, не получите.
Это решило мою проблему, медленно повторно применив мои изменения. Хоть убей, я до сих пор точно не понимаю, в чем была основная причина. Две строки, которые я никогда не добавлял обратно, были: # @myApp.function_name(name = "usage_synthetic_snapshot_post") # @myApp.route(route = "orchestrators/{functionName}",auth_level=func.AuthLevel.ANONYMOUS, методы =["POST"]) Я предполагаю, что один из этих двух был причиной проблемы.
Теперь я попытался изменить имя функции с hello_rithwik на мое собственное имя функции в двух определенных местах, но когда я это делаю, Azure скрывает Activity_trigger. Должно быть что-то, что сохраняется в профиле функции Azure или что-то еще, когда вы просто меняете имя функции. Потому что это должно сработать. Есть идеи, как принудительно обновить обрабатываемую функцию и почему она это сделает? @rithwikbojja
Попробуйте сделать это в коде Vs, а затем повторно разверните его. На самом деле это должно работать, когда имя изменилось, возможно, в вашей среде может быть проблема с кешем.
Спасибо за ваш ответ. Я просмотрел это внимательно, строчка за строчкой. Единственное отличие, которое я вижу, заключается в том, что вы возвращаете URL-адреса check_status_response в функции httpTrigger. И затем вы используете функцию
statusQueryGetUri
, чтобы получить статус. Но я предполагаю, что не запрос Uri запускает выполнение Activity_trigger? Пожалуйста подтвердите.