java - EJB 和在数据结构(映射、列表等)中存储对象

标签 java jboss jakarta-ee ejb-3.0 ejb

是否可以在应用服务器正常运行期间将对象存储在数据结构中?基本上我想要一个与此数据结构接口(interface)的 EJB,但不需要完整的数据库解决方案。

例如,我制作了这个虚拟动物对象:

package com.test.entities;

public class Animal implements java.io.Serializable {

    private static final long serialVersionUID = 3621626745694501710L;
    private Integer id;
    private String animalName;

    public Integer getId() {
        // TODO Auto-generated method stub
        return id;
    }   
    public void setId(Integer id){
        this.id=id;
    }
    public String getAnimalName(){
        return animalName;

    }
    public void setAnimalName(String animalName){
        this.animalName=animalName;
    }
}

下面是EJB Remote接口(interface):

package com.test.beans;

import java.util.Map;

import javax.ejb.Remote;

import com.test.entities.Animal;

@Remote
public interface MapBeanRemote {

    public void addAnimal(Animal a);

    public void removaAnimal(Integer id);

    public Animal getAnimalById(Integer id);

    Map<Integer, Animal> getAllAnimals();

}

这是 session Bean:

package com.test.beans;

import java.util.ConcurrentHashMap;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;

import com.test.entities.Animal;

@Stateless(mappedName="ejb/MapBean")
public class MapBean implements MapBeanRemote{

    Map<Integer, Animal> animalStore;

    @PostConstruct
    public void initialize(){
        animalStore = new ConcurrentHashMap<Integer,Animal>();
    }

    @Override
    public void addAnimal(Animal a) {
        if(a.getId()!=null){
            animalStore.put(a.getId(), a);
        }
    }

    @Override
    public Animal getAnimalById(Integer id) {
        return animalStore.get(id);
    }

    @Override
    public void removaAnimal(Integer id) {
        animalStore.remove(id);

    }

    @Override
    public Map<Integer, Animal> getAllAnimals() {
        return animalStore;
    }

}

所以基本上我希望任何想要操作 Animal Map 的客户端都通过这个 EJB 并让每个客户端访问完全相同的对象 Map。

这个例子还不够好。过了一会儿,所有的动物都被清除了(我假设 EJB 从 bean 池中被替换)这可以以某种方式作为资源注入(inject)吗?

最佳答案

这可以通过将 Map 放入单例中并从 bean 访问该单例来实现。这样所有 EJB 实例都有一个实例(因为它们共享相同的类加载器)。不同 EAR 中的不同 session bean 将无法工作,因为它们每个都有自己的类加载器,但这似乎不是您的场景。

您现有的 ConcurrentHashMap 用法足以处理大多数情况,但您仍然需要围绕 addAnimal 方法进行同步,因为您需要 map 在两个方法调用之间保持一致。

关于java - EJB 和在数据结构(映射、列表等)中存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/636450/

相关文章:

linux - JBOSS 7 AS standalone.sh 无法访问 jboss-modules.jar

java - 如何在 Intellij 中以 Debug模式启动 Jboss 5.1.0.GA 以进行远程调试

java - EJBProcessor异常处理

java - 类文件应该放在哪个文件夹中以便 JSP 访问它?

jsf - 如何使用JSF创建可寻址页面

java - 仅使用递归打印金字塔

java - 是否可以将java类文件中的数据发送到node.js来显示

java - 如何循环遍历列表映射以获取特定的开始日期?

java - 删除 .JSP 文件中的 Java cookie

java - Java中的注解为什么要创建类类型引用?