Hello I am currently working on a middleware application
Im using JSF and primefaces and the deployment is in tomcat server , I was able to develop a notification system using JAVA.mail and i am using java timer to schedule the notification every 24H
For the moment it works fine when I run my main class but when i run the whole project the process of javaTimer doesn't work and i have no idea how to make run in server side without launching the class Main
So i ask if should add something to make it run when i launch my project
Here my code :
public class Job1 {
public static void main(String[] args) throws Exception {
// execute method review_date() every 1 minute
risk r = new risk();
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
r.review_date2();
} catch (Exception e) {
e.printStackTrace();
}
}
}, 0, 1000 * 60);
}
}
CodePudding user response:
If I need app-wide resources, I usually implement the ServletContextListener
, then specify it to be run in web.xml
. However, swing timers likely don't work so you'll need a ScheduledExecutorService
instead.
package mypackage;
import javax.servlet.*;
public class MainContextListener implements ServletContextListener {
ScheduledExecutorService service;
@Override
public void contextInitialized(ServletContextEvent sce) {
service = newSingleThreadScheduledExecutor();
risk r = new risk();
service.scheduleAtFixedRate(() -> {
try {
r.review_date2();
} catch (Exception e) {
e.printStackTrace();
}
}, 0, 1, TimeUnit.DAYS);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
service.shutdown();
}
}
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID"
version="4.0">
<!-- etc. -->
<listener>
<listener-class>mypackage.MainContextListener</listener-class>
</listener>
</web-app>