由于bkail声明@Stateless bean的池化语义是特定于供应商的。也就是说在EJB 3.1中我们添加了@AccessTimeout
注释,该注释可以用于豆类或@Stateless
,@Stateful
或@Singleton
bean的方法。
@AccessTimeout
在一般意义上,这批注便携指定了多久,如果等待条件与并发访问时主叫方将等待。具体到每个bean的类型,等待何时将发生的条件:
@Singleton
- 一个@Lock(WRITE)
方法被调用并且正在使用容器管理并发。所有方法默认为@Lock(WRITE)
。
@Stateful
- 调用实例的任何方法并发生第二次调用。或者@Stateful bean在一个事务中,调用者从该事务之外调用它。
@Stateless
- 池中没有实例可用。但是,正如所指出的那样,汇集语义,如果有的话,不包括在规范中。如果供应商的池语义确实包含等待条件,则应该使用@AccessTimeout。
用法
的@AccessTimeout
是简单地围绕java.util.concurrent
API中常用long
和TimeUnit
元组一个方便的包装。
import java.util.concurrent.TimeUnit;
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface AccessTimeout {
long value();
TimeUnit unit() default TimeUnit.MILLISECONDS;
}
当一个bean类或方法明确设置,它有三个可能的含义:
@AccessTimeout(-1)
- 从不超时,等待,只要它需要。可能永远。
@AccessTimeout(0)
- 永不等待。如果发生等待情况,立即抛出ConcurrentAccessException
。
@AccessTimout(30, TimeUnit.SECONDS)
- 如果发生等待情况,最多等待30秒。在此之后,扔ConcurrentAccessTimeoutExcpetion
没有标准的默认
注意,value
属性没有缺省。这是故意的,意在表明如果@AccessTimeout
未明确使用,您获得的行为是特定于供应商的行为。
一些供应商会等待预先配置的时间并抛出javax.ejb.ConcurrentAccessException
,一些供应商会立即抛出它。当我们定义这个注释时,很明显,我们所有的供应商都在做一些不同的事情,强制执行默认会导致现有应用程序出现问题。
在类似的说明中,在EJB 3.0之前,没有默认的事务属性,它对每个供应商都不同。谢天谢地,EJB 3.0已经不同了,我们终于可以说:“对于EJB 3.0 bean,默认值是必需的。”
这是所有供应商特定的。你正在使用哪个EJB容器?我建议在问题中添加“glassfish”,“openejb”,“weblogic”,“websphere”等标签。 – 2011-06-16 22:06:44