没有调用查找的新的有状态会话bean实例

时间:2010-05-09 18:23:32

标签: java java-ee java-ee-6 glassfish-3 ejb-3.1

场景:

我有@Singleton UserFactory@Stateless可能),其方法createSession()通过手动查找生成@Stateful UserSession bean。

如果我正在注册DI @EJB - 我将在调用fromFactory()方法时获得相同的实例(应该是这样)

我想要的是 - 在不执行查找的情况下获取UserSession的新实例。

Q1:我怎样才能调用@Stateful会话bean的新实例?

代码:

@Singleton
@Startup
@LocalBean
public class UserFactory {

    @EJB
    private UserSession session;

    public UserFactory() {
    }


    @Schedule(second =  "*/1", minute = "*", hour = "*")
    public void creatingInstances(){
        try {
            InitialContext ctx = new InitialContext();
            UserSession session2 = (UserSession) ctx.lookup("java:global/inferno/lic/UserSession");
            System.out.println("in singleton UUID " +session2.getSessionUUID());    
        } catch (NamingException e) {
            e.printStackTrace();
        }

    }

    @Schedule(second =  "*/1", minute = "*", hour = "*")
    public void fromFactory(){
        System.out.println("in singleton UUID " +session.getSessionUUID());
    }


    public UserSession creatSession(){
        UserSession session2 = null;
        try {
            InitialContext ctx = new InitialContext();
            session2 = (UserSession) ctx.lookup("java:global/inferno/lic/UserSession");
            System.out.println("in singleton UUID " +session2.getSessionUUID());
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return session2;

    }



}

据我了解,请致电

session.getClass().newInstance();

不是最好的主意

Q2:是真的吗?


更新

目标

实际上,目标是创建一些会管理用户会话的SessionsFactory(这是Web服务用户)

Session @Statefull bean:

@Stateful
//Destroying outomaticly after 30 minuts inactive
@StatefulTimeout(180000)
@LocalBean
public class UserSession {
    //represent creation time, used by scheduler for destroying session
    private GregorianCalendar creationDate;
    private UUID sessionUUID;
    private String userId;
    private String state;

    //TODO change to xml
    private String histrory;

    public UserSession() {
    }
    @PostConstruct
    private void initSession(){
        //getting construction date
        creationDate = (GregorianCalendar) Calendar.getInstance();
        //generationg session id
        sessionUUID = UUID.randomUUID();
    }

    @PreDestroy
    private void releaseResource(){
        creationDate =null;
        sessionUUID = null;
        userId =null;
    }

    @Remove
    public void destroySession(){

    }

    public UUID getSessionUUID() {
        return sessionUUID;
    }

    public GregorianCalendar getCreationDate() {
        return creationDate;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getHistrory() {
        return histrory;
    }

    public void addHistroryEntry(String entry) {
        //TODO add history entry

    }
}

在工厂方法中,我想创建@Statefull UserSession的新实例并管理每个用户创建的会话数,并在一段时间(30分钟)后调用destroySession()

我需要跟踪用户会话请求的历史记录,并在以后保留历史记录。

所以我认为@Statefull bean应该满足我的需求。但看起来JNDI名称的查找是唯一可以创建新ejb的机会。我正在寻找可能性  在没有查找的情况下注入新的ejb实例,也许可以获取当前创建的@Statefull UserSession实例的集合,而不是在某些地图/集合中保存thrm。

Q3:那么..只有JNDI会帮我创建新的ejb实例吗?

问题4:是否可以从容器中收集一些ejb的实例?


我正在使用glassfish v3,ejb 3.1。

1 个答案:

答案 0 :(得分:0)

  

Q1:我怎么能调用@Stateful会话bean的新实例?

您不能将有状态会话Bean注入无状态对象(如Stateless) 可以由多个并发客户端共享的会话Bean或Servlet,您应该使用JNDI。周期。

说实话,我不确定你在做什么,我也看不到重要的步骤,例如删除你的有状态会话Bean。您可能会耗尽内存或导致大量磁盘IO作为将尝试钝化/激活实例以节省内存的容器。

  

Q2:是真的吗?

可以调用new但是不要期望得到别的东西而不是简单的Java类,即不要期望得到一个托管对象,即不要期望得到一个EJB。我认为这不是你想要的。


很抱歉,如果这没有多大帮助,但正如我所说,我真的不明白你想要实现的目标。你应该首先开始解释你的目标,我并不觉得你是在正确的道路上。