2010-01-15 22 views
5

Empecé a escribir un nuevo servicio de JBoss temporizado que tenía la intención de usar algunos componentes de costura existentes. Pero parece que no puedo acceder a estos componentes debido a contextos inexistentes. ¿Es posible usarlos de otra manera que no sea en la situación típica con JSF?¿Es posible usar Seam en un servicio sincronizado de JBoss?

Un pequeño fragmento de demostrar lo que quiero hacer ...

@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! 
    } 
} 

que arroja la siguiente excepción por ejemplo:

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) 

Respuesta

8

Hay una manera que es un poco sucio y hay muchos desarrolladores que no usaría un corte tal vez, pero que va a resolver su problema:

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

lo he utilizado en un proyecto en el que no podía No encuentras nada más que haya funcionado. Si alguien tiene otra solución, estoy deseando verla aquí :).

+0

Gracias también ... Lo probaré ... parece sucio pero prometedor :) –

+0

El beginCall() hizo lo básico ... bueno. Ahora tengo que resolver algunas otras condiciones previas para que funcionen mis componentes. ¡Gracias! –

+3

Una sugerencia más aquí ... beginCall() no inicia una transacción y todas las operaciones de EntityManager fallan silenciosamente. Si usa beginCall() y endCall() ¡también es obligatorio manejar la transacción! Al usar Transaction.instance(). Begin() y Transaction.instance(). Commit() podría conseguir que realmente hiciera algo real. –

1

¿Qué posibilidades se han definido para el componente? Probablemente el contexto de la aplicación como lo dice en el error.

...

Así Empujé alrededor de la fuente, y se informó que los contextos se almacenan en una clase llamada Contexts. Todos los contextos parecen ser específicos de subprocesos, porque están encapsulados en ThreadLocal-instances. Eso significa que tiene que especificarse para el hilo del servicio temporizado ...

La pregunta sigue siendo sin embargo: cómo crear un contexto para un hilo específico.

+0

El que quiero usar tiene definido SESION Scope ... Podría cambiar a CONVERSATION si me ayuda. –

1

¿No puede inyectar la instancia loader, en lugar de ubicarla con esa llamada estática? No estoy muy familiarizado con la costura, pero tal vez (en el cuerpo de la clase):

@In private MyInterface loader; 

y luego, en su método, sólo tiene que utilizar el loader.

Por lo que parece, la costura tiene los ámbitos de aplicación/statelesss, que parece el más adecuado en su caso:

@Scope(ScopeType.APPLICATION) 

o

@Scope(ScopeType.STATELESS) 

probar una de esas - Dado que la clase doesn' Parece que necesita información de la sesión/solicitud, es más apropiado no usar un alcance relacionado con la web.

Defina MyService y MyInterface en uno de los ámbitos anteriores e intente con la inyección y el método de búsqueda.

Comprobar la Seam tutorial de contextos y de concurrencia

This thread parece útil.

And from this thread Parece que hay una anotación @Asynchronous, que puede utilizar.

+0

No, no puedo.La inyección tiene el mismo problema que con tratar de acceder al componente como se describió anteriormente ... falta el contexto. La inyección solo funciona en tipos específicos y normalmente se realiza durante el ciclo de vida de solicitud/respuesta. –

+0

inyección funciona según el alcance. el ciclo de vida de solicitud/respuesta se trata de ámbitos de convergencia/sesión/solicitud. Hay otros. – Bozho

+0

Pero el servicio JBoss no es tocado por los inspectores de inyección ... se inicializa durante el inicio del servidor. ¿Es posible resolver esto? - ahh ... acaba de reconocer su edición ... lo intentaré. –

Cuestiones relacionadas