让我们稍微修改一下您的示例
@Stateless
public class MyBean1 {
@Resource
private SessionContext sessionContext;
pulic void method1() {
// method implementation
// As a side-effect, something is written into a database
// using an XA data source,
// and a message is sent using XA JMS
// (both under control of an XA transaction)
}
pulic int method2(int i) {
return i * i;
}
}
例如,会话上下文用于获取UserTransaction
and getCallerPrincipal
。它们不一定总是相同的(当两个客户端都是 EJB 时)。至于UserTransaction
:这个绑定到当前线程(参见Javadoc)。
由于会话上下文存储在一个字段中(并且没有将参数传递给每个单独的方法),因此两个不同的客户端不能访问同一个 EJB 实例。
因此规范要求容器序列化对同一实例的调用。
如果您看一下method2
,一个没有任何副作用的纯函数式实现,就不需要 EJB。