Skip navigation

Increíble que haya que dar tantas vueltas para algo tan simple. El problema radica en que no hay manera de terminar una conversación “manualmente” sumando a que cada request dispara crea una nueva conversación.

Perdón, pensando en ‘voz alta’… ahora los voy a introducir al problema. Imaginen esto, tienen una página que muestra el estado de tu transacción… viva imagen del estado de un SFSB en la conversación en curso. Ahora, cuando termina la transacción ( sea por cancelación o confirmación ) el SFSB desaparece llevándose consigo su información, por ende esta será inaccesible para la siguiente vista. Salvo… que uses Seam.

Caso 1: dentro de una conversación larga ( o long running conversation ( aka conversaciones manuales ) )

Cuando terminamos una transacción cerramos la operación con un método anotado con @End. La conversación por defecto no termina ( o mejor dicho ‘el contexto conversacional no se destruye’ ) cuando finaliza el método de la aplicación si no que se mantiene hasta que el último componente de la página haya sido renderisado. Por ende hay un instante, entre que finalizó la operación y la próxima página se está renderisando en que la conversación tiene un SFSB accesible pero invalido.


 

con redirección y sin endBeforeRedirect

* la misma conversación/transacción se mantiene aunque nuestra transacción lógica/de negocio terminó

 

Por suerte tenemos una manera cambiar este comportamiento y es diciendolé a Seam que termine la conversación antes de que redirija el browser a otra página para mostrar los resultados.

 

 

con redirección y endBeforeRedirect

* una nueva conversación/transacción se crea luego de la redirección

 

Toda esta facilidad se pierde cuando tenemos no hacemos una redirección de la aplicación. Como resultado vamos a ver que aunque le demos ‘terminar’ a la transacción y teoricamente haga flush de todos los datos vamos a ver la respuesta en un estado inconcluso.

Por ejemplo, imaginemos una aplicación en la que generamos una lista de pedidos con un wizard, la lista estará asociada a la conversación en curso, cuando llegamos a la última página de este wizard nos muestra una lista con los pedidos a realizar y luego de persistir los datos, como todos los cambios fueron confirmados, la próxima página muestra una lista vacia simbolo de que no hay pedidos sin hacer. Si no toman en cuenta estas particularidades se pueden encontrar con que una vez terminada la transacción la página de respuesta muestra los valores de una conversación/transacción que le dijimos que termine, y cuando volvemos a hacer un request para que nos vuelva a mostrar la misma información esta desaparece. Esto es porque lo que se termina generando como resultado no refleja el estado del contexto en el servidor una vez que se cierra la conversación y esto es después de que toda la página haya terminado de mostrarse.

Si les gustaron mis dibujos les dejo otro para que vean que pasa si no usamos redirección. 

 

sin redirección

* si no hay redirección el proceso de renderisado se hace con una conversación invalida

Caso 2: fuera de una conversación larga ( conversaciones por defecto )

En este caso Seam no nos da tregua y me pareció muy frustrante. Solo las conversaciones largas ( las que son iniciadas manualmente con @Begin o similares ) pueden ser finalizadas manualmente. Por eso entré al blog pensado que el problema es que no hay una manera de forzar la destrucción de un contexto, o de invalidarlo, hay que marcarlo y esperar que el motor de Seam decida cuando limpiar.

Igual, no desesperen encontré un workaround ( un parche ) para llevar este caso al anterior :


Manager.instance().setLongRunningConversation( true );

Conversation.instance().endBeforeRedirect();

No es muy bonito que digamos, pero nos permite salir del paso. Hice un post en el foro oficial a ver que me responden los gurues del tema. Cualquier noticia los tengo al tanto. Saludos.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: