07 - Extending with Triggers (Premium)¶
Extend beyond HTTP using queue, blob, timer, and Event Hub triggers with annotation-based bindings and clear operational checks.
Prerequisites¶
| Tool | Version | Purpose |
|---|---|---|
| JDK | 17+ | Compile and run Java functions locally |
| Maven | 3.6+ | Build and package Java artifacts |
| Azure Functions Core Tools | v4 | Start local host and publish artifacts |
| Azure CLI | 2.61+ | Provision Azure resources and inspect app state |
Premium plan basics
Premium (EP) runs on always-warm workers with pre-warmed instances, supports VNet integration, deployment slots, and removes the 10-minute execution timeout. EP1 provides 1 vCPU and 3.5 GB memory per instance.
What You'll Build¶
You will verify all 16 functions deployed to the Premium plan, covering HTTP, queue, blob, timer, and Event Hub trigger types. The reference app includes functions for health monitoring, DNS resolution, external dependencies, storage probing, error testing, and more.
flowchart TD
A[Queue message] --> B["@QueueTrigger handler"]
C[Blob upload] --> D["@BlobTrigger handler"]
E[Schedule] --> F["@TimerTrigger handler"]
G[Event Hub] --> H["@EventHubTrigger handler"]
I[HTTP request] --> J["@HttpTrigger handler"]
B --> K[Outputs and logs]
D --> K
F --> K
H --> K
J --> K Steps¶
Step 1 - Review deployed function inventory¶
The Java reference app contains 16 functions across 5 trigger types:
| Function | Trigger | Route/Binding | Purpose |
|---|---|---|---|
health | HTTP GET | /api/health | Health check endpoint |
helloHttp | HTTP GET/POST | /api/hello/{name} | Greeting with path parameter |
info | HTTP GET | /api/info | Runtime environment info |
identityProbe | HTTP GET | /api/identity | Managed identity status |
storageProbe | HTTP GET | /api/storage/probe | Storage connectivity check |
dnsResolve | HTTP GET | /api/dns/{hostname} | DNS resolution test |
externalDependency | HTTP GET | /api/dependency | External HTTP call test |
logLevels | HTTP GET | /api/loglevels | Log severity test |
slowResponse | HTTP GET | /api/slow | Simulated latency (2s) |
testError | HTTP GET | /api/testerror | Controlled error test |
unhandledError | HTTP GET | /api/unhandlederror | Unhandled exception test |
queueProcessor | Queue | incoming-orders | Queue message processing |
blobProcessor | Blob | uploads/{name} | Blob upload processing |
scheduledCleanup | Timer | 0 0 2 * * * | Daily scheduled task |
timerLab | Timer | 0 */5 * * * * | 5-minute interval timer |
eventhubLagProcessor | Event Hub | events | Event Hub message processing |
Step 2 - Test all HTTP endpoints¶
export APP_NAME="func-jprem-04100200"
# Core endpoints
curl --request GET "https://$APP_NAME.azurewebsites.net/api/health"
curl --request GET "https://$APP_NAME.azurewebsites.net/api/hello/Premium"
curl --request GET "https://$APP_NAME.azurewebsites.net/api/info"
# Diagnostic endpoints
curl --request GET "https://$APP_NAME.azurewebsites.net/api/identity"
curl --request GET "https://$APP_NAME.azurewebsites.net/api/storage/probe"
curl --request GET "https://$APP_NAME.azurewebsites.net/api/dns/google.com"
curl --request GET "https://$APP_NAME.azurewebsites.net/api/dependency"
curl --request GET "https://$APP_NAME.azurewebsites.net/api/loglevels"
curl --request GET "https://$APP_NAME.azurewebsites.net/api/slow"
Step 3 - Verify trigger resources¶
# List queues
az storage queue list \
--account-name "$STORAGE_NAME" \
--output table
# List blob containers
az storage container list \
--account-name "$STORAGE_NAME" \
--query "[].name" \
--output tsv
| CLI element | Explanation |
|---|---|
| Command(s) | az storage queue list, az storage container list |
| Key flags | --account-name, --output, --query |
| Variables | $STORAGE_NAME |
| Expected result | Azure CLI returns the requested resource data; verify names, IDs, status fields, or metric values match the scenario. |
Step 4 - Test queue trigger¶
# Send a test message
az storage message put \
--queue-name "incoming-orders" \
--account-name "$STORAGE_NAME" \
--content "test-premium-queue-message"
# Check queue (message should be consumed quickly)
sleep 10
az storage message peek \
--queue-name "incoming-orders" \
--account-name "$STORAGE_NAME" \
--output table
| CLI element | Explanation |
|---|---|
| Command(s) | az storage message put, az storage message peek |
| Key flags | --queue-name, --account-name, --content, --output |
| Variables | $STORAGE_NAME |
| Expected result | Azure CLI completes successfully and returns JSON, table, or no output depending on the command; verify the next documented check before continuing. |
Step 5 - Test blob trigger¶
# Upload a test file
echo "premium blob test content" > /tmp/test-blob.txt
az storage blob upload \
--container-name "uploads" \
--account-name "$STORAGE_NAME" \
--name "test-premium.txt" \
--file "/tmp/test-blob.txt"
| CLI element | Explanation |
|---|---|
| Command(s) | az storage blob upload |
| Key flags | --container-name, --account-name, --name, --file |
| Variables | $STORAGE_NAME |
| Expected result | Azure CLI completes successfully and returns JSON, table, or no output depending on the command; verify the next documented check before continuing. |
Step 6 - Verify timer functions¶
Timer functions run on schedule and can be verified via Application Insights:
az monitor app-insights query \
--apps "$APP_NAME" \
--resource-group "$RG" \
--analytics-query "traces | where message contains 'timer' or message contains 'cleanup' | where timestamp > ago(30m) | project timestamp, message | order by timestamp desc | take 5"
| CLI element | Explanation |
|---|---|
| Command(s) | az monitor app-insights query |
| Key flags | --apps, --resource-group, --analytics-query |
| Variables | $APP_NAME, $RG |
| Expected result | Azure CLI returns the requested resource data; verify names, IDs, status fields, or metric values match the scenario. |
Step 7 - Verify all function responses¶
Test all endpoints and record responses:
for endpoint in health "hello/Premium" info identity "storage/probe" "dns/google.com" dependency loglevels slow; do
printf "%-25s " "/api/$endpoint:"
curl --silent --max-time 15 "https://$APP_NAME.azurewebsites.net/api/$endpoint" | head -c 100
echo
done
Verification¶
HTTP endpoint responses:
/api/health: {"status":"healthy","timestamp":"2026-04-09T17:09:47.112Z","version":"1.0.0"}
/api/hello/Premium: {"message":"Hello, Premium"}
/api/info: {"name":"azure-functions-java-guide","version":"1.0.0","java":"17.0.14","os":"Linux",...}
/api/identity: {"managedIdentity":false,"identityEndpoint":"not configured"}
/api/dns/google.com: {"hostname":"google.com","addresses":["142.251.119.102",...]}
/api/loglevels: {"logged":true}
/api/slow: {"delayed":2,"message":"Response after 2 second(s)"}
/api/storage/probe: {"storageConfigured":true,"connectionType":"connectionString"}
/api/dependency: {"url":"https://httpbin.org/get","statusCode":200,"latencyMs":1025,"success":true}
Premium identity probe
Unlike Flex Consumption which has managed identity enabled by default, Premium returns {"managedIdentity":false} unless you explicitly enable system-assigned managed identity.
Storage resources:
Queue: incoming-orders
Containers: azure-webjobs-eventhub, azure-webjobs-hosts, azure-webjobs-secrets, function-releases, uploads
Premium has no execution timeout
The /api/slow endpoint with a 2-second delay works identically on all plans, but Premium removes the execution timeout entirely. Long-running functions that would timeout on Consumption (5 min) or Flex Consumption (30 min default) can run indefinitely on Premium.
Clean Up¶
| CLI element | Explanation |
|---|---|
| Command(s) | az group delete |
| Key flags | --name, --yes, --no-wait |
| Variables | $RG |
| Expected result | Azure CLI completes the removal request; verify the target no longer appears in follow-up show or list output. |
See Also¶
- Tutorial Overview & Plan Chooser
- Java Language Guide
- Platform: Hosting Plans
- Operations: Deployment
- Recipes Index