Azure / azure-functions-java-library

Contains annotations for writing Azure Functions in Java
MIT License
43 stars 43 forks source link

BindingName: Add support for EventHubTrigger Cardinality.MANY #93

Closed fra-ga closed 5 years ago

fra-ga commented 5 years ago

Currently there is no example or maybe even a possability to get SystemPropertiesand Properties for messages from an Event Hub (IoT Hub) which is configured with Cardinality.MANY.

For example:

@BindingName(value = "Properties") Map<String, Object>[] properties,
@BindingName(value = "SystemProperties") Map<String, Object>[] systemProperties,
@EventHubTrigger(
    name = "message", eventHubName = "eventHubName", dataType = "", connection = "connection", consumerGroup = "consumerGroup",
    cardinality = Cardinality.MANY) String[] message,
final ExecutionContext context

will result in

Executed 'Functions.Test' (Failed, Id=xyz)
System.Private.CoreLib: Exception while executing function: Functions.Test. System.Private.CoreLib: Result: Failure
Exception: NullPointerException: 
Stack: java.lang.NullPointerException
    at com.microsoft.azure.functions.worker.binding.BindingDataStore.getTriggerMetatDataByName(BindingDataStore.java:54)
    at com.microsoft.azure.functions.worker.broker.ParameterResolver.resolve(ParameterResolver.java:62)
    at com.microsoft.azure.functions.worker.broker.ParameterResolver.resolve(ParameterResolver.java:42)
    at com.microsoft.azure.functions.worker.broker.JavaMethodExecutor.execute(JavaMethodExecutor.java:52)
    at com.microsoft.azure.functions.worker.broker.JavaFunctionBroker.invokeMethod(JavaFunctionBroker.java:51)
    at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:33)
    at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:10)
    at com.microsoft.azure.functions.worker.handler.MessageHandler.handle(MessageHandler.java:45)
    at com.microsoft.azure.functions.worker.JavaWorkerClient$StreamingMessagePeer.lambda$onNext$0(JavaWorkerClient.java:92)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
.

The only working option is Cardinality.ONE:

@BindingName(value = "Properties") Map<String, Object> properties,
@BindingName(value = "SystemProperties") Map<String, Object> systemProperties,
@EventHubTrigger(
    name = "message", eventHubName = "eventHubName", dataType = "", connection = "connection", consumerGroup = "consumerGroup",
    cardinality = Cardinality.ONE) String message,
final ExecutionContext context

Reference: https://stackoverflow.com/a/56094438

fra-ga commented 5 years ago

Found in azure-functions-java-worker

@BindingName(value = "PropertiesArray") Map<String, Object>[] properties,
@BindingName(value = "SystemPropertiesArray") Map<String, Object>[] systemProperties,

I did not see a document concerning Java which features adding Array as a suffix to names in bindings. But apparently it works.