Java 单例 bean 创建列表的多个实例
Java Singleton bean creating multiple instances of a list
我对这里发生的事情一头雾水。我有一个包含列表的单例 bean。当我向列表中添加项目时,内容始终是一致的。但是,当我从另一个服务调用该列表上的 get 时,它 returns 一个具有不同 java id 的空列表。不知何故,单例 bean 有两个不同的包含列表实例,具体取决于调用者。
class 的定义如下:
@Startup
@LocalBean
@DependsOn({ "classnameremoved" })
@Dependent
@Singleton
public class SomeManager
{
private List<someType> aList = new ArrayList<someType>();
public List<someType> getListData()
{
List<someType> returnList = new ArrayList<someType>();
synchronized (aList)
{
returnList.addAll(aList);
}
return returnList;
}
public void handleCreatedEvent(Data someData)
{
synchronized (aList)
{
aList.add(someData);
}
}
}
两者的区别是:
从侦听新消息并调用适当处理程序的 bean 调用 add 方法。 get 是从另一个处理数据的 bean 调用的。当我从两个接一个地调用时,列表具有不同的 ID,并且不是同一个对象。我不知道这是怎么回事。
在这两个 bean 中,我都将上面的 class 包含在以下行中:
@EJB
private SomeManager someManager;
另外两个class有如下注解:
这个 class 在列表中总是有正确的数据,并且不会在重复测试中被清除。
@Singleton
@Startup
@LocalBean
@DependsOn("some class")
public class MessageListener ...
这个class总是返回一个空列表
@Stateless
@LocalBean
@javax.ejb.TransactionManagement(javax.ejb.TransactionManagementType.BEAN)
public class GetClass ...
非常感谢任何关于正在发生的事情的提示。这一切都在一台本地机器上。
我对这里发生的事情一头雾水。我有一个包含列表的单例 bean。当我向列表中添加项目时,内容始终是一致的。但是,当我从另一个服务调用该列表上的 get 时,它 returns 一个具有不同 java id 的空列表。不知何故,单例 bean 有两个不同的包含列表实例,具体取决于调用者。
class 的定义如下:
@Startup
@LocalBean
@DependsOn({ "classnameremoved" })
@Dependent
@Singleton
public class SomeManager
{
private List<someType> aList = new ArrayList<someType>();
public List<someType> getListData()
{
List<someType> returnList = new ArrayList<someType>();
synchronized (aList)
{
returnList.addAll(aList);
}
return returnList;
}
public void handleCreatedEvent(Data someData)
{
synchronized (aList)
{
aList.add(someData);
}
}
}
两者的区别是:
从侦听新消息并调用适当处理程序的 bean 调用 add 方法。 get 是从另一个处理数据的 bean 调用的。当我从两个接一个地调用时,列表具有不同的 ID,并且不是同一个对象。我不知道这是怎么回事。
在这两个 bean 中,我都将上面的 class 包含在以下行中:
@EJB
private SomeManager someManager;
另外两个class有如下注解:
这个 class 在列表中总是有正确的数据,并且不会在重复测试中被清除。
@Singleton
@Startup
@LocalBean
@DependsOn("some class")
public class MessageListener ...
这个class总是返回一个空列表
@Stateless
@LocalBean
@javax.ejb.TransactionManagement(javax.ejb.TransactionManagementType.BEAN)
public class GetClass ...
非常感谢任何关于正在发生的事情的提示。这一切都在一台本地机器上。