Code Segment

MOSS 2007 - Refrito

Feb 19 2007 by csegura @ 17:50

Creo que a esto se le llama refrito, pero como algunos me estáis pidiendo información relativa a estos temas aquí dejo los links agrupados.

2006-11-28 Servicios Compartidos en MOSS2007

2006-10-07 MOSS 2007_Catalogo de datos empresariales BDC (6)
2006-10-04 MOSS 2007_Catalogo de datos empresariales BDC (5)
2006-10-02 MOSS 2007_Catalogo de datos empresariales BDC (4)
2006-10-01 MOSS 2007_Catalogo de datos empresariales BDC (3)
2006-09-29 MOSS 2007_Catalogo de datos empresariales BDC (2)
2006-09-23 MOSS 2007_Catalogo de datos empresariales BDC (1)

2006-09-23 WSS 3 - Tipos de Contenido (Content Types) (5)
2006-09-15 WSS 3 - Tipos de Contenido (Content Types) (4)
2006-09-13 WSS 3 - Tipos de Contenido (Content Types) (3)
2006-09-13 WSS 3 - Tipos de Contenido (Content Types) (2)
2006-09-05 WSS 3 - Tipos de Contenido (Content Types) (1)

2006-09-01 Los Eventos en WSS 3

2006-08-25 Las WebParts en WSS 3 y MOSS 2007_(4)
2006-08-24 Las WebParts en WSS 3 y MOSS 2007_(3)
2006-08-23 Las WebParts en WSS 3 y MOSS 2007_(2)
2006-08-23 Las WebParts en WSS 3 y MOSS 2007_(1)

2006-12-09 Acciones de flujos de trabajo personalizadas en SharePoint Designer (2)
2006-12-08 Acciones de flujos de trabajo personalizadas en SharePoint Designer (1)

2006-06-04 SharePoint - Sharepoint designer workflows

Comments (0)

Refactoring - Session

Feb 16 2007 by csegura @ 13:01
  Yesterday was the third act of NavarraDotNet, we had a session in the Public University of Navarra, where, we spoke about refactoring techniques and showing some tools as Resharper and Refactor!.

My colleague in the session Sergio Jimenez, it demonstrated how using some of this inexpensive tools, we can improve the code quality, the development of some tasks, and how is it favorable for both, programmers and companies.

Ayer tuvimos el tercer acto de NavarraDotNet, en la Universidad Publica de Navarra, en donde hablamos sobre técnicas de refactoring y pudimos ver algunas herramientas como Resharper y Refactor!.

Mi colega en la sesión, Sergio Jimenez, nos demostró como usando estas herramientas, no excesivamente caras, podemos mejorar la calidad del código y del desarrollo de algunas tareas cotidianas, también hizo una reflexión sobre lo beneficioso del uso de estas herramientas, tanto para programadores cómo para sus empresas.

Si, yo llevaba la camiseta de Pearl Jam (Tour 2000) :-)

   

Comments (0)

Curso de Workflow Foundation (5)

Feb 14 2007 by csegura @ 16:21

5o Asalto - El servicio de planificación de tareas & Hosting in ASP.Net

El servicio de planificación de tareas (WorkflowSchedulerService)  es el encargado de ejecutar los distintos flujos de trabajo dentro del motor, estos pueden ser manejados de forma asíncrona, usando el servicio que WF nos proveed por defecto (DefaultWorkflowSchedulerService) o de manera síncrona, usando un servicio manual (ManualWorkflowSchedulerService).

Al igual que el resto de servicios, también podemos crear nuestro propio servicio de planificación heredando de WorkflowSchedulerService.

Es importante recalcar que el motor de WF no crea hilos de trabajo de su propiedad. Los hilos sobre los cuales se ejecutan las instancias de los flujos de trabajo, son hilos de la aplicación que hospeda el motor.  De modo que cada instancia (aunque esta sea del mismo flujo de trabajo) puede estar ejecutándose sobre diferentes hilos. Y como no, el encargado de gestionar esos hilos es WorkflowSchedulerService.

El servicio por defecto DefaultWorkflowSechedulerService,  no hemos de indicarlo ya que si el motor se inicia sin que nosotros añadamos un servicio de programación manual ó personalizado, usará este servicio.  Este servicio gestiona los hilos de ejecución de manera asíncrona de modo que podemos tener múltiples instancias de los flujos de trabajo en la cola de ejecución. 

Por el contrario, el servicio manual que nos provee WF, ManualWorkflowSchedulerService, usa una gestión síncrona,  de modo que las instancias de los flujos de trabajo serán ejecutadas sobre el mismo hilo de la aplicación huésped, bloqueando su ejecución hasta que la instancia quede inactiva.

No pensaba realizar ningún ejemplo en asp.net, pero me pico el otro día un par de mails, que recibí, de modo que me dieron las tantas otra vez. Nada mejor que un ejemplo para ver estas cosas.

En el ejemplo que he preparado (advertencia, es necesario que tengáis instalado AJAX 1.0) se puede apreciar como en un principio usando el DefaultWorkflowSchedulerService, se asignan más hilos que con el servicio manual, y como al usar el servicio manual ManualWorkflowSchedulerService, la ejecución de la aplicación queda detenida hasta que el flujo de trabajo queda inactivo.

Para activar el servicio manual, solo hay que quitar los comentarios tanto en el global.asax, como en el default.aspx.cs.

  AspHostWorkflow.zip (24,83 KB)

Comments (0)

Curso de Workflow Foundation (4)

Feb 13 2007 by csegura @ 10:26

Muchos de los procesos con los que trabajamos habitualmente, requieren de datos o eventos que llegan desde el exterior. Anteriormente, vimos como WF puede comunicarse con el mundo exterior, para recibir esos datos o eventos usando el servicio de intercambio de datos.

En ocasiones, al igual que sucede en el mundo real, debemos esperar a que se produzcan esos datos o eventos para poder continuar realizando un trabajo. Este hecho hace que nuestros flujos de trabajo queden inactivos (Idle) mientras esperan esos datos.

Que se produzcan estos hechos para continuar el trabajo, puede llevar horas, días o incluso meses, de modo que nuestros flujos de trabajo se mantendrían dentro del motor de flujos de trabajo, consumiendo recursos de la aplicación que alberga el motor de WF, y a su vez quedarían expuestos a posibles pérdidas si durante el tiempo de espera el sistema se viene abajo.

Con el fin de subsanar esto WF, nos provee de un servicio de Persistencia, a través del cual nuestros flujos de trabajo, podrán ser guardados en un sistema de almacenamiento hasta el momento en que se produzcan los datos o eventos necesarios para continuar.

4º ASALTO – El servicio de persistencia

Desde el momento que se crea una instancia del flujo de trabajo del motor de WF, este queda en memoria. Hemos vistos a través de los ejemplos anteriores como los flujos de trabajo entran en inactividad cuando esperan datos externos o un evento que proviene del servicio de timer. También, hemos visto como se establece un horario en que deberían llegar esos datos y como este puede ser indeterminado cuando se establece como 31/12/2999.

Si deseamos persistir, nuestros flujos de trabajo, lo que hemos de hacer es proveer a nuestro motor de flujos de trabajo de un servicio de persistencia, esto es una operación muy similar a la que realizamos anteriormente con el servicio de intercambio de datos.

Cuando nuestro motor de flujos de trabajo cuenta con un servicio de persistencia, podremos descargar los flujos de trabajo en el sistema de almacenamiento mediante dicho servicio.

La clase base de los servicios de persistencia es la clase abstracta WorkflowPersistenceService, como vimos en el 3er Asalto, que a su vez hereda de WorkflowRuntimeService y WF nos ofrece una implementación de este servicio en la clase SqlWorkflowPersistenceService, que se encargará de almacenar los flujos de trabajo en un repositorio de SQL server.

Para poder usar SqlWorkflowPersistenceService, debemos crear una bbdd SQL Server con la estructura que se encuentra en C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\ES\SqlPersistenceService_Schema.sql y la lógica (procedimientos almacenados) que se encuentra en el mismo directorio en el archivo SqlPersistenceService_Logic.sql

Podéis encontrar más detalles en el blog de Juan Carlos González

Una vez creada la base de datos, lo que debemos hacer es dotar a nuestro motor de flujos de trabajo del servicio de persistencia.

persistenceService = 
    new MySqlWorkflowPersistenceService(
                    Settings.Default.WorkflowDemoConnectionString,
                    UnloadOnIdle,
                    new TimeSpan(0, 1, 0),
                    new TimeSpan(0, 0, 10));
workflowRuntime.AddService(persistenceService);  

En el constructor de SqlPersistenceService, debemos pasar la cadena de conexión a la base de datos donde se almacenarán los flujos de trabajo así como un flag indicando si los flujos de trabajo se descargarán automáticamente cuando se encuentren en inactividad.

En caso afirmativo, WF descargará los flujos de trabajo automáticamente:
-          Cuando se encuentren inactivos
-          Tras terminar una actividad marcada como PersistOnClosed
-          Antes de que el flujo de trabajo termine
-          Antes de que el flujo de trabajo se complete

En caso contrario, la responsabilidad pasará a ser de nuestro programa y deberemos cargar y descargar los flujos de trabajo manualmente, llamando a WorkflowInstance.Load(), WorkflowInstance.Unload() y WorkflowInstance.TryUnload().

De los otros dos parámetros del constructor, el primero nos permite indicar el tiempo que un flujo de trabajo almacenado por este motor mantendrá bloqueado dicho flujo de trabajo. Esto es para ser usado en caso de que distintos motores de flujos de trabajo compartan el mismo sistema de almacenamiento. El segundo, es el tiempo que se tardará en revisar los flujos de trabajo que han sido cargados desde la base de datos.

La mejor forma de ver cómo funciona el servicio de persistencia, es a través de la aplicación que estamos usando de ejemplo, la he actualizado incluyendo el servicio de persistencia, que podremos activar y desactivar a nuestro antojo. También hay una nueva pestaña en donde podemos monitorizar que es lo que ocurre en la base de datos donde se están almacenando los flujos de trabajo.


Podéis hacer pruebas a tirar la aplicación mientras hay flujos de trabajo persistidos y a volverla a ejecutar y activar el servicio de persistencia, veréis como los flujos de trabajo que quedaban pendientes se completan.  (Para ello debéis arrancar el motor manualmente tras activar el servicio de persistencia). La mejor forma de ver cómo funciona el servicio de persistencia, es a través del ejemplo adjunto.

Para ver cómo trabaja SqlPersistenceService, lo que he hecho es crear una subclase espejo que irá dejando rastro de cómo son llamados lo métodos de SqlPersistenceService, podéis ver esta información en VS a través de la vista output.

PersistenceService - Start
The thread 0xac4 has exited with code 0 (0x0).
PersistenceService - OnStarted
Created
Started
+PersistenceService - SaveWorkflowInstanceState WorkflowDelay Executing
-PersistenceService - SaveWorkflowInstanceState WorkflowDelay Executing
Idled
+PersistenceService - LoadWorkflowInstanteState 0fc8af43-ceb5-4f31-be58-c844e019531d
-PersistenceService - LoadWorkflowInstanteState 0fc8af43-ceb5-4f31-be58-c844e019531d
Loaded
Persisted
Unloaded
+PersistenceService - SaveWorkflowInstanceState WorkflowDelay Closed
-PersistenceService - SaveWorkflowInstanceState WorkflowDelay Closed
Persisted
+PersistenceService - LoadWorkflowInstanteState 0fc8af43-ceb5-4f31-be58-c844e019531d
+PersistenceService - LoadWorkflowInstanteState 0fc8af43-ceb5-4f31-be58-c844e019531d
Completed

Como ya comente con anterioridad, podemos crear nuestro propio servicio de persistencia, heredando de WorkflowPersistenceService. (En los ejemplos del WF hay un servicio personalizado que guarda los flujos de trabajo en archivos binarios FilePersistenceService.cs)

Básicamente hay que sobrescribir cuatro métodos de la clase WorkflowPersistenceService estos son:
SaveWorkflowInstanceState – Encargado de slavar la instancia del flujo de trabajo en el sistema de almacenamiento.
SaveCompletedContextActivity - Salva el estado ámbito (actividades) completado.
LoadWorkflowInstanceState – Carga desde el sistema de almacenamiento a memorial instancia del flujo de trabajo.
LoadCompletedContextActivity - Carga el ámbito  (actividades) completado

Por el momento, "jugar" con este servicio del que volveremos hablar más adelante.

 WinHostWorkflow_4.zip (474,63 KB)

Comments (4)

SharePoint - csegSearch update 1.5

Feb 12 2007 by csegura @ 17:48

This is a small update of my webpart csegSearch (for SPS 2003) that solves some issues with the custom results. Now are correctly displayed and you can short this.

For more info see:

 csegSearchWebPart15.zip (12,7 KB)

Prior to update this release, you need uninstall previous versions of csegSearch.

Comments (1)