Receive Events
You can use events to obtain changes that occur in Oracle Field Service application, such as field changes, status changes, and so on. An event is generated when a change occurs in the application. There are various events defined within the application such as 'activityCreated', 'activityCompleted', 'inventoryInstalled', and so on. You need to first subscribe to the required events defined in the application before you try retrieving the related changes. You need to specify route events as part of the request for creating a subscription.
Let's look at an example to understand the use of events.
Vision Corporation is a company whose back office system is integrated with Oracle Field Service. The back office system is the master system for all customer and inventory records and should always be synced with Oracle Field Service in near real-time. It is the source where any work/activity is generated before being sent to Oracle Field Service and to which all Oracle Field Service updates are synched back into. Vision Corporation uses the information maintained in the back office system for:
- Work status tracking: Used to keep track of the customer's work status which is then used to bill them for the work that was completed such as an installation activity, trouble call that had a charge, and so on.
- History tracking: Used to maintain historical information for work previously done, such as, details of the technician that completed the work, notes specific to the work, the technician's findings or resolution for the customer request, and so on.
- Business analytics: Used for internal analysis to determine trends in the business, such as, how often an activity occurs, what was done to complete the work, and so on.
Let's suppose you need to update the back office system with all finished activities that you receive from Oracle Field Service. These include activities whose status has been updated to 'completed', 'notdone', or 'suspended'.
To receive the activities, you will first need to subscribe to the events that correspond to the activity status updates. Events are generated when there is a change in the application. In this case, whenever an activity status is updated to 'completed', 'notdone', or 'suspended', a different event is generated. You need to subscribe to these events, which are 'activityCompleted', 'activityNotDone', and 'activitySuspended respectively. After subscribing to these events, you can retrieve the events and the related activity details. You can also delete a subscription that you don't need anymore.
You can subscribe to many types of events. For more information, see Supported Events.
You can specify route events as part of the request for creating a subscription. For more information, see Route Events
Create a Subscription
Suppose you want to subscribe to multiple events, in this case, to events that occur when the activity status is updated to 'completed', 'notdone', or 'suspended'. And you also want to specify some additional configurations for these events such as filter conditions on the events, specific fields to include in the events, and so on. You can create the subscription as follows:
- Construct the request URL for the 'Create subscription' operation.
- Identify the events you need to subscribe
to:
activityCompleted,activityNotDone, andactivitySuspended. - Construct the request body with the
subscriptionConfigparameter to specify the events and the additional configurations. In this scenario, you apply:- One set of configurations for event
activityCompleted - Another set of configurations for events
activityNotDoneandactivitySuspended
- One set of configurations for event
- Run the request using the POST HTTP
method to create the subscription. If the request is successful, you
get a
subscriptionIdindicating that the subscription was created.
Note:
The events that supportfields, filterExpression, and monitorChanges parameters under
the subscriptionConfig parameter
are:
Although you can specify monitorChanges for any of these
events. It only makes sense to include it for events that change fields.
For example, the userDeleted event doesn't change any field, so monitorChanges makes no sense and is ignored.
Example URL
Here's the complete URL with the POST HTTP method.
POST
https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/subscriptions
cURL command
curl -X POST 'https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/subscriptions' -u '<CLIENT_ID>@<INSTANCE_NAME>:<CLIENT_SECRET>' -d '{"subscriptionConfig":[{"events" : ["activityfs.ocs.oraclecloud.completed"],"filterExpression" : "(activityDetails.activityType in ['\''IN'\'','\''TC'\'','\''BR'\'']) AND (user != '\''my_integ'\'') AND (activityDetails.customerName != '\'''\'')","fields" : ["timeSlot","apptNumber","resourceId","resourceInternalId","date","status","customerName","streetAddress","language","masterActivityId"]},{"events" : ["activityNotDone","activitySuspended"],"filterExpression" : "(activityDetails.activityType in ['\''IN'\'','\''TC'\'','\''BR'\'']) AND (user != '\''my_integ'\'') AND (activityDetails.customerName != '\'''\'')","fields" : ["apptNumber","resourceId","date","status","customerName","streetAddress"]}]}'Example Request Body
Here's an example of the request body in JSON format.
{
"subscriptionConfig":[
{
"events" : ["activityCompleted"],
"filterExpression" : "(activityDetails.activityType in ['IN','TC','BR']) AND (user != 'my_integ') AND (activityDetails.customerName != '')",
"fields" : [
"timeSlot",
"apptNumber",
"resourceId",
"resourceInternalId",
"date",
"status",
"customerName",
"streetAddress",
"language",
"masterActivityId"
]
},
{
"events" : [
"activityNotDone",
"activitySuspended"
],
"filterExpression" : "(activityDetails.activityType in ['IN','TC','BR']) AND (user != 'my_integ') AND (activityDetails.customerName != '')",
"fields" : [
"apptNumber",
"resourceId",
"date",
"status",
"customerName",
"streetAddress"
]
}
]
}
Example Response
Here's an example of the response body in JSON format.
HTTP/1.1 200 OK
{
"subscriptionId": "2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2",
"nextPage": "190404-305,0",
"links": [
{
"rel": "describedby",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/metadata-catalog/events"
},
{
"rel": "canonical",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/subscriptions/2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2"
},
{
"rel": "data",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=190404-305,0"
}
]
}
Retrieve Events after Creating a Subscription
After you have created the subscription
successfully, you are ready to retrieve the events and the related
activities using the subscriptionId and nextPage values that
you received in the response of the create subscription operation.
Suppose you created a subscription and in the response, you received
the subscriptionId as 2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2 and the nextPage as 190404-305,0. You can retrieve
the events for the given subscription as follows:
- Construct the request URL for the 'Get events' operation.
- Specify the path parameters,
subscriptionIdas2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2andpageas190404-305,0in the operation URL. - Run the request using the GET HTTP method to retrieve the events.
Note:
- If there are no events in the response, wait for some time for new events to be generated and then try retrieving again, starting from Step 1.
- To retrieve the next set of events,
take a note of the
nextPagevalue in the response and specify it as thepagevalue in the subsequent request or directly use the link provided for"rel":"next"as the request URL for the subsequent request.
You can try retrieving at any interval, but you must keep in my mind the following constraints:
- Time limit: Subscriptions that the you don't attempt to retrieve for more than 36 hours after creation are marked as unused subscriptions. Unused subscriptions expire automatically in 36 hours or 1.5 days. It's recommended that you retrieve the subscriptions at least once during this interval.
- Subscription count limit: The number of subscriptions that you can create at a time must not exceed 100. If the number exceeds 100, the subscription creation fails. You must wait for 36 hours for the oldest subscription to expire.
- Subscription event type limit: You can create only one subscription with the specified event types for each API user. Any attempt to create a second subscription using the same event types returns the existing subscription.
Example URL
Here's the fs.ocs.oraclecloud.complete URL with the GET HTTP method.
GET
https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=190404-305,0cURL command
curl -X GET 'https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=190404-305,0' -u '<CLIENT_ID>@<INSTANCE_NAME>:<CLIENT_SECRET>'Example Response
Here's an example of the response body in JSON format.
{
"found": true,
"nextPage": "190405-414,0",
"items": [
{
"eventType": "activityCompleted",
"time": "2019-04-05 08:56:24",
"user": "brc.root",
"applicationId": "ed46d96e4163c9b642582c4aee4a2f2967906876",
"activityDetails": {
"activityId": 8764272,
"masterActivityId": 0,
"resourceId": "tech_activityCompleted_event986",
"resourceInternalId": 21620,
"date": "2019-04-05",
"apptNumber": "ApptNumber",
"status": "completed",
"timeSlot": "01",
"customerName": "John Doe",
"streetAddress": "8 Palm Pl",
"language": "en",
"languageISO": "en-US"
},
"activityChanges": {
"status": "completed",
"duration": 180,
"endTime": "2019-04-05 19:00:00"
}
},
{
"eventType": "activityNotDone",
"time": "2019-04-05 09:53:03",
"user": "brc.root",
"applicationId": "ed46d96e4163c9b642582c4aee4a2f2967906876",
"activityDetails": {
"activityId": 8764273,
"resourceId": "tech_activityCompleted_event181",
"resourceInternalId": 21621,
"date": "2019-04-05",
"apptNumber": "ApptNumber",
"status": "notdone",
"customerName": "John Doe",
"streetAddress": "8 Palm Pl"
},
"activityChanges": {
"status": "notdone",
"duration": 7560,
"endTime": "2019-04-10 22:00:00"
}
},
{
"eventType": "activityNotDone",
"time": "2019-04-05 10:07:22",
"user": "brc.root",
"applicationId": "ed46d96e4163c9b642582c4aee4a2f2967906876",
"activityDetails": {
"activityId": 8764277,
"resourceId": "tech_activityNotDone_event226",
"resourceInternalId": 21626,
"date": "2019-04-05",
"apptNumber": "ApptNumber",
"status": "notdone",
"customerName": "John Doe",
"streetAddress": "8 Palm Pl"
},
"activityChanges": {
"status": "notdone",
"duration": 240,
"endTime": "2019-04-05 20:00:00"
}
},
{
"eventType": "activitySuspended",
"time": "2019-04-05 10:18:45",
"user": "brc.root",
"applicationId": "ed46d96e4163c9b642582c4aee4a2f2967906876",
"activityDetails": {
"activityId": 8764274,
"resourceId": "tech_activityCompleted_event363",
"resourceInternalId": 21622,
"date": "2019-04-05",
"apptNumber": "ApptNumber",
"status": "pending",
"customerName": "John Doe",
"streetAddress": "8 Palm Pl"
},
"activityChanges": {
"status": "pending",
"startTime": "",
"positionInRoute": 0
}
}
],
"links": [
{
"rel": "describedby",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/metadata-catalog/events"
},
{
"rel": "canonical",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=190404-305,0"
},
{
"rel": "next",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=190405-414,0"
}
]
}
Frequently Asked Questions
-
What happens if Oracle Field Service generates many events at the same time?
The maximum number of events that a single 'Get events' call can return is 1000. But you can specify any limit in the range of 1 to 1000 when making the call. You can then continually make calls for events in batches of 1000 or less, until there are no new events left.
-
How do I ensure that I don't receive the same set of events in the subsequent 'Get events' calls?
In every 'Get events' call, you must specify the
pageand thelimitquery parameters in the request.When you make a 'Get events' call, the response always contains the
nextPagefield irrespective of the number of events returned. When you specify thenextPagefield as thepageparameter in the subsequent call, you get the next set of events following the previous call.The sequence of the 'Get events' calls is as follows:
- Make the first 'Get events' call.
cURL command:
curl -X GET 'https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=1a876085c7a4df6018c04aa2a7066a63341bdc03&limit=2&page=160902-440,0' -u '<CLIENT_ID>@<INSTANCE_NAME>:<CLIENT_SECRET>'Example Response:
{ "nextPage": "160902-478,0", "items": [ { ...event 1... }, { ...event 2... } ] } - Make the next 'Get events' call without any delay since in the
previous call the
nextPagevalue (160902-478,0) is different from thepageparameter value (160902-440,0).cURL Command:
curl -X GET 'https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=1a876085c7a4df6018c04aa2a7066a63341bdc03&limit=2&page=160902-478,0' -u '<CLIENT_ID>@<INSTANCE_NAME>:<CLIENT_SECRET>'Example Response:
{ "nextPage": "160902-478,1", "items": [ { ...event 3... } ] } - Make the next 'Get events' call without any delay since in the
previous call the
nextPagevalue (160902-478,1) is different from thepageparameter value (160902-478,0).cURL Command:
curl -X GET 'https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=1a876085c7a4df6018c04aa2a7066a63341bdc03&limit=2&page=160902-478,1' -u '<CLIENT_ID>@<INSTANCE_NAME>:<CLIENT_SECRET>'Example Response:
{ "found": true, "nextPage": "160902-478,1", "items": [ ], } - You should wait for a while before making
the next 'Get events' call since in the previous call the
nextPagevalue (160902-478,1) is same as thepageparameter value (160902-478,1).
Note:
Suppose you make a 'Get events' call, and the response contains emptyitems, with thenextPagefield having a new value, which is different from the value in the request. In such case, you need to specify thenextPagefield with the new value in the subsequent call to retrieve the next set of events. - Make the first 'Get events' call.
-
What is the recommended time interval between subsequent 'Get events' calls?
The time interval between the calls depend on your requirement.
- If real-time updates are required, the time interval should be 1 minute.
- If real-time updates are not required, the time interval can be an hour or more.
- The time interval must not exceed 1.5 days. In case no 'Get events' requests are received for your subscription in 1.5 days, then the subscription is marked as unused, and is deleted.
Recover Lost Page Parameter for Retrieving Events
Suppose due to some application failure,
such as abnormal termination of the process, you lose the page parameter value that you had
obtained from the previous successful call to the 'Get events' operation.
You can recover it by using the special page identifier lastRequested. The following is
a sample flow depicting the loss and recovery of the page parameter value:
- You call the 'Get events' operation
by passing the
subscriptionIdparameter value and successfully retrieve the events related to the subscription. - You make a subsequent call to the 'Get
events' operation by passing the
subscriptionIdand thepageparameter values obtained from the previous successful 'Get events' call. - You get an application error and lose the page value.
- You recover the page value by calling
the 'Get events' operation and passing the
subscriptionIdparameter value and the specialpageparameter valuelastRequested. - Oracle Field Service uses the value
of the
pageparameter received in the previous 'Get events' call and you receive the events starting from the last page before the failure.
Example URL
Here's the complete URL with the GET HTTP method.
GET
https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=lastRequested
cURL command
curl -X GET 'https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=lastRequested' -u '<CLIENT_ID>@<INSTANCE_NAME>:<CLIENT_SECRET>'Example Response
Here's an example of the response body in JSON format.
{
"found": true,
"nextPage": "190405-417,0",
"items": [
{
"eventType": "activitycompleted",
"time": "2019-04-05 08:56:24",
"user": "brc.root",
"applicationId": "ed46d96e4163c9b642582c4aee4a2f2967906876",
"activityDetails": {
"activityId": 8764272,
"masterActivityId": 0,
"resourceId": "tech_activityCompleted_event986",
"resourceInternalId": 21620,
"date": "2019-04-05",
"apptNumber": "ApptNumber",
"status": "completed",
"timeSlot": "01",
"customerName": "John Doe",
"streetAddress": "8 Palm Pl",
"language": "en",
"languageISO": "en-US"
},
"activityChanges": {
"status": "completed",
"duration": 180,
"endTime": "2019-04-05 19:00:00"
}
},
{
"eventType": "activityNotDone",
"time": "2019-04-05 09:53:03",
"user": "brc.root",
"applicationId": "ed46d96e4163c9b642582c4aee4a2f2967906876",
"activityDetails": {
"activityId": 8764273,
"resourceId": "tech_activityCompleted_event181",
"resourceInternalId": 21621,
"date": "2019-04-05",
"apptNumber": "ApptNumber",
"status": "notdone",
"customerName": "John Doe",
"streetAddress": "8 Palm Pl"
},
"activityChanges": {
"status": "notdone",
"duration": 7560,
"endTime": "2019-04-10 22:00:00"
}
},
{
"eventType": "activityNotDone",
"time": "2019-04-05 10:07:22",
"user": "brc.root",
"applicationId": "ed46d96e4163c9b642582c4aee4a2f2967906876",
"activityDetails": {
"activityId": 8764277,
"resourceId": "tech_activityNotDone_event226",
"resourceInternalId": 21626,
"date": "2019-04-05",
"apptNumber": "ApptNumber",
"status": "notdone",
"customerName": "John Doe",
"streetAddress": "8 Palm Pl"
},
"activityChanges": {
"status": "notdone",
"duration": 240,
"endTime": "2019-04-05 20:00:00"
}
},
{
"eventType": "activitySuspended",
"time": "2019-04-05 10:18:45",
"user": "brc.root",
"applicationId": "ed46d96e4163c9b642582c4aee4a2f2967906876",
"activityDetails": {
"activityId": 8764274,
"resourceId": "tech_activityCpleted_event363",
"resourceInternalId": 21622,
"date": "2019-04-05",
"apptNumber": "ApptNumber",
"status": "pending",
"customerName": "John Doe",
"streetAddress": "8 Palm Pl"
},
"activityChanges": {
"status": "pending",
"startTime": "",
"positionInRoute": 0
}
}
],
"links": [
{
"rel": "describedby",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/metadata-catalog/events"
},
{
"rel": "canonical",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=190404-305,0"
},
{
"rel": "next",
"href": "https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/?subscriptionId=2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2&page=190405-417,0"
}
]
}
Delete a Subscription
Suppose
you want to delete an existing subscription that you don't need, say
the subscription having subscriptionId as 2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2. You can delete the subscription as follows:
- Construct the request URL for the 'Delete subscription' operation.
- Specify the
subscriptionIdvalue as a path parameter in the operation URL. - Run the request using the DELETE HTTP method to delete the subscription.
Note:
You can delete subscriptions only by using the application that created them.Example URL
Here's the complete URL with the DELETE HTTP method.
DELETE
https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/subscriptions/2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2
cURL command
curl -X DELETE 'https://<instance_name>.fs.ocs.oraclecloud.com/rest/ofscCore/v1/events/subscriptions/2fbcfe8c71f38a129b0e3ee63401bc208cbb45f2' -u '<CLIENT_ID>@<INSTANCE_NAME>:<CLIENT_SECRET>'Example Response
Here's an example of the response.
HTTP/1.1 204 OK
No content