Clustering EJB Timers on WildFly 9 with MySQL
04 February 2016
It turns out that getting EJB timer beans configured into a WildFly 9 domain cluster is quite easy. This post records how I got EJB timers working on a WildFly 9 cluster with a MySQL database as the timer bean's datasource. The domain profile I used was the 'ha' profile.
Note this post deals with EJB timer beans and assumes you already have a WildFly 9 HA domain configured with a MySQL connection.
All I had to do was configure the "timer-service" element. Here is the configuration that worked for me:
<timer-service thread-pool-name="default" default-data-store="clustered-store">
<data-stores>
<database-data-store name="clustered-store" datasource-jndi-name="java:/MySqlDS" database="mysql" partition="timer"/>
</data-stores>
</timer-service>
I have read another posts about configuring a 'timer-service' with PostgreSQL that talked about updating the SQL in the 'timer-sql.properties' file. I found that MySQL just worked without the need to change the 'timer-sql.properties' file.
I created an example project to help validate the configuration. Here is the code from the example project:
MessageManager.java
@Stateless
public class MessageManager {
@PersistenceContext
private EntityManager em;
public Message save(Message m){
return em.merge(m);
}
}
MessageTimer.java
@Stateless
public class MessageTimer {
@Inject
private MessageManager mm;
@Schedule(hour = "*", minute = "*", second = "*/10", info ="Runs every 10 seconds", persistent = true)
public void printDate() {
Message m = new Message();
m.setServer(System.getProperty("server.name"));
m.setTime(new java.util.Date().toString());
mm.save(m);
}
}
Message.java
@Entity
@Table(name="message")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Message implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
private String time;
private String server;
// with getters and setters
}
With this code the message table should get exactly one entry, from a cluster bigger than a size of one, every ten seconds. The instance that runs should be seemingly random.
Note: you need to set 'server.name' for each server in the HA group via the server's 'System Properties'.