Restructure Cloud Events support to optionally support Cloud Events SDK

This commit is contained in:
Oleg Zhurakousky
2020-11-30 15:54:50 +01:00
parent 70fbcec586
commit 306da4248a
17 changed files with 751 additions and 703 deletions

View File

@@ -25,13 +25,13 @@ import java.util.function.Function;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.function.cloudevent.CloudEventAttributesProvider;
import org.springframework.cloud.function.cloudevent.CloudEventHeaderEnricher;
import org.springframework.cloud.function.cloudevent.CloudEventMessageBuilder;
import org.springframework.cloud.function.cloudevent.CloudEventMessageUtils;
import org.springframework.cloud.function.web.util.HeaderUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.http.RequestEntity;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.util.Assert;
@@ -104,9 +104,9 @@ public class CloudeventDemoApplication {
}
@Bean
public CloudEventAttributesProvider cloudEventAttributesProvider() {
return attributes -> {
attributes.setSource("https://interface21.com/").setType("com.interface21");
public CloudEventHeaderEnricher cloudEventHeaderEnricher() {
return headers -> {
return headers.setSource("https://interface21.com/").setType("com.interface21");
};
}
@@ -129,11 +129,11 @@ public class CloudeventDemoApplication {
}
@Bean
public Consumer<Message<SpringReleaseEvent>> pojoConsumer(CloudEventAttributesProvider provider, RestTemplateBuilder builder) {
public Consumer<Message<SpringReleaseEvent>> pojoConsumer(CloudEventHeaderEnricher enricher, RestTemplateBuilder builder) {
return eventMessage -> {
Message<?> newMessage = enricher.enrich(CloudEventMessageBuilder.fromMessage(eventMessage)).build(CloudEventMessageUtils.HTTP_ATTR_PREFIX);
RequestEntity<SpringReleaseEvent> entity = RequestEntity.post(URI.create("http://foo.com"))
.headers(HeaderUtils.fromMessage(
new MessageHeaders(CloudEventMessageUtils.generateAttributes(eventMessage, provider))))
.headers(HeaderUtils.fromMessage(newMessage.getHeaders()))
.body(eventMessage.getPayload());
List<String> sourceHeader = entity.getHeaders().get("ce-source");
Assert.isTrue(sourceHeader.get(0).equals("https://interface21.com/"), "'source' must be https://interface21.com/");

View File

@@ -21,6 +21,7 @@ import java.util.function.Function;
import org.junit.jupiter.api.Test;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.function.cloudevent.CloudEventMessageBuilder;
import org.springframework.cloud.function.cloudevent.CloudEventMessageUtils;
import org.springframework.cloud.function.context.FunctionCatalog;
import org.springframework.context.ConfigurableApplicationContext;
@@ -40,9 +41,11 @@ public class CloudeventDemoApplicationFunctionTests {
try(ConfigurableApplicationContext context = new SpringApplicationBuilder(CloudeventDemoApplication.class)
.web(WebApplicationType.NONE).run()) {
FunctionCatalog catalog = context.getBean(FunctionCatalog.class);
Message<String> binaryCloudEventMessage = MessageBuilder
.withPayload("{\"releaseDate\":\"24-03-2004\", \"releaseName\":\"Spring Framework\", \"version\":\"1.0\"}")
.copyHeaders(CloudEventMessageUtils.get("spring.io/spring-event", "com.example.springevent"))
Message<String> inputMessage = CloudEventMessageBuilder
.withData("{\"releaseDate\":\"24-03-2004\", \"releaseName\":\"Spring Framework\", \"version\":\"1.0\"}")
.setSource("https://spring.io/spring-event")
.setType("com.example.springevent")
.build();
/*
@@ -51,16 +54,16 @@ public class CloudeventDemoApplicationFunctionTests {
* inside spring-cloud-function.
*/
Function<Message<String>, Message<String>> asPojoMessage = catalog.lookup("asPOJOMessage");
System.out.println(asPojoMessage.apply(binaryCloudEventMessage));
System.out.println(asPojoMessage.apply(inputMessage));
Function<Message<String>, Message<String>> asPojo = catalog.lookup("asPOJO");
System.out.println(asPojo.apply(binaryCloudEventMessage));
System.out.println(asPojo.apply(inputMessage));
Function<Message<String>, Message<String>> asString = catalog.lookup("asString");
System.out.println(asString.apply(binaryCloudEventMessage));
System.out.println(asString.apply(inputMessage));
Function<Message<String>, Message<String>> asStringMessage = catalog.lookup("asStringMessage");
System.out.println(asStringMessage.apply(binaryCloudEventMessage));
System.out.println(asStringMessage.apply(inputMessage));
}
}
@@ -69,9 +72,11 @@ public class CloudeventDemoApplicationFunctionTests {
try(ConfigurableApplicationContext context = new SpringApplicationBuilder(CloudeventDemoApplication.class)
.web(WebApplicationType.NONE).run()) {
FunctionCatalog catalog = context.getBean(FunctionCatalog.class);
Message<String> binaryCloudEventMessage = MessageBuilder
.withPayload("{\"releaseDate\":\"24-03-2004\", \"releaseName\":\"Spring Framework\", \"version\":\"1.0\"}")
.copyHeaders(CloudEventMessageUtils.get("spring.io/spring-event", "com.example.springevent"))
Message<String> inputMessage = CloudEventMessageBuilder
.withData("{\"releaseDate\":\"24-03-2004\", \"releaseName\":\"Spring Framework\", \"version\":\"1.0\"}")
.setSource("https://spring.io/spring-event")
.setType("com.example.springevent")
.build();
/*
@@ -80,7 +85,7 @@ public class CloudeventDemoApplicationFunctionTests {
* inside spring-cloud-function.
*/
Function<Message<String>, Message<String>> asPojoMessage = catalog.lookup("consumeAndProduceCloudEvent");
System.out.println(asPojoMessage.apply(binaryCloudEventMessage));
System.out.println(asPojoMessage.apply(inputMessage));
}
}
@@ -89,9 +94,11 @@ public class CloudeventDemoApplicationFunctionTests {
try(ConfigurableApplicationContext context = new SpringApplicationBuilder(CloudeventDemoApplication.class)
.web(WebApplicationType.NONE).run()) {
FunctionCatalog catalog = context.getBean(FunctionCatalog.class);
Message<String> binaryCloudEventMessage = MessageBuilder
.withPayload("{\"releaseDate\":\"24-03-2004\", \"releaseName\":\"Spring Framework\", \"version\":\"1.0\"}")
.copyHeaders(CloudEventMessageUtils.get("spring.io/spring-event", "com.example.springevent"))
Message<String> inputMessage = CloudEventMessageBuilder
.withData("{\"releaseDate\":\"24-03-2004\", \"releaseName\":\"Spring Framework\", \"version\":\"1.0\"}")
.setSource("https://spring.io/spring-event")
.setType("com.example.springevent")
.build();
/*
@@ -100,7 +107,7 @@ public class CloudeventDemoApplicationFunctionTests {
* inside spring-cloud-function.
*/
Function<Message<String>, Message<String>> asPojoMessage = catalog.lookup("consumeAndProduceCloudEventAsPojoToPojo");
System.out.println(asPojoMessage.apply(binaryCloudEventMessage));
System.out.println(asPojoMessage.apply(inputMessage));
}
}
}