This Confluence has been LDAP enabled, if you are an ASF Committer, please use your LDAP Credentials to login. Any problems file an INFRA jira ticket please.

Child pages
  • ejbtimer-javaee6 - A simple EJB timer service application

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

Wiki Markup
{scrollbar}

Application Overview

This sample demonstrates a calender based timer service that triggers certain callbacks to enterprise beans at a specified time or interval programmatically. The cron-style timer service is managed by the EJB container and can be created using @Schedule annotation.

...

Information about the project sucha as module's unique identification, dependencies is described inside the <sys:environment/> tags. It is a good practise to give a module an unique identification, so that it can later be referenced by some other deployable application. This module is in the group org.apache.geronimo.samples. The path specified in the <context-root> tag will be the entry point of this web application. Therefore you can access this web application at http://<hostname>:<port>/ejbtimer-javaee6.

...

...


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1"
         xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.2"
         xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0"
         xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2">

  <sys:environment>
    <sys:moduleId>
      <sys:groupId>org.apache.geronimo.samples</sys:groupId>
      <sys:artifactId>cviewer-javaee6</sys:artifactId>
      <sys:version>${version}</sys:version>
      <sys:type>car</sys:type>
    </sys:moduleId>
    <sys:dependencies/>
    <sys:hidden-classes/>
    <sys:non-overridable-classes/>
  </sys:environment>

  <context-root>/ejbtimer-javaee6</context-root>

</web-app>

ShowLog.java is a servlet component which is annotated with @WebServlet and defines the url pattern using urlPatterns attribute. And a business interface of the session bean logFacade is injected using @ejb annotation so that the servlet could invoke count() and findAll() methods from logFacade.

  • @WebServlet
    The WebServlet annotation is used to annotate a servlet to respond to certain requests on a particular web url in the application. A class annotated with @WebServlet extends the class javax.servlet.http.ServletContextListener and must have the urlPatterns or value attribute specified.

...

...


@WebServlet(name = "showLog", urlPatterns = { "/showLog" })
public class showLog extends HttpServlet {

	@EJB
	private logFacade facade;

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		try {
			out.println("<html>");
			out.println("<head>");
			out.println("<title>Servlet showLog</title>");
			out.println("</head>");
			out.println("<body>");
			out.println("<h1>Currently,there are " + facade.count()
					+ " log records.</h1>");
			List<Log> logList = facade.findAll();
			out.println("<table border=1>");
			out.println("<tr><th>Log ID</th><th>Event Time</th><th>Event</th></tr>");
			for (Log log : logList) {
				out.println("<tr><td>" + log.getId() + "</td><td>"
						+ log.getCreateTime() + "</td><td>" + log.getEvent()
						+ "</td></tr>");
			}
			out.println("</table>");
			out.println("</body>");
			out.println("</html>");

		} finally {
			out.close();
		}
	}

scheduleTask is a stateless session bean with multiple methods annotated with @Schedule annotations. Each method will be invoked according to the attributes specified to @Schedule. Also, there are two specified methods logIntoDB(String event) and clearLogs() to perform actions on an entity EJBTimerPU injected with @PersistenceContext annotation.

...

...


@Stateless
public class scheduleTask {

	@PersistenceContext(unitName = "EJBTimerPU")
	private EntityManager em;
	
	@Schedule(minute = "*/3",hour = "*")
	public void beginNew() {
		clearLogs();
		logIntoDB("Begin new logs in the next 3 minutes.");
	}

	@Schedule(second = "*/7", minute = "*", hour = "*")
	public void test_automatic_timer() {
		logIntoDB("Every 7 seconds,backup the system");
	}

	// wake you up everyMorning at 7:50 from Monday to Friday

	@Schedule(minute = "50", hour = "7", dayOfWeek = "Mon,Tue,Wed,Thu,Fri")
	public void wakeup() {
		logIntoDB("wake you up@7:50");
	}

	@Schedule(minute = "*/2", hour = "*")
	public void backup() {
		logIntoDB("Send a mail every two minites");
	}

	@Schedule(second = "*/15", minute = "*", hour = "*")
	public void attack() {
		logIntoDB("Try to connect or attack a website every 15 seconds");
	}

	@Schedule(hour = "14", dayOfMonth = "last")
	public void cleanup() {
		logIntoDB("clean up all the dirty info in DB at 2:00pm of the end of month");
	}

	@Schedule(hour = "15/1", dayOfWeek = "Sat,Sun")
	public void nofifyFifteen() {
		logIntoDB("On Sat and Sunday,from 3:00 pm, you will get notified every hour ");
	}

	// Fool friends at each April 1st.

	@Schedule(dayOfMonth = "1", month = "Apr")
	public void foolFriends() {
		logIntoDB("Today is fool's day.All your friends will get this information");
	}

	public void logIntoDB(String event) {
		Date dt = new Date();
		DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		String nowTime = df.format(dt);
		Log log = new Log();
		log.setCreateTime(nowTime);
		log.setEvent(event);
		System.out.println("event");
		em.persist(log);
	}
	
	public void clearLogs() {
		Query query = em.createQuery("select l from Log l");
		List result = query.getResultList();
		Iterator<Log> iterator = result.iterator();
		while (iterator.hasNext()) {
			Log log = iterator.next();
			em.remove(log);
		}
		em.flush();
		logIntoDB("Logs of the last 3 minutes have been cleared.");
	}

}

logFacade is a stateless session bean to define another two actions on an entity EJBTimerPU, where both methods are invoked from the servlet component ShowLog.

...

...


@Stateless
public class logFacade {

	@PersistenceContext(unitName = "EJBTimerPU")
	private EntityManager em;

	public List<Log> findAll() {
		CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
		cq.select(cq.from(Log.class));
		return em.createQuery(cq).getResultList();
	}

	public int count() {
		CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
		Root<Log> rt = cq.from(Log.class);
		cq.select(em.getCriteriaBuilder().count(rt));
		Query q = em.createQuery(cq);
		return ((Long) q.getSingleResult()).intValue();
	}
}

persistence.xml is the configuration file to define a persistence unit named EJBTimerPU, which represents a table named OPENJPASEQ in a derby database ejbtimerdb.

...

...

Log

...

Log.java is an entity bean representing a primary key class of the database table. A primary key class must implement the hashCode() and equals(Object object) methods.

...

...


@Entity
public class Log implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	String createTime;
	String event;

	public String getCreateTime() {
		return createTime;
	}

	public void setCreateTime(String createTime) {
		this.createTime = createTime;
	}

	public String getEvent() {
		return event;
	}

	public void setEvent(String event) {
		this.event = event;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Override
	public int hashCode() {
		int hash = 0;
		hash += (id != null ? id.hashCode() : 0);
		return hash;
	}

	@Override
	public boolean equals(Object object) {
		// TODO: Warning - this method won't work in the case the id fields are
		// not set
		if (!(object instanceof Log)) {
			return false;
		}
		Log other = (Log) object;
		if ((this.id == null && other.id != null)
				|| (this.id != null && !this.id.equals(other.id))) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return "com.test.entity.Log[id=" + id + "]";
	}

}

Get the source code

Please reference Samples General Information for information on obtaining and building the source for this and other samples.

...

mvn clean install

...