Java EE 7 - Injektion in Runnable/Callable-Objekt
Concurrency Utilities(JSR-236) wurde in Java EE 7.
Gibt es eine Möglichkeit, wie man Spritzen meine EJBs in Runnable/Callable-Objekt?
Speziell möchte ich so etwas wie dieses:
ejb mit business-Logik
@LocalBean
public class MyEjb {
public void doSomeStuff() {
... do some stuff ...
}
}
runnable/callable-Klasse, wo ich will zu injizieren Instanz MyEjb
public class MyTask implements Runnable {
@EJB
MyEjb myEjb;
@Override
public void run() {
...
myEjb.doSomeStuff();
...
}
}
Objekt beginnt die neue Aufgabe
@Singleton
@Startup
@LocalBean
public class MyTaskManager {
@Resource
ManagedExecutorService executor;
@PostConstruct
void init() {
executor.submit(new MyTask());
}
}
myEjb Feld in MyTask ist immer null. Ich nehme an, es könnte helfen, JNDI-lookup, aber es ist eine richtige Art und Weise, wie Sie dies tun?
- Googeln Sie ein bisschen herum, es scheint, dass Sie nur in der Lage sein, es zu tun. Beispiel: martinsdeveloperworld.wordpress.com/2014/02/25/... . Aber wie schon gesagt in einem anderen Kommentar, Sie brauchen zu lassen, das server-handle der task-Erstellung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Muss man dem container eine chance, um zu injizieren, die EJB in Ihrer Task-Instanz. Sie können dies durch die Verwendung einer dynamic-Instanz wie in diesem code:
Weil Sie nicht erstellen Sie die Instanz mit dem new-operator, sondern über die CDI Instanz Mechanismus, der container bereitet jede Instanz von MyTask beim Aufruf
myTaskInstance.get()
.EJB-können nicht gespritzt werden, wenn der MyTask-Instanz wird erstellt, indem Sie, da der Container kennt nur die Instanzen, von Ihr selbst erstellte. Stattdessen können Sie injizieren die EJB in der MyTaskManager Singleton SB und definieren Sie Ihre MyTask Runnable-Klasse als innerclass wie folgt: