## Cloud Events with Spring samples

### Introduction
The current example uses spring-cloud-function framework as its core which allows users to only worry about functional aspects of 
their requirement while taking care-off non-functional aspects. For more information on Spring Cloud Function please visit 
our https://spring.io/projects/spring-cloud-function[project page].
The example provides dependency and instructions to demonstrate several distinct invocation models:

 - Direct function invocation
 - Function as a REST endpoint
 - Function as message handler (e.g., Kafka, RabbitMQ etc)
 - Function invocation via RSocket
 
The POM file defines all the necessary dependency in a segregated way, so you can choose the one you're interested in.
 
#### Direct function invocation

#### Function as a REST endpoint

Given that SCF allows function to be exposed as REST endpoints, you can post cloud event to any of the 
functions by using function name as path (e.g., localhost:8080/<function_name>)

Here is an example of curl command posting a cloud event in binary-mode:

[source, text]
----
curl -w'\n' localhost:8080/asPOJO \
 -H "ce-Specversion: 1.0" \
 -H "ce-Type: com.example.springevent" \
 -H "ce-Source: spring.io/spring-event" \
 -H "Content-Type: application/json" \
 -H "ce-Id: 0001" \
 -d '{"releaseDate":"24-03-2004", "releaseName":"Spring Framework", "version":"1.0"}'
----

And here is an example of curl command posting a cloud event in structured-mode:

[source, text]
----
curl -w'\n' localhost:8080/asString \
 -H "ce-Specversion: 1.0" \
 -H "ce-Type: com.example.springevent" \
 -H "ce-Source: spring.io/spring-event" \
 -H "Content-Type: application/cloudevents+json" \
 -H "ce-Id: 0001" \
 -d '{
    "specversion" : "1.0",
    "type" : "org.springframework",
    "source" : "https://spring.io/",
    "id" : "A234-1234-1234",
    "datacontenttype" : "application/json",
    "data" : {
        "version" : "1.0",
        "releaseName" : "Spring Framework",
        "releaseDate" : "24-03-2004"
    }
}'
----

#### Function as message handler (e.g., Kafka, RabbitMQ etc)

Streaming support for Kafka and Rabbit is provided via Spring Cloud Stream framework (link). In fact we're only mentioning Kafka and Rabbit here as an example.
Streaming support is automatically provided for any existing binders (e.g., Solace, GCP, AWS etc) (link)
Binders are components of SCSt responsible to bind user code (e.g., function) to broker destinations so execution is triggered
by messages on broker destination and results of execution are sent to broker destinations. Binders also provide support consumer 
groups and partitioning for both Kafka and RabbitMQ messaging systems. 


#### Function invocation via RSocket

TBD