The Box API provides an events endpoint that utilizes long-polling to send user
events in real-time. The SDK provides an EventStream
class that automatically
handles long-polling and deduplicating events.
Subscribing to user events works by creating an EventStream
and attaching
listeners for the events that are fetched in near-real time from the API.
When the EventStream
is started, it will begin long-polling on a separate
thread. Events received from the API are then forwarded to any listeners as a
BoxEvent
object.
To create an EventStream
starting from the current point in time, use
the EventStream(BoxAPIConnection api)
constructor. To
start from a known stream position, pass the stream position to the
EventStream(BoxAPIConnection api, long streamPosition)
constructor.
EventStream stream = new EventStream(api);
stream.addListener(new EventListener() {
public void onEvent(BoxEvent event) {
// Handle the event.
}
});
stream.start();
Keep in mind that events are received on a separate thread, so things like UI operations may need to be explicitly delegated back to the UI thread.
When you're done listening for events, be sure to call stream.stop()
to stop
long-polling.
Since the Box API may send duplicate events,
the EventStream
will remember the last 512 received events and automatically
ignore them.
The Box API provides an EventLog
class and a getEnterpriseEvents
method
that reads from the admin-logs streams and returns an Iterable<BoxEvent>
over
Enterprise BoxEvent
records. There is no real-time interface
to Admin Events, but you can specify start and end time/dates. This method
will only work with an API connection for an enterprise admin account.
// get the last two hours of unfiltered enterprise events
Date startDate = new Date(System.currentTimeMillis() - (1000 * 60 * 60 * 2));
Date endDate = new Date(System.currentTimeMillis());
EventLog eventLog = EventLog.getEnterpriseEvents(api, startDate, endDate);
for (BoxEvent event : eventLog) {
System.out.println("Enterprise Event Created by User: "
+ event.getCreatedBy().getName()
+ " Login: " + event.getCreatedBy().getLogin()
+ " Event Type: " + event.getType()
+ " Created at: " + event.getCreatedAt().toString());
};
Additionally, you can set a limit of the number of enterprise events to be retrieved per response by specifying the limit field.
int LIMIT = 5;
BoxAPIConnection api = new BoxAPIConnection("YOUR-DEVELOPER-TOKEN-WITH-ADMIN-ACCESS");
EventLog eventLog = EventLog.getEnterpriseEvents(api, "STREAM-POSITION"
new Date(System.currentTimeMillis() - (1000 * 60 * 60 * 2)),
new Date(System.currentTimeMillis()), LIMIT);
for (BoxEvent event : eventLog) {
System.out.println("Enterprise Event Created by User: "
+ event.getCreatedBy().getName()
+ " Login: " + event.getCreatedBy().getLogin()
+ " Event Type: " + event.getType()
+ " Created at: " + event.getCreatedAt().toString());
};