场景:
我有@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。
答案 0 :(得分:0)
Q1:我怎么能调用@Stateful会话bean的新实例?
您不能将有状态会话Bean注入无状态对象(如Stateless) 可以由多个并发客户端共享的会话Bean或Servlet,您应该使用JNDI。周期。
说实话,我不确定你在做什么,我也看不到重要的步骤,例如删除你的有状态会话Bean。您可能会耗尽内存或导致大量磁盘IO作为将尝试钝化/激活实例以节省内存的容器。
Q2:是真的吗?
你可以调用new
但是不要期望得到别的东西而不是简单的Java类,即不要期望得到一个托管对象,即不要期望得到一个EJB。我认为这不是你想要的。
很抱歉,如果这没有多大帮助,但正如我所说,我真的不明白你想要实现的目标。你应该首先开始解释你的目标,我并不觉得你是在正确的道路上。