Sobrescritura de las propiedades de un área de trabajo
Acerca de esta tarea
Las áreas de trabajo están inherentemente asociadas a los procesos que las crean. En la aplicación de ejemplo, el cliente comienza un área de trabajo y establece en ella las propiedades site-identifier y priority (identificador de sitio y prioridad). Este área de trabajo se propaga al servidor cuando el cliente realiza una invocación remota.
Las aplicaciones anidan áreas de trabajo para alterar temporalmente las propiedades importadas desde un proceso cliente. El mecanismo de anidación es automático; la invocación que comienza en la interfaz UserWorkArea desde el ámbito de un área de trabajo existente crea un área de trabajo anidada que hereda las propiedades del área de trabajo asociada. Las propiedades establecidas en el área de trabajo anidada están estrictamente asociadas con el proceso en el que se inició el área de trabajo; el área de trabajo anidada debe completarse en el proceso que la ha creado. Si un área de trabajo no la completa el proceso que la ha creado, el servicio work-area (área de trabajo) termina el área de trabajo cuando finaliza el proceso. Una vez que se completa un área de trabajo anidada, se restaura la vista original del área de trabajo asociada. No obstante, la vista del conjunto completo de áreas de trabajo asociadas con una hebra no puede descomponerse por procesos en sentido descendente.
Las aplicaciones establecen propiedades en un área de trabajo utilizando modalidades de propiedad para asegurar que una propiedad concreta es fixed (fija, no se puede quitar) o read-only (que no se puede alterar) dentro del ámbito del área de trabajo dada.
Ejemplo
En el siguiente ejemplo de código, el bean de ejemplo del lado del servidor intenta escribir directamente en el área de trabajo importada; puesto que la partición UserWorkArea no está definida como bidireccional, esta acción no está permitida y se emite la excepción NotOriginator. Cuando la partición UserWorkArea no está definida como bidireccional, el bean de ejemplo debe iniciar su propia área de trabajo a fin de sobrescribir las propiedades importadas, como se muestra en el segundo ejemplo de código. Si se utiliza un área de trabajo en una partición definida por el usuario y ésta se define como bidireccional, este bean puede establecer el contexto en el área de trabajo antes de iniciar otra área de trabajo. Este contexto establecido en el caso bidireccional se propaga al emisor. Consulte el artículo de servicio de partición de área de trabajo para obtener información adicional.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } ... } }
El código de ejemplo siguiente muestra el comienza de un área de trabajo anidada, utilizando el nombre de la clase que la crea para identificar dicha área.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } // Comenzar un área de trabajo anidada. Si como nombre del área de trabajo // se utiliza el nombre de la clase que la crea, se puede evitar el tener que // establecer explícitamente el nombre de la clase que la crea en // área de trabajo. userWorkArea.begin("SimpleSampleBean"); ... } }
En la aplicación de ejemplo, el cliente establece la propiedad site-identifier (identificador de sitio) como read-only; así se garantiza que la solicitud siempre esté asociada a la identidad de la empresa del cliente. Un servidor no puede alterar temporalmente dicho valor en un área de trabajo anidada. En el código de ejemplo siguiente, SimpleSampleBean intenta cambiar el valor de la propiedad site-identifier del área de trabajo anidada que ha creado.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } // Comenzar un área de trabajo anidada. userWorkArea.begin("SimpleSampleBean"); try { userWorkArea.set("company", SimpleSampleCompany.London_Development); } catch (NotOriginator e) { } ... } }