There are so few examples of Azure Functions implemented in Java and even official documentation is a little confusing, so I decided to write my own post explaining some of the points.
So here is my function class:
public class EventHubTriggerFunction {
/**
* This function will be invoked when an event is received from Event Hub.
*/
@FunctionName("EventHubTrigger-Java")
public void run(
@EventHubTrigger(name = "message",
eventHubName = "my-event-hubs",
connection = "EventHubConnectionString",
consumerGroup = "$Default"
) String message,
final ExecutionContext context
) {
context.getLogger().info("Java Event Hub trigger function executed.");
context.getLogger().info("Message:" + message);
}
}
The noteworthy thing in this snippet are the annotation attributes.
name: Any name that can be given to the trigger.
eventHubName: Name of the event hubs instance that will be used to receieve messages.
connection: Name of the property which stores Event Hubs Namespace (not the Event Hubs instance) connection string. What does this mean? It means that we don't have to give the connection string here, but define the conection string in local.settings.json (when running locally) or in Configuration page in the portal.
Here is the local.settings.json file. 'EventHubConnectionString' is the key that has been given in the connection attribute above.
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "java",
"EventHubConnectionString": "Endpoint=sb://eventhubs.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=accesskeystring"
}
}
This same key/value has to be added in the function app configuration on the portal:
By default the EventHub Trigger assumes that the message is in JSON format and it will give following error:
Exception while executing function: Functions.EventHubExample. Microsoft.Azure.WebJobs.Host: Exception binding parameter message.
Microsoft.Azure.WebJobs.Host: Binding parameters to complex objects (such as Object) uses JSON.NET serialization.
To get rid of this, either the message should be a valid JSON or we need to specify the 'dataType' parameter for the trigger:
public void run(
@EventHubTrigger(name = "message",
eventHubName = "my-event-hubs",
connection = "EventHubConnectionString",
consumerGroup = "$Default",
dataType = "string"
) String message
The behavior of trigger is controlled by certain attributes. The various runtime attributes and their default values are mentioned here. We can override these values in our host.json file:
{
"version": "2.0",
"extensions": {
"eventHubs": {
"batchCheckpointFrequency": 5,
"eventProcessorOptions": {
"maxBatchSize": 1,
"prefetchCount": 512
},
"initialOffsetOptions": {
"type": "fromStart",
"enqueuedTimeUtc": ""
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[2.*, 3.0.0)"
}
}I think this is all there is to implement and run a simple event hubs trigger function in Java.
Source: Github
Comments