Implementing an Event for a Provider
Procedure
- Write an event class that extends the AbstractExpressoEvent class.
- Define an event data class whose object represents and returns event data generated by the event back to the Expresso server.
- Override the subscribeToEvent() and unSubscribeFromEvent() to handle subscriptions for the event. The subscribeToEvent() method is called with a providerWebhookUrl parameter which is generated specific to every event by the provider server. This URI listens to a POST call from external services and subsequently routes it to the event through the onExternalEvent() method.
- If the provider requires communication with external services, handle it in the overridden onExternalEvent() method.
- Notify the subscriber using the notifySubscriber() method either in the onExternalEvent() method itself, or elsewhere as per specific provider requirement.
Writing a Class that Extends the AbstractExpressoEvent Class
This sample illustrates the methods that the extending class must implement. Here, TimerEvent.java extends the AbstractExpressoEvent class.public class TimerEvent extends AbstractExpressoEvent
{
// provider specific fields
private boolean isRunning = false;
private Timer timer;
/ EventData class: Every event needs to publish data back to the Expresso
//server. On specific intervals, the timer event will notify the Expresso
//along with an event data object of type TimerEventData. This event data
//class is event specific. This class is set while creating an object in
//the provider class. pojoProvider internally converts the data to JSON
//format as required by Expresso while publish events using an object of
//the event data class.
public static class TimerEventData {
private String message;
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
// subscribeToEvent is called by the pojoProvider on two occasions. When the
//first subscription to an event is received, and if pojoProvider is
//restarted and existing subscriptions from Expresso were present on it. The
//pojoProvider sends a providerWebhookUrl to the provider. This is meant to
//be used by the provider if it listens to another service. For timer, it
//isn’t required, but it is used in the TwilioProvider as the url to listen
//for messages coming from Twilio.
//For example: http://(somehost).com:80/events/Twilio/SMSReceived. Such url
//is then registered with Twilio for listening to webhook callbacks from
//Twilio. For timer, the events are generated locally and thus the
//providerWebhookUrl isn’t required. On receving a call, this method should
//implement logic to initiate the publishing of events. Here, the
//timer.start() call does the same.
@Override
public boolean subscribeToEvent(URI providerWebhookUrl)
{
timer = new Timer();
isRunning = true;
timer.start();
return true;
}
//Once the subscription is received, in case the provider depends on external
//service to notify it with data, the onExternalEvent method is called along
//with the request object and a response object. The provider should extract
//data from the request object and set the response object according to what
//the external service desires. Please refer to the TwilioReceiveSMS class
//in the samples to see this usage. For timer, as no external service is
//communicating with it, This method is left blank. On receiving of external
//event, or on fulfilment of the providers own conditions, the provider has
//to call the notifySubscriber() method passing the event data object
//to it. In this case, we are doing so after regular intervals using the
//Timer class.
@Override
public void onExternalEvent(HttpServletRequest request,HttpServletResponse response)
{
// TODO Auto-generated method stub
}
class Timer extends Thread {
private int interval;
private final TimerEventData eventData;
Timer()
{
/** Use data from properties file to decide time interval between
* events and the message to send in event data. Default is interval
* is 30000 ms and default message is "Hello Expresso"
*/
intrvl = TimerProvider.timerData.get(TIMER_INTERVAL);
if (intrvl == null)
intrvl = "30000";
interval = Integer.parseInt(intrvl);
msg = TimerProvider.timerData.get(TIMER_MESSAGE);
if (msg == null)
msg = "Hello Expresso";
/*
* Create object of class that represents the event data.
*/
eventData = new TimerEventData();
eventData.setMessage(msg);
}
@Override
public void run() {
while (isRunning) {
try {
Thread.sleep(interval);
/*
* Notify subscriber
*/
notifySubscriber(eventData);
} catch (InterruptedException e) {
e.printStackTrace();
}
} // loop ends
} // run() ends
} // class Timer ends
//unSubscribeFromEvent is called when the last subscriber unsubscribes from
//the event. In this method the provider is supposed to handle logic to
//stop sending events. In the TimerProvider we set the flag to false.
@Override
public boolean unSubscribeFromEvent()
{
isRunning = false;
return true;
}
}
Copyright © 2020. TIBCO Software Inc. All Rights Reserved.
