Eventos de disparo en componentes de costura

Tengo un servicio web (jboss seam) que consume solicitudes, además delega su trabajo a diferentes componentes de costura. Uno de los componentes de costura tiene capacidad de generación de eventos como Events.instance().raiseTransactionSuccessEvent, el método que escucha este evento no se invoca.

¿Me estoy perdiendo alguna configuración?

Por favor recomiende

preguntado el 29 de junio de 12 a las 19:06

3 Respuestas

  1. Asegúrese de que se inicie una transacción al invocar un componente de Seam desde su servicio web. Si no, inícielo manualmente.
  2. Asegúrese de que la transacción realmente se confirme.

Respondido el 30 de junio de 12 a las 18:06

Gracias por su respuesta. He configurado la transacción administrada por contenedor en el archivo components.xml, agregando . De acuerdo con la documentación, una transacción se inicia de forma transparente cuando se invoca EJB (en mi caso, será invocado por una llamada de servicio web). No estoy seguro de cuál es el alcance de la transacción que comienza cuando se invoca un EJB. EJB en mi caso consume llamadas de servicio web y luego delega el trabajo a otros componentes de costura que no son EJB. Apreciaré su ayuda. - user1000258

@Tair

Tengo un componente ejb que consume solicitudes de servicios web como se muestra a continuación

@Name("plugin")
@Stateless
@WebService(name = "PluginService", serviceName = "PluginService")
public class PluginService implements IPlugin {
    @WebMethod
    public boolean createUser(String username, String password) {
        System.out.println("in login ");
        WebAuthenticator authenticator = (WebAuthenticator) Component
                .getInstance("webauthenticator");

        usreCreated = authenticator.create(username, password);
        System.out.println("valid user "+validUser);
                return userCreated;
}
}

WebAuthenticator es un componente de costura de la siguiente manera

@Name("webauthenticator")
@Scope(ScopeType.CONVERSATION)

public class WebAuthenticator {

    @In
    EntityManager entityManager;

        @Observer("test")
        public void test()
        {
        System.out.println("A transaction success event was fired");
        }

    private static Log log = (Log) Logging.getLog(WebAuthenticator.class);
    private static byte[] accountPassword = null;
    private static Account currentAccount = null;

    public boolean createUser(String username, String password) {

        System.out.println("In web authenticator");
                User user = new User();
                user.username = username;
                user.password = password;
                entityManager.persist(user);
                entityManager.flush();
                Events.instance().raisTransactionSuccessEvent("test");
}
}

en el archivo components.xml, tengo <transaction:ejb-transaction /> , para que la costura pueda obtener actualizaciones sobre los eventos de transacción del contenedor y tengo un contexto de persistencia administrado por la costura

    <persistence:managed-persistence-context
   auto-create="true" name="entityManager" persistence-unit-jndi-   name="java:/pilotEntityManagerFactory" />

Respondido 12 Jul 12, 22:07

Me lo imaginé. La conclusión es nunca mezclar transacciones ejb con transacciones seam. Inhabilito explícitamente la gestión de transacciones ejb en el archivo ejb. ¡¡Funcionó!!.

Respondido 19 Jul 12, 22:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.