Frage

Ist es möglich, Objekte in einer Datenstruktur für die Dauer einer App Server uptime gespeichert haben? Grundsätzlich mag ich ein EJB, die mit dieser Datenstruktur-Schnittstellen, aber keine vollwertigen Datenbank-Lösung benötigen.

Als Beispiel ich dieses Dummy Tier Objekt gemacht:

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;
    }
}

So, hier ist die EJB Remote- Schnittstelle:

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();

}

Hier ist die 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;
    }

}

Also im Grunde mag ich jeden Kunden, den das Tier Karte manipulieren will durch diese EJB gehen und jeden Client die gleiche genaue Karte von Objekten zugreifen.

In diesem Beispiel gut nicht genug arbeiten. Nach einer Weile alle Tiere gelöscht werden (Ich gehe davon aus, wenn der EJB aus der Bohne Pool ersetzt wird) Könnte die irgendwie als Ressource injiziert werden?

War es hilfreich?

Lösung

Dies kann aus den Bohnen, indem die Karte in einem Singleton und den Zugriff auf diese Singleton erreicht werden. Auf diese Weise gibt es eine einzige Instanz für alle EJB-Instanzen (da sie teilen sich die gleiche Classloader). Verschiedene Session Beans in verschiedenen EAR würde aber nicht funktionieren, wie sie würden jeweils ihre eigenen Klassenlader, aber das scheint nicht Ihr Szenario zu sein.

Ihre bestehende Nutzung von ConcurrentHashMap wird ausreichend die meisten Ihrer Fälle behandeln, aber Sie müssen noch die Synchronisation um die addAnimal Methode, da Sie die Karte benötigen zwischen den beiden Methodenaufrufe konsistent zu sein.

Andere Tipps

New EJB 3.1-Spezifikation liefert neue Art von Bohnen - Singleton Bohnen -, die genau sind, was Sie brauchen. Die einzige Implementierung mit teilweise Unterstützung von EJB 3.1 Ich kenne ist Apache OpenEJB 3.1. Es enthält Singleton Bohnen, aber ich habe sie noch nicht verwendet.

Dies ist eine Stateless Session Bean. Wie der Name schon sagt, sollten Sie nicht jede Art von Zustand in einem solchen Bohne halten. Ein EJB-Container kann mit mehreren Instanzen Ihrer Bean arbeiten, um gleichzeitige Anforderungen zu erfüllen. Wie Sie Daten der Listen aller Instanzen synchronisieren? Ich, was es gibt keine Möglichkeit, dies zu tun.

Mainting eine solche Liste in eine Session-Bean, die die Geschäftslogik provied, verletzt auch das Konzept der Business-Schicht in meiner Meinung nach. Sie müssen sich um Transaktionen und gleichzeitiges Schreiben auf eigene Faust.

Warum nicht halten Sie die Liste der Tiere auf der Client-Seite? Ich Sache dies wäre der bessere Weg.

vollständig und speichern Sie es als eine statische Datenstruktur

Ich denke, das Beste denken wäre, um die Datenstruktur aus dem EJB zu bewegen. Sie sind wahrscheinlich richtig in der Tatsache, dass Ihre Objekte gelöscht werden, weil die EJBs zusammengefasst werden.

Hinweis Je nachdem, wie Sie den Zugriff auf die Datenstruktur implementieren Sie viele brauchen Zugang zu synchronisieren Thread-Sicherheit zu gewährleisten.

Wenn Sie Zustand in Ihrem EJB pflegen wollen betrachten dann bei Stateful Session Beans suchen. Auch wenn Sie wollen, um zu sehen, wenn die Bohnen zerstört werden Sie die ejbRemove Methode i die Anmerkung für Java 5 vergessen außer Kraft setzen könnten.

Karl

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top