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


  • 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

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=""



</web-app> 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 {

	private logFacade facade;

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		try {
			out.println("<title>Servlet showLog</title>");
			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>");

		} finally {

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.



public class scheduleTask {

	@PersistenceContext(unitName = "EJBTimerPU")
	private EntityManager em;
	@Schedule(minute = "*/3",hour = "*")
	public void beginNew() {
		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();
	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 =;
		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.



public class logFacade {

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

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

	public int count() {
		CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
		Root<Log> rt = cq.from(Log.class);;
		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.




... 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.



public class Log implements Serializable {
	private static final long serialVersionUID = 1L;
	@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) { = id;

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

	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 (( == null && != null)
				|| ( != null && ! {
			return false;
		return true;

	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