Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel gebruikt u de Azure Developer CLI (azd) om een Event Hubs-triggerfunctie te maken voor realtime gebeurtenisverwerking in Azure Functions. Nadat u de code lokaal hebt gecontroleerd, implementeert u deze in een nieuwe serverloze functie-app die wordt uitgevoerd in een Flex Consumption-abonnement in Azure.
De projectbron gebruikt azd om de functie-app en gerelateerde resources te maken en uw code te implementeren in Azure. Deze implementatie volgt de huidige aanbevolen procedures voor veilige en schaalbare Azure Functions implementaties.
Het Flex Consumption-abonnement volgt standaard een factureringsmodel waarbij u betaalt voor wat u gebruikt. Dit betekent dat u dit artikel kunt voltooien en slechts een paar centen of minder kosten maakt in uw Azure-account.
Dit artikel ondersteunt versie 4 van het Node.js programmeermodel voor Azure Functions.
Dit artikel ondersteunt versie 2 van het Python-programmeermodel voor Azure Functions.
Vereiste voorwaarden
-
Java 21 Developer Kit
- Stel de
JAVA_HOMEomgevingsvariabele in op de installatielocatie van de juiste versie van de Java Development Kit (JDK).
- Stel de
- Apache Maven 3.8.x
- Node.js 22 of hoger
- Python 3.11 of hoger
Een Azure-account met een actief abonnement. Gratis een account maken
Het project initialiseren
Gebruik de azd init opdracht om een lokaal Azure Functions-codeproject te maken op basis van een sjabloon.
Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:
azd init --template functions-quickstart-dotnet-azd-eventhub -e eventhub-dotnet
Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.
Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:
azd init --template functions-quickstart-typescript-azd-eventhub -e eventhub-ts
Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.
Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:
azd init --template functions-quickstart-python-azd-eventhub -e eventhub-py
Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.
Een virtuele omgeving maken en activeren
Voer in de hoofdmap deze commando's uit om een virtuele omgeving met de naam .venv te creëren en te activeren.
python3 -m venv .venv
source .venv/bin/activate
Als Python het venv-pakket niet installeert in uw Linux-distributie, voert u de volgende opdracht uit:
sudo apt-get install python3-venv
Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:
azd init --template functions-quickstart-java-azd-eventhub -e eventhub-java
Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.
Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:
azd init --template functions-quickstart-javascript-azd-eventhub -e eventhub-js
Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.
Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:
azd init --template functions-quickstart-powershell-azd-eventhub -e eventhub-ps
Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.
Azure-resources maken
Voordat u uw functie lokaal kunt uitvoeren, moet u een Event Hubs-naamruimte en -hub maken in Azure. Gebruik azd provision om deze resources te maken en uw lokale instellingen te configureren door het vereiste local.settings.json-bestand toe te voegen.
Voer de volgende opdracht uit om u aan te melden bij Azure:
azd auth loginVolg de aanwijzingen om te verifiëren met behulp van uw Azure-account.
Voer vanuit de hoofdmap de volgende opdracht uit om uw Azure-resources te maken:
azd provisionGeef de volgende vereiste implementatieparameters op wanneer u hierom wordt gevraagd:
Kenmerk Beschrijving Azure-abonnement Abonnement waarin u uw resources creëert. Azure-locatie De Azure-regio waar de resourcegroep wordt gecreëerd die de nieuwe Azure-resources bevat. Alleen regio's die momenteel ondersteuning bieden voor het Flex Consumption-abonnement, worden weergegeven. vnetEnabled Gebruik een waarde van Falseom de extra overhead van het maken van virtuele netwerkbronnen te voorkomen.Met de
azd provisionopdracht worden de vereiste Azure-resources gemaakt, waaronder een Event Hubs-naamruimte en -hub, een Flex Consumption-functie-app, Application Insights en een opslagaccount. Het configureert ook uw local.settings.json-bestand met de Event Hubs-verbindingsgegevens.
Uitvoeren in uw lokale omgeving
Open een apart terminalvenster en start de Azurite-opslagemulator.
azuriteHet lokale Functions-hostproces maakt gebruik van de Azurite-emulator voor de interne opslagverbinding (
AzureWebJobsStorage) die vereist is voor de runtime.
Als u de functie-app wilt starten, voert u deze opdrachten uit in een terminal of opdrachtprompt om naar de
srcprojectmap te navigeren en de functie-app te starten:cd src func start
Als u de functie-app wilt starten, voert u deze opdracht uit in een terminal of opdrachtprompt:
func start
Als u de functie-app wilt bouwen en starten, voert u deze opdrachten uit in een terminal of opdrachtprompt:
mvn clean package mvn azure-functions:run
Als u afhankelijkheden wilt installeren en de functie-app wilt starten, voert u deze opdrachten uit in een terminal of opdrachtprompt:
npm install npm start
Als u afhankelijkheden wilt installeren en de functie-app wilt starten, voert u deze opdrachten uit in een terminal of opdrachtprompt:
cd src npm install npm start
Als u de functie-app wilt starten, voert u deze opdracht uit in een terminal of opdrachtprompt:
func start
Als u hierom wordt gevraagd, staat u toe dat Core Tools (func.exe) via de firewall worden aangeroepen.
Wanneer de Functions-host wordt gestart in uw lokale projectmap, schrijft deze informatie over uw functies naar de terminaluitvoer.
Dit voorbeeld bevat een timertriggerfunctie waarmee elke 10 seconden automatisch nieuwsartikelen worden gegenereerd en naar Event Hubs worden verzonden. De Event Hubs-triggerfunctie verwerkt deze gebeurtenissen en voert sentimentanalyses en betrokkenheidstracering uit.
U ziet uitvoer die vergelijkbaar is met dit voorbeeld:
[2026-03-02T22:37:30.151Z] Executing 'Functions.EventHubsTrigger' [2026-03-02T22:37:30.159Z] Trigger Details: PartitionId: 24, OffsetString: 0, EnqueueTimeUtc: 2026-03-02T22:37:29.1790000+00:00, SequenceNumber: 0, Count: 1, Offset: 0, PartionId: 24 [2026-03-02T22:37:30.169Z] ⭐ High-engagement article NEWS-20260302-0580CB82 (Views: 6123, Sentiment: 0.57) featured! [2026-03-02T22:37:30.174Z] 🔥 Viral article: NEWS-20260302-0580CB82 - 6,123 views [2026-03-02T22:37:30.181Z] 🌟 Featured article: NEWS-20260302-0580CB82 [2026-03-02T22:37:30.185Z] ✅ Successfully processed article NEWS-20260302-0580CB82 - 'Technology Breakthrough in Renewable Energy Technology' by Sarah Johnson [2026-03-02T22:37:30.191Z] 📰 Processed 1 news articles, 0 failed in batch of 1 [2026-03-02T22:37:30.196Z] 📊 NEWS BATCH SUMMARY: 1 articles | Total Views: 6,123 | Avg Views: 6,123 | Avg Sentiment: 0.57 | Status: [Featured: 1] [2026-03-02T22:37:30.200Z] 📂 Top Categories: [Health: 1] | Top Sources: [Innovation Weekly: 1] [2026-03-02T22:37:30.204Z] 🔥 Viral articles in batch: 1 [2026-03-02T22:37:30.207Z] Executed 'Functions.EventHubsTrigger' (Succeeded, Duration=55ms)
Wanneer u klaar bent, drukt u op Ctrl+C in het terminalvenster om het
func.exehostproces te stoppen.Sluit het raam waarin Azurite loopt.
- Voer
deactivateuit om de virtuele omgeving af te sluiten.
De code bekijken (optioneel)
U kunt de code bekijken waarmee de Event Hubs-triggerfunctie wordt gedefinieerd:
using System.Text.Json;
using Azure.Messaging.EventHubs;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace function_app;
public class EventHubsTrigger
{
private readonly ILogger<EventHubsTrigger> _logger;
private readonly NewsProcessingService _newsService;
public EventHubsTrigger(ILogger<EventHubsTrigger> logger, NewsProcessingService newsService)
{
_logger = logger;
_newsService = newsService;
}
[Function(nameof(EventHubsTrigger))]
public async Task Run([EventHubTrigger("news", Connection = "EventHubConnection")] EventData[] input)
{
var processedArticles = new List<NewsArticle>();
var failedEvents = 0;
foreach (var message in input)
{
try
{
var messageBody = message.EventBody.ToString();
// Parse the news article event
var article = ParseNewsArticleEvent(messageBody);
if (article != null)
{
processedArticles.Add(article);
}
else
{
failedEvents++;
}
}
catch (Exception ex)
{
failedEvents++;
_logger.LogWarning($"Error processing message: {ex.Message}");
}
}
// Log summary of this execution
_logger.LogInformation($"📰 Processed {processedArticles.Count} news articles, {failedEvents} failed in batch of {input.Length}");
U kunt het volledige sjabloonproject bekijken here.
package com.function;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
import java.time.Instant;
import java.util.*;
import java.util.logging.Logger;
/**
* Azure Function that processes messages from an input Event Hub,
* adds metadata, and sends processed messages to an output Event Hub.
*/
public class EventHubsTriggerFunction {
@FunctionName("EventHubsTrigger")
public void run(
@EventHubTrigger(
name = "messages",
eventHubName = "%INPUT_EVENTHUB_NAME%",
connection = "EventHubConnection",
cardinality = Cardinality.MANY)
List<String> messages,
@EventHubOutput(
name = "output",
eventHubName = "%OUTPUT_EVENTHUB_NAME%",
connection = "EventHubConnection")
OutputBinding<List<String>> output,
final ExecutionContext context) {
Logger logger = context.getLogger();
logger.info(String.format("🔄 Event hub function processing %d message(s)", messages.size()));
List<String> processedMessages = new ArrayList<>();
for (String message : messages) {
try {
logger.info("📨 Processing event: " + message);
// Create processed message with additional metadata
String processedMessage = String.format(
"{\"id\":\"%s\",\"message\":%s,\"timestamp\":\"%s\"}",
UUID.randomUUID().toString(),
message,
Instant.now().toString());
processedMessages.add(processedMessage);
logger.info("\u2728 Message processed: " + processedMessage);
} catch (Exception e) {
logger.severe("\u274C Error processing message: " + e.getMessage());
}
}
// Send processed messages to output Event Hub
if (!processedMessages.isEmpty()) {
output.setValue(processedMessages);
logger.info(String.format("📤 Sent %d message(s) to output Event Hub", processedMessages.size()));
}
}
}
U kunt het volledige sjabloonproject bekijken here.
const { app, output } = require("@azure/functions");
const eventHubOutput = output.eventHub({
connection: 'EventHubConnection',
eventHubName: '%OUTPUT_EVENTHUB_NAME%'
});
async function EventHubsTrigger(messages, context) {
context.log(`🔄 Event hub function processing ${messages.length} message(s)`);
const processedMessages = [];
for (const message of messages) {
try {
// Parse the incoming message
const eventData = typeof message === 'string' ? JSON.parse(message) : message;
context.log('📨 Processing event:', eventData);
// Create processed message with additional metadata
const processedMessage = {
id: eventData.id || crypto.randomUUID(),
message: eventData.message || JSON.stringify(eventData),
timestamp: new Date().toISOString()
};
processedMessages.push(processedMessage);
context.log('✨ Message processed:', processedMessage);
} catch (error) {
context.error(`❌ Error processing message: ${error}`);
}
}
// Send processed messages to output Event Hub
if (processedMessages.length > 0) {
context.extraOutputs.set(eventHubOutput, processedMessages);
context.log(`📤 Sent ${processedMessages.length} message(s) to output Event Hub`);
}
}
app.eventHub('EventHubsTrigger', {
connection: 'EventHubConnection',
eventHubName: '%INPUT_EVENTHUB_NAME%',
cardinality: 'many',
extraOutputs: [eventHubOutput],
handler: EventHubsTrigger
});
U kunt het volledige sjabloonproject bekijken here.
import { app, InvocationContext, output } from "@azure/functions";
interface EventMessage {
id: string;
message: string;
timestamp: string;
}
const eventHubOutput = output.eventHub({
connection: 'EventHubConnection',
eventHubName: '%OUTPUT_EVENTHUB_NAME%'
});
export async function EventHubsTrigger(messages: unknown[], context: InvocationContext): Promise<void> {
context.log(`🔄 Event hub function processing ${messages.length} message(s)`);
const processedMessages: EventMessage[] = [];
for (const message of messages) {
try {
// Parse the incoming message
const eventData = typeof message === 'string' ? JSON.parse(message) : message;
context.log('📨 Processing event:', eventData);
// Create processed message with additional metadata
const processedMessage: EventMessage = {
id: eventData.id || crypto.randomUUID(),
message: eventData.message || JSON.stringify(eventData),
timestamp: new Date().toISOString()
};
processedMessages.push(processedMessage);
context.log('✨ Message processed:', processedMessage);
} catch (error) {
context.error(`❌ Error processing message: ${error}`);
}
}
// Send processed messages to output Event Hub
if (processedMessages.length > 0) {
context.extraOutputs.set(eventHubOutput, processedMessages);
context.log(`📤 Sent ${processedMessages.length} message(s) to output Event Hub`);
}
}
app.eventHub('EventHubsTrigger', {
connection: 'EventHubConnection',
eventHubName: '%INPUT_EVENTHUB_NAME%',
cardinality: 'many',
extraOutputs: [eventHubOutput],
handler: EventHubsTrigger
});
U kunt het volledige sjabloonproject bekijken here.
param($InputEvents, $TriggerMetadata)
Write-Host "🔄 Event hub function processing $($InputEvents.Count) message(s)"
$processedMessages = @()
foreach ($message in $InputEvents) {
try {
# Parse the incoming message
$eventData = $message | ConvertFrom-Json -ErrorAction SilentlyContinue
if (-not $eventData) {
$eventData = @{ message = $message }
}
Write-Host "📨 Processing event: $($eventData | ConvertTo-Json -Compress)"
# Create processed message with additional metadata
$processedMessage = @{
id = if ($eventData.id) { $eventData.id } else { [guid]::NewGuid().ToString() }
message = if ($eventData.message) { $eventData.message } else { ($eventData | ConvertTo-Json -Compress) }
timestamp = (Get-Date).ToUniversalTime().ToString('o')
}
$processedMessages += $processedMessage
Write-Host "✨ Message processed: $($processedMessage | ConvertTo-Json -Compress)"
}
catch {
Write-Error "❌ Error processing message: $_"
}
}
# Send processed messages to output Event Hub
if ($processedMessages.Count -gt 0) {
Push-OutputBinding -Name OutputEvents -Value ($processedMessages | ConvertTo-Json -Compress)
Write-Host "📤 Sent $($processedMessages.Count) message(s) to output Event Hub"
}
De trigger wordt gedefinieerd in de bijbehorende function.json.
U kunt het volledige sjabloonproject bekijken here.
import azure.functions as func
import logging
import json
from datetime import datetime, timezone
import random
import uuid
from typing import List
app = func.FunctionApp()
# News article data model
class NewsArticle:
title=random.choice(titles_templates).format(topic=topic),
content=f"Comprehensive coverage of the latest developments in {topic}. " * random.randint(10, 20),
author=random.choice(authors),
source=random.choice(sources),
category=random.choice(categories),
published_date=datetime.now(timezone.utc),
view_count=random.randint(100, 10000),
sentiment_score=round(random.uniform(-1.0, 1.0), 2),
status=random.choice(["Published", "Featured"]),
tags=[random.choice(topics) for _ in range(random.randint(3, 5))]
)
articles.append(article)
# Send articles to Event Hub
events_json = json.dumps([article.to_dict() for article in articles])
event.set(events_json)
logging.info(f'✅ HIGH-THROUGHPUT: Successfully generated {num_articles} news articles in ~10 seconds')
# Event Hub trigger - processes news articles
@app.event_hub_message_trigger(arg_name="events", event_hub_name="news",
connection="EventHubConnection")
def EventHubsTrigger(events: List[func.EventHubEvent]):
"""Process news articles from Event Hub with sentiment analysis and engagement tracking"""
# Handle both single event and list of events
if not isinstance(events, list):
events = [events]
batch_articles = []
failed_count = 0
for event in events:
try:
# Parse the event data
event_data = json.loads(event.get_body().decode('utf-8'))
# Handle both single article and array of articles
articles = event_data if isinstance(event_data, list) else [event_data]
for article_data in articles:
# Process each article
article_id = article_data.get('ArticleId')
title = article_data.get('Title')
author = article_data.get('Author')
U kunt het volledige sjabloonproject bekijken here.
Nadat u uw functie lokaal hebt gecontroleerd, is het tijd om deze te publiceren naar Azure.
Implementeren in Azure
Dit project is geconfigureerd om de azd up opdracht te gebruiken om uw code te implementeren in een nieuwe functie-app in een Flex Consumption-abonnement in Azure. Omdat u al resources hebt ingericht, implementeert deze opdracht uw code in de bestaande functie-app.
Aanbeveling
nl-NL: Dit project bevat een set Bicep-bestanden die azd gebruiken om een beveiligde implementatie te maken voor een Flex Consumption-plan dat de aanbevolen procedures volgt.
Voer vanuit de hoofdmap van de opslagplaats de volgende opdracht uit om uw codeproject te implementeren in de functie-app in Azure:
azd deploy
De implementatie verpakt uw code en implementeert deze in de functie-app. Wanneer de opdracht is voltooid, ziet u koppelingen naar de resources die u hebt gemaakt.
Implementatie verifiëren
Nadat de implementatie is voltooid, start uw Event Hubs-triggerfunctie automatisch met het verwerken van gebeurtenissen wanneer ze binnenkomen in de Event Hub.
Ga in Azure Portal naar uw nieuwe functie-app.
Selecteer Logboekstream vanuit het linkermenu om uw functie-uitvoeringen in realtime te monitoren.
U ziet logboekvermeldingen die laten zien dat uw Event Hubs-triggerfunctie gebeurtenissen verwerkt die zijn gegenereerd door de Timer trigger.
Uw code opnieuw implementeren
Voer de opdracht azd up zo vaak uit als u nodig hebt om uw Azure-resources in te richten en code-updates voor uw functie-app te implementeren.
Opmerking
Geïmplementeerde codebestanden worden altijd overschreven door het nieuwste implementatiepakket.
Uw eerste reacties op azd-prompts en eventuele door azd gegenereerde omgevingsvariabelen worden lokaal opgeslagen in uw benoemde omgeving. Gebruik de azd env get-values opdracht om alle variabelen in uw omgeving te controleren die zijn gebruikt bij het maken van Azure-resources.
De hulpbronnen opschonen
Wanneer u klaar bent met het werken met uw functie-app en gerelateerde resources, gebruikt u deze opdracht om de functie-app en de bijbehorende resources uit Azure te verwijderen en te voorkomen dat er verdere kosten in rekening worden gebracht:
azd down --no-prompt
Opmerking
Met de --no-prompt optie krijgt u de opdracht azd om uw resourcegroep te verwijderen zonder een bevestiging van u.
Deze opdracht heeft geen invloed op uw lokale codeproject.