2010-01-15 3 views
5

Ich habe angefangen, einen neuen JBoss-Dienst zu schreiben, der einige vorhandene Nahtkomponenten verwenden sollte. Aber es scheint, dass ich aufgrund nicht existierender Kontexte nicht auf diese Komponenten zugreifen kann. Ist es möglich, sie anders als in der typischen Situation mit JSF zu verwenden?Ist es möglich, Seam in einem zeitgesteuerten JBoss-Dienst zu verwenden?

Ein kleiner Ausschnitt zu zeigen, was ich ...

@Service 
public class MyService extends DefaultTimedService implements TimedObject, DefaultServiceInterface { 
    @Timeout 
    public void ejbTimeout(Timer timer) { 
     MyInterface loader = (MyInterface) Component.getInstance(MyInterface.SEAM_NAME, true); 
     // throws no context! 
    } 
} 

tun möchten, dass die folgende Ausnahme zum Beispiel wirft:

java.lang.IllegalStateException: No application context active 
    at org.jboss.seam.Component.forName(Component.java:1945) 
    at org.jboss.seam.Component.getInstance(Component.java:2005) 

Antwort

8

Es gibt eine Möglichkeit, dass ein wenig schmutzig ist und es gibt viele Entwickler, die nicht so ein Hack jemals benutzen würde, aber es wird Ihr Problem lösen:

import org.jboss.seam.contexts.Lifecycle; 

@Service 
public class MyService extends DefaultTimedService implements TimedObject, DefaultServiceInterface { 
    @Timeout 
    public void ejbTimeout(Timer timer) { 
     Lifecycle.beginCall(); 

     MyInterface loader = (MyInterface) Component.getInstance(MyInterface.SEAM_NAME, true); 
     // will not throw no context! 
     // also the Component.getInstance(MyInterface.SEAM_NAME, true,true); call 
     // is another way you could inject that component. 

     Lifecycle.endCall(); 
    } 
} 

ich es in einem Projekt verwendet haben, wo ich couldn Finde nichts anderes, was funktioniert hat. Wenn jemand eine andere Lösung hat, freue ich mich darauf, sie hier zu sehen :).

+0

Danke auch ... Ich werde es versuchen ... sieht dreckig, aber promissing :) –

+0

Die beginCall() hat die Grundlagen ... gut. Jetzt muss ich noch einige andere Voraussetzungen erfüllen, damit meine Komponenten funktionieren. Vielen Dank! –

+3

Ein weiterer Hinweis hier ... beginCall() startet keine Transaktion und alle EntityManager-Operationen scheitern in Ruhe. Bei Verwendung von beginCall() und endCall() ist es zwingend erforderlich, die Transaktion auch zu bearbeiten! Durch die Verwendung von Transaction.instance(). Begin() und Transaction.instance(). Commit() konnte ich etwas wirklich machen. –

1

Welche Möglichkeiten haben Sie für die Komponente definiert? Wahrscheinlich Anwendungskontext wie es so im Fehler steht.

...

So stieß ich um die Quelle und fand heraus, dass Kontexte in einer Klasse gespeichert werden genannt Contexts. Alle Kontexte scheinen Thread-spezifisch zu sein, da sie in gekapselt sind. Das bedeutet, dass für den Thread des zeitgesteuerten Dienstes ...

angegeben werden muss Die Frage bleibt jedoch: Wie erstellt man einen Kontext für einen bestimmten Thread.

+0

Die eine, die ich verwenden möchte, hat SESSION Scope definiert ... Ich könnte zu CONVERSATION wechseln, wenn es hilft. –

1

Können Sie die loader Instanz nicht injizieren, anstatt sie mit diesem statischen Aufruf zu lokalisieren? Ich bin nicht sehr vertraut mit Naht, aber vielleicht (in der Klasse Körper):

@In private MyInterface loader; 

und dann in Ihrer Methode, benutzen Sie einfach die loader.

Wie es scheint, hat Seam die Anwendung/statelesss Bereiche, die die entsprechenden in Ihrem Fall scheint:

@Scope(ScopeType.APPLICATION) 

oder

@Scope(ScopeType.STATELESS) 

einer von denen versuchen - da Ihre Klasse doesn‘ Wenn Sie Informationen aus der Sitzung/Anfrage benötigen, ist es besser, keinen webbezogenen Bereich zu verwenden.

Definieren Sie also MyService und MyInterface in einem der oben genannten Bereiche, und versuchen Sie beide Injektion und Ihre Lookup-Methode.

Überprüfen Sie die Seam tutorial auf Kontexte und Gleichzeitigkeit

This thread scheint hilfreich.

And from this thread Es scheint, es gibt eine @Asynchronous Annotation, die Sie verwenden könnten.

+0

Nein, kann ich nicht.Injection hat das gleiche Problem wie beim Versuch, auf die Komponente wie oben beschrieben zuzugreifen ... der Kontext fehlt. Die Injektion funktioniert nur in bestimmten Typen und wird normalerweise während des Anfrage/Antwort-Lebenszyklus durchgeführt. –

+0

Injektion funktioniert je nach Umfang. Der Anforderungs-/Antwort-Lebenszyklus bezieht sich auf Umrechnungs-/Sitzungs-/Anforderungsbereiche. Da sind andere. – Bozho

+0

Der JBoss-Dienst wird jedoch nicht von den Inspektionsinspektoren berührt ... er wird während des Serverstarts initialisiert. Kann man das lösen? - ahh ... habe gerade deine Bearbeitung erkannt ... werde es versuchen. –

Verwandte Themen