A while ago, I built an MAF application, which was consuming a few REST webservices from Oracle Java Cloud. But for each request from the app, the response JSON was getting created, and which made the app response very slow.
So, I created the contents of the REST response as a scheduled job. My data wasn't getting changed that often, so I choose to build my REST responses every morning at 10am using java.util.TimerTask.
Used Software: JDeveloper 12.1.3
#1. REST response POJOs :
public class Feed {
public String url;
public String source;
public Feed() {
super();
}
public Feed(String source, String url) {
setSource(source);
setUrl(url);
}
public void setSource(String source) {
this.source = source;
}
public String getSource() {
return source;
}
public void setUrl(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}
================================
@XmlRootElement(name = "feeds")
public class FeedsArray {
private List<Feed> feeds;
public void setFeeds(List<Feed> feeds) {
this.feeds = feeds;
}
public List<Feed> getFeeds() {
return feeds;
}
}
#2. TimerTask class :
You need to create a class which extends java.util.TimerTask and override run() to put your custom code.
I have used a Singleton object (Feeds) to create and store my response.
public class FeedRSSScheduler extends TimerTask {
public FeedRSSScheduler() {
super();
}
@Override
public void run() {
Feeds.getInstance().buildFeedsMap();
}
}
============================
public class Feeds {
private static Feeds instance = null;
private FeedsArray feedsArray;
protected Feeds() {
super();
}
public static Feeds getInstance() {
if(instance == null) {
instance = new Feeds();
}
return instance;
}
public FeedsArray getFeedsArray() {
if(feedsArray == null) {
buildFeedsMap();
}
return feedsArray;
}
public void buildFeedsMap() {
// PUT your custom code here to populate the FeedsArray object
}
}
#3. Servlet container class :
public class JobSchedulerServlet extends ServletContainer {
private final static long ONCE_PER_DAY = 1000*60*60*24;
private final static int TEN_AM = 10;
private final static int ZERO_MINUTES = 0;
public JobSchedulerServlet(Application application) {
super(application);
}
@Override
public void init() throws ServletException {
startFeedRSSTask();
super.init();
}
public JobSchedulerServlet(Class<? extends Application> class1) {
super(class1);
}
public JobSchedulerServlet() {
super();
}
private Date getTomorrowMorning10AM(){
Date date2am = new Date();
date2am.setHours(TEN_AM);
date2am.setMinutes(ZERO_MINUTES);
return date2am;
}
private void startFeedRSSTask(){
FeedRSSScheduler feedRSSScheduler = new FeedRSSScheduler();
Timer timer = new Timer();
timer.schedule(feedRSSScheduler, getTomorrowMorning10AM(), ONCE_PER_DAY);
}
}
#4. Register your Servlet container class in web.xml :
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>rest.scheduler.JobSchedulerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
#5. Create REST service :
@Path("/feeds")
public class FeedMap {
@GET
@Path("/sources")
@Produces(MediaType.APPLICATION_JSON)
public FeedsArray getFeedsMap() {
return Feeds.getInstance().getFeedsArray();
}
}
/// URL to access this service : http://<server>:<port>/<context_root>/feeds/sources
That's it. When you create and deploy this WAR file, the job will start instantly and then every day morning at 10am.
So, I created the contents of the REST response as a scheduled job. My data wasn't getting changed that often, so I choose to build my REST responses every morning at 10am using java.util.TimerTask.
Used Software: JDeveloper 12.1.3
#1. REST response POJOs :
public class Feed {
public String url;
public String source;
public Feed() {
super();
}
public Feed(String source, String url) {
setSource(source);
setUrl(url);
}
public void setSource(String source) {
this.source = source;
}
public String getSource() {
return source;
}
public void setUrl(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}
================================
@XmlRootElement(name = "feeds")
public class FeedsArray {
private List<Feed> feeds;
public void setFeeds(List<Feed> feeds) {
this.feeds = feeds;
}
public List<Feed> getFeeds() {
return feeds;
}
}
#2. TimerTask class :
You need to create a class which extends java.util.TimerTask and override run() to put your custom code.
I have used a Singleton object (Feeds) to create and store my response.
public class FeedRSSScheduler extends TimerTask {
public FeedRSSScheduler() {
super();
}
@Override
public void run() {
Feeds.getInstance().buildFeedsMap();
}
}
============================
public class Feeds {
private static Feeds instance = null;
private FeedsArray feedsArray;
protected Feeds() {
super();
}
public static Feeds getInstance() {
if(instance == null) {
instance = new Feeds();
}
return instance;
}
public FeedsArray getFeedsArray() {
if(feedsArray == null) {
buildFeedsMap();
}
return feedsArray;
}
public void buildFeedsMap() {
// PUT your custom code here to populate the FeedsArray object
}
}
#3. Servlet container class :
public class JobSchedulerServlet extends ServletContainer {
private final static long ONCE_PER_DAY = 1000*60*60*24;
private final static int TEN_AM = 10;
private final static int ZERO_MINUTES = 0;
public JobSchedulerServlet(Application application) {
super(application);
}
@Override
public void init() throws ServletException {
startFeedRSSTask();
super.init();
}
public JobSchedulerServlet(Class<? extends Application> class1) {
super(class1);
}
public JobSchedulerServlet() {
super();
}
private Date getTomorrowMorning10AM(){
Date date2am = new Date();
date2am.setHours(TEN_AM);
date2am.setMinutes(ZERO_MINUTES);
return date2am;
}
private void startFeedRSSTask(){
FeedRSSScheduler feedRSSScheduler = new FeedRSSScheduler();
Timer timer = new Timer();
timer.schedule(feedRSSScheduler, getTomorrowMorning10AM(), ONCE_PER_DAY);
}
}
#4. Register your Servlet container class in web.xml :
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>rest.scheduler.JobSchedulerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
#5. Create REST service :
@Path("/feeds")
public class FeedMap {
@GET
@Path("/sources")
@Produces(MediaType.APPLICATION_JSON)
public FeedsArray getFeedsMap() {
return Feeds.getInstance().getFeedsArray();
}
}
/// URL to access this service : http://<server>:<port>/<context_root>/feeds/sources
That's it. When you create and deploy this WAR file, the job will start instantly and then every day morning at 10am.
TimerTask is old approach, use ScheduledThreadPoolExecutor
ReplyDelete