- Glassfish4 系では、glassfish-ejb-jar.xml に設定する必要がある。 (JBoss/Weblogicには @Timeout アノテーションがあるらしい)
- war の場合には WEB-INF/ 配下に置く
- 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">
</ejb-jar>
- glassfish-ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC
"-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN"
"http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>TimeoutSessionBean</ejb-name>
<cmt-timeout-in-seconds>200</cmt-timeout-in-seconds>
</ejb>
</enterprise-beans>
</glassfish-ejb-jar>
ejb-name は、管理コンソール (https://localhost:4848) からアプリケーションを選択すれば、SessionBean? がどんな名前で登録されているか分かる。普通はクラス名
- 対象の TimeoutSessionBean? は、こんな感じ
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJBException;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@Stateless
@LocalBean
public class TimeoutSessionBean {
@PersistenceContext(unitName = "warehousePU")
private EntityManager em;
public long timeout(long wtime) throws EJBException {
try {
//
// (DBアクセスコード)
//
long start = System.currentTimeMillis();
Thread.sleep(wtime);
return System.currentTimeMillis() - start;
} catch (InterruptedException ex) {
Logger.getLogger(TimeoutSessionBean.class.getName()).log(Level.SEVERE, "TIMEOUT ERROR", ex);
throw new EJBException(ex);
}
}
}
ちなみに、SessinBean? から DBMS にアクセスしない場合には、何の例外も発生しない (Glassfishのログに、警告ログが出力されるだけ)