【译】Stateless Session Bean的生命周期

首先要强调的是session bean的生命周期是由容器控制的而不是应用程序控制的。

stateless session bean的初始状态是不存在(does-not-exist)状态。就是在容器还没有启动的时候。接下来的状态是进入准备池(method-ready- pool)状态。当容器启动后,它会在准备池(method-ready pool)中建立许多stateless session bean的实例。为了在池中建立一个实例,容器会进行一下的步骤:

1. bean被实例化(instantiated)
2. 容器注入到bean的SessionContext。Bean使用SessionContext来对容器查询,查询内容可以是bean的状态(status)或者是上下文(context)
3. 当bean定义了元数据(metadata)的时候,容器会进行对应的依赖注入(dependency injection)
4. 容器接下来,如果bean里有定义的话,容器将会调用PostConstruct的回调方法。PostConstruct方法是用来初始化bean中使用 到的任何资源(resources),例如,这个session bean可能使用了JMS queue来发送消息。JMS使用的connection queue将会在PostConstruct方法中被初始化。在一个state less session bean的生命周期中,仅仅在从does-not-exist状态到method-only pool状态转换的过程中,PostConstruct方法会被调用一次。

接下来容器会调用bean中的business方法。对于方法的 调用可以来自于不同的客户端(client)。相反的,当一个客户端调用一个stateless session bean的方法时,method-ready pool里的任何一个实例都可以被容器选择来实现这个方法。

方法被调用后,容器可能会选择销毁这个bean实例或者当其他的客户端调用这个bean中某个方法的时候重用这个bean实例。

当 容器决定要销毁这个实例的时候,它首先会调用PreDestroy回调方法(如果你定义了PreDestroy方法的话)。PreDestroy方法被用 来整理动作,比如如果你在PostConstruct方法中建立了某个连接的话,会在这里被关闭。在state less session bean的生命周期中,PreDestroy方法仅仅会在当向does-not-exist状态转换时被调用一次。

这种实例池和实例共享的方式意味着,对于stateless session bean来说,当有大量客户端访问的时候,它是具备良好的伸缩性的。

下图是从网络上找到的一副流程图,仅供参考

posted @ 2011-04-10 00:30  dlljc  阅读(731)  评论(0编辑  收藏  举报