Jboss 6.0.0.Final: Startup singleton postconstructor transaction timeout when trying to perist entity
jamesarobson Feb 8, 2011 11:27 PMHi, I've an application with a start up singleton which queries thet database and attepts to insert default records if the data does not exist.
On JBoss 6.0.0.Final the transaction times out after haning for five minutes and the initialisation of the container fails.
I've put to gether a sample app which reproduces the persistence problem. I've tried this on Glassfish 3.0.1 and the persistence works.
StartupSingleton.java
@Singleton @Startup @LocalBean //@TransactionManagement(value=TransactionManagementType.CONTAINER) public class StartupSingleton { //private static final Logger logger = Logger.getLogger(StartupSingleton.class); @PersistenceContext(unitName="test-unit") protected EntityManager em; @PostConstruct //@TransactionAttribute(value=TransactionAttributeType.REQUIRES_NEW) public void initialise() { //logger.info("Entered iniitalise"); System.out.println("Entered initailise"); TaskInfo task = new TaskInfo(); task.setDayOfMonth("*"); task.setDayOfMonth("*"); task.setDescription("test task"); task.setEndDate(null); task.setHour("*"); task.setMinute("*"); task.setMonth("*"); task.setNextTimeout(null); task.setSecond("*/30"); task.setStartDate(new Date()); task.setTaskClassName("app/indexer/somejindiname"); task.setTaskClassName("EDocument"); task.setTaskName("TestTask"); task.setYear("*"); //logger.info("Persisting object"); System.out.println("Persisting object"); em.persist(task); //logger.info("object persisted"); System.out.println("Object persisted"); } }
TaskInfo.java
package sample.startup; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity @Table(name="ens_scheduledtasks") public class TaskInfo implements java.io.Serializable { // private static String format1 = "MM/dd/yyyy"; // private static String format2 = "MM/dd/yyyy HH:mm:ss"; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id_task") private String taskId; @Column(name="task_name") private String taskName; @Column(name="task_class_name") private String taskClassName; @Column(name="task_description") private String description; @Column(name="task_start_date") @Temporal(TemporalType.TIMESTAMP) private Date startDate; @Column(name="task_end_date") @Temporal(TemporalType.TIMESTAMP) private Date endDate; @Column(name="task_second") private String second; @Column(name="task_minute") private String minute; @Column(name="task_hour") private String hour; @Column(name="task_day_of_week") private String dayOfWeek; @Column(name="task_day_of_month") private String dayOfMonth; @Column(name="task_month") private String month; @Column(name="task_year") private String year; @Column(name="task_next_timeout") @Temporal(TemporalType.TIMESTAMP) private Date nextTimeout; public TaskInfo() { //this("<Job ID>", "<Job Name>", "java:module/"); } public TaskInfo(String id, String name, String className) { this.taskId = id; this.taskName = name; this.taskClassName = className; this.description = ""; //Default values, every midnight this.startDate = new Date(); this.endDate = null; this.second = "0"; this.minute = "0"; this.hour = "0"; this.dayOfMonth = "*"; this.month = "*"; this.year = "*"; this.dayOfWeek = "*"; } public String getExpression() { return "sec=" + getSecond() + ";min=" + getMinute() + ";hour=" + getHour() + ";dayOfMonth=" + getDayOfMonth() + ";month=" + getMonth() + ";year=" + getYear() + ";dayOfWeek=" + getDayOfWeek(); } @Override public boolean equals(Object obj) { if (obj instanceof TaskInfo) { return getTaskId().equals(((TaskInfo) obj).getTaskId()); } else { return false; } } @Override public String toString() { return getTaskId() + "-" + getTaskName() + "-" + getTaskClassName(); } /** * @return the taskId */ public String getTaskId() { return taskId; } /** * @param taskId the taskId to set */ public void setTaskId(String jobId) { this.taskId = jobId; } /** * @return the taskName */ public String getTaskName() { return taskName; } /** * @param taskName the taskName to set */ public void setTaskName(String jobName) { this.taskName = jobName; } /** * @return the jobClassName */ public String getTaskClassName() { return taskClassName; } /** * @param taskClassName the jobClassName to set */ public void setTaskClassName(String taskClassName) { this.taskClassName = taskClassName; } /** * @return the description */ public String getDescription() { return description; } /** * @param description the description to set */ public void setDescription(String description) { this.description = description; } /** * @return the startDate */ public Date getStartDate() { return startDate; } /** * @param startDate the startDate to set */ public void setStartDate(Date startDate) { this.startDate = startDate; } /** * @return the endDate */ public Date getEndDate() { return endDate; } /** * @param endDate the endDate to set */ public void setEndDate(Date endDate) { this.endDate = endDate; } /** * @return the second */ public String getSecond() { return second; } /** * @param second the second to set */ public void setSecond(String second) { this.second = second; } /** * @return the minute */ public String getMinute() { return minute; } /** * @param minute the minute to set */ public void setMinute(String minute) { this.minute = minute; } /** * @return the hour */ public String getHour() { return hour; } /** * @param hour the hour to set */ public void setHour(String hour) { this.hour = hour; } /** * @return the dayOfWeek */ public String getDayOfWeek() { return dayOfWeek; } /** * @param dayOfWeek the dayOfWeek to set */ public void setDayOfWeek(String dayOfWeek) { this.dayOfWeek = dayOfWeek; } /** * @return the dayOfMonth */ public String getDayOfMonth() { return dayOfMonth; } /** * @param dayOfMonth the dayOfMonth to set */ public void setDayOfMonth(String dayOfMonth) { this.dayOfMonth = dayOfMonth; } /** * @return the month */ public String getMonth() { return month; } /** * @param month the month to set */ public void setMonth(String month) { this.month = month; } /** * @return the year */ public String getYear() { return year; } /** * @param year the year to set */ public void setYear(String year) { this.year = year; } /** * @return the nextTimeout */ public Date getNextTimeout() { return nextTimeout; } /** * @param nextTimeout the nextTimeout to set */ public void setNextTimeout(Date nextTimeout) { this.nextTimeout = nextTimeout; } }
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="test-unit" transaction-type="JTA"> <jta-data-source>scheduleDS</jta-data-source> <class>sample.startup.TaskInfo</class> <properties> <property name="hibernate.hbm2ddl.auto" value="create-tables"/> <!--<property name="eclipselink.ddl-generation" value="create-tables"/>--> </properties> </persistence-unit> </persistence>
ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee" version = "3.1" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"> <display-name>startup test</display-name> </ejb-jar>
I'm assuming that I've done everything correctly and that this is a bug. Where should I be raising this? JBoss AS or EJB3 or somewhere else?
Thanks in advance.