Skip to content

Commit

Permalink
CAMEL-11803: Salesforce platform events
Browse files Browse the repository at this point in the history
This adds support for consuming Salesforce platform events via the
CometD long polling mechanism used only for streaming PushTopic
previously.

For emitting platform events, preexisting `createSObject` operation can
be used.
  • Loading branch information
zregvart committed Jul 6, 2018
1 parent 68876cc commit 3908657
Show file tree
Hide file tree
Showing 11 changed files with 731 additions and 102 deletions.
Expand Up @@ -204,6 +204,12 @@
<version>${okclient-version}</version> <version>${okclient-version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>${awaitility-version}</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>


<build> <build>
Expand Down
Expand Up @@ -212,6 +212,62 @@ To subscribe to an existing topic
from("salesforce:CamelTestTopic&sObjectName=Merchandise__c")... from("salesforce:CamelTestTopic&sObjectName=Merchandise__c")...
---- ----


==== Platform events

To emit a platform event use `createSObject` operation. And set the
message body can be JSON string or InputStream with key-value data --
in that case `sObjectName` needs to be set to the API name of the
event, or a class that extends from AbstractDTOBase with the
appropriate class name for the event.

For example using a DTO:

[source,java]
----
class Order_Event__e extends AbstractDTOBase {
@JsonProperty("OrderNumber")
private String orderNumber;
// ... other properties and getters/setters
}
from("timer:tick")
.process(exchange -> {
final Message in = exchange.getIn();
String orderNumber = "ORD" + String.valueOf(in.getHeader(Exchange.TIMER_COUNTER));
Order_Event__e event = new Order_Event__e();
event.setOrderNumber(orderNumber);
in.setBody(event);
})
.to("salesforce:createSObject");
----

Or using JSON event data:

[source,java]
----
from("timer:tick")
.process(exchange -> {
final Message in = exchange.getIn();
String orderNumber = "ORD" + String.valueOf(in.getHeader(Exchange.TIMER_COUNTER));
in.setBody("{\"OrderNumber\":\"" + orderNumber + "\"}");
})
.to("salesforce:createSObject?sObjectName=Order_Event__e");
----

To receive platform events use the consumer endpoint with the API name of
the platform event prefixed with `event/` (or `/event/`), e.g.:
`salesforce:events/Order_Event__e`. Processor consuming from that
endpoint will receive either `org.apache.camel.component.salesforce.api.dto.PlatformEvent`
object or `org.cometd.bayeux.Message` in the body depending on the
`rawPayload` being `false` or `true` respectively.

For example, in the simplest form to consume one event:

[source,java]
----
PlatformEvent event = consumer.receiveBody("salesforce:event/Order_Event__e", PlatformEvent.class);
----

=== Examples === Examples


==== Uploading a document to a ContentWorkspace ==== Uploading a document to a ContentWorkspace
Expand Down

0 comments on commit 3908657

Please sign in to comment.