Paso 2: diseño del flujo de trabajo

Última modificación: jueves, 06 de mayo de 2010

Hace referencia a: SharePoint Server 2010

En este tema se muestra cómo diseñar un flujo de trabajo que inicia un trabajo de conversión de Servicios de automatización de Word.

Diseño del flujo de trabajo

La solución que se crea en este tutorial inicia un trabajo de conversión de Servicios de automatización de Word a partir del estado de un documento en una biblioteca de documentos y archiva el documento convertido. Cuando el estado del documento cambia a Final, se inicia un flujo de trabajo de SharePoint que crea un trabajo de conversión de Servicios de automatización de Word y, a continuación, coloca el documento resultante de la conversión como documento de entrada en la misma biblioteca de documentos.

El flujo de trabajo se compone de dos pasos, con un tercer paso opcional: en el primer paso se comprueba que la propiedad Status del documento de entrada está establecida en Final; si así es, en el segundo paso se convierte el documento. Con el tercer paso se supervisa el trabajo de conversión hasta su finalización.

Comprobación de la propiedad Status del documento

Con el primer paso del flujo de trabajo se comprueba la propiedad Status del documento de la biblioteca de entrada.

Para comprobar el estado del documento

  1. En el proyecto de Visual Studio 2010 que creó en el paso 1 de este tutorial, agregue una actividad While después de la actividad onWorkflowActivated existente. La actividad While está debajo de Windows Workflow v3.0 en el Cuadro de herramientas.

  2. En el Cuadro de herramientas, en Flujo de trabajo de SharePoint, agregue una actividad OnWorkflowItemChanged dentro de la actividad While.

  3. Haga clic en la actividad . En la ventana Propiedades, establezca el valor de la propiedad CorrelationToken en workflowToken (el único elemento de la lista desplegable). De esta forma, se asocia el evento ItemChanged al flujo de trabajo correcto.

  4. En la ventana Propiedades, haga clic en el rayo para cambiar a la vista Eventos y presione ENTRAR en el método Invoked para crear un controlador de eventos en blanco.

  5. En la ventana de código, agregue una variable global a la clase para saber si la propiedad Status se ha establecido en el valor deseado.

    bool documentReady = false;
    
  6. En el controlador de eventos para el evento onWorkflowItemChanged, agregue código para comprobar el valor de la columna Estado y establezca la variable documentReady correctamente.

    //Check if the Status is set to "Final"; if so, the document is ready to archive
    if (workflowProperties.Item["Status"] != null)
    {
        documentReady = ((string)workflowProperties.Item["Status"] == "Final");
    }
    
  7. En la ventana del diseñador de flujos de trabajo, haga clic en la actividad While. En la ventana Propiedades, haga clic en la lista desplegable junto a Condición y, a continuación, seleccione Condición de regla declarativa.

  8. Expanda Condición, lo que expondrá ConditionName y Expression.

  9. En el campo ConditionName, escriba un nombre para la condición (por ejemplo, Listo para archivar).

  10. En el campo Expression, haga clic en el botón de puntos suspensivos que aparece junto a Expresión de condición.

  11. En el cuadro de diálogo Editor de condiciones de reglas, agregue el código que establece la condición.

    documentReady == false
    
  12. Haga clic en Aceptar para guardar la condición.

  13. El flujo de trabajo resultante ahora tiene el mismo aspecto que el siguiente diagrama.

    Diseño de flujo de trabajo en la ventana del Diseñador de flujo de trabajo

Conversión del documento.

Cuando la propiedad Status del documento se establece en Final, con el segundo paso del flujo de trabajo se convierte el documento mediante Servicios de automatización de Word.

Para convertir el documento

  1. En la página de código del flujo de trabajo, agregue una directiva using para el espacio de nombres que contiene el modelo de objetos de Servicios de automatización de Word usado para realizar las conversiones de documentos.

    using Microsoft.Office.Word.Server.Conversions;
    
  2. En la página del diseñador de flujos de trabajo, agregue una actividad Code del Cuadro de herramientas de Visual Studio 2010 después de la actividad While existente.

  3. Con la actividad Code seleccionada en la página del diseñador de flujos de trabajo, haga clic en el rayo de Propiedades para cambiar a la vista Eventos y, a continuación, presione ENTRAR en el campo ExecuteCode para crear un controlador de eventos vacío.

  4. En el controlador de eventos vacío resultante para el evento ExecuteCode, agregue código para realizar la conversión del documento.

    // Create a Word Automation Services conversion job
    ConversionJob job = new ConversionJob("Word Automation Services");
    
    // Specify conversion settings
    job.UserToken = workflowProperties.OriginatorUser.UserToken;
    if (workflowProperties.Site.SiteSubscription != null)
        job.SubscriptionId = workflowProperties.Site.SiteSubscription.Id;
    job.Settings.OutputFormat = SaveFormat.XPS;
    job.Name = "Archive Document Workflow";
    
    // Add the file
    string fileUrl = workflowProperties.WebUrl + "/" + workflowProperties.ItemUrl;
    job.AddFile(fileUrl, Path.ChangeExtension(fileUrl, "xps"));
    
    // Schedule the conversion
    job.Start(); 
    

    Este código crea un nuevo ConversionJob (que define un conjunto de conversiones) llamando al constructor de ConversionJob, que toma el nombre de la aplicación de servicio como un argumento.

    Nota

    En este ejemplo se supone que el nombre de la aplicación de servicio es Word Automation Services, que es el nombre predeterminado cuando se crea mediante el Asistente para la configuración del conjunto de servidores de SharePoint Server 2010. Si usó un nombre diferente para la aplicación de servicio, úselo como argumento del constructor ConversionJob en el ejemplo de código anterior.

    A continuación, el código establece la configuración necesaria para la conversión del documento:

    • UserToken: especifica las credenciales de usuario que se usan para leer el archivo de entrada y escribir el archivo de salida.

    • SubscriptionId: especifica el identificador de suscripción de sitio del sitio.

      Nota

      Este parámetro únicamente es necesario si el conjunto o granja de servidores de SharePoint se ha configurado en modo particionado.

    • OutputFormat: especifica el formato de archivo de salida para la conversión.

    Además, el código especifica un valor opcional para la conversión:

    • Name: especifica un nombre descriptivo para la conversión.
  5. El flujo de trabajo resultante ahora tiene el mismo aspecto que el siguiente diagrama.

    Diseño de flujo de trabajo en la ventana del Diseñador de flujo de trabajo

Supervisión de la conversión

Una vez que se ha programado una conversión de documento, se procesa de forma asincrónica. Si lo desea, puede agregar un paso para que la solución supervise el resultado de la conversión antes de terminar el flujo de trabajo, para que éste se complete tras la conversión.

Para supervisar la conversión del documento

  1. En la página del diseñador de flujos de trabajo, agregue una actividad While del Cuadro de herramientas de Visual Studio 2010 después de la actividad Code existente.

  2. En el Cuadro de herramientas, en Windows Workflow v3.0, agregue una actividad Sequence dentro de la actividad While.

  3. En el Cuadro de herramientas, en Windows Workflow v3.0, agregue una actividad Delay dentro de la actividad Sequence.

  4. Con la actividad Delay seleccionada en la página del diseñador de flujos de trabajo, en la ventana Propiedades, haga clic en el campo TimeoutDuration y establézcalo en 00:00:30 (30 segundos). Esto significa que el flujo de trabajo se volverá a comprobar como máximo cada 30 segundos.

    Nota

    En el Cuadro de herramientas, en Windows Workflow v3.0, agregue una actividad Code inmediatamente después de la actividad Delay existente.

  5. Con la nueva actividad Code seleccionada en la página del diseñador de flujos de trabajo, haga clic en el rayo de Propiedades para cambiar a la vista Eventos y, a continuación, presione ENTRAR en el campo EjecutarCódigo para crear un controlador de eventos vacío.

  6. En la página de códigos del flujo de trabajo, agregue una directiva using para el espacio de nombres que contiene la clase ReadOnlyCollection<T> que se usa más adelante en este procedimiento.

    using System.Collections.ObjectModel;
    
  7. Agregue dos variables globales a la clase: un valor Guid para almacenar JobId del trabajo de conversión y un valor booleano para saber si la conversión finalizó correctamente.

    Guid jobId;
    bool conversionComplete = false;
    
  8. En el primer método del código, codeActivity1_ExecuteCode, almacene JobId del trabajo de conversión en la variable jobId; para ello, agregue el siguiente código después del método Start.

    // Schedule the conversion
    job.Start();
    
    // Save the conversion job ID
    jobId = job.JobId;
    
  9. En el nuevo controlador de eventos creado en este procedimiento, codeActivity2_ExecuteCode, agregue código para comprobar el estado de la conversión.

    // Monitor the conversion
    // Get the site subscription ID
    Guid? siteSubscription = null;
    if (workflowProperties.Site.SiteSubscription != null)
        siteSubscription = workflowProperties.Site.SiteSubscription.Id;
    
    // Check if the conversion is complete; if it is, refresh
    ConversionJobStatus status = new ConversionJobStatus("Word Automation Services", jobId, siteSubscription);
    
    if (status.Count == status.Succeeded)
    {
        // Success!
        conversionComplete = true;
    }
    else if (status.Count == status.Failed)
    {
        // Conversion failed
        ReadOnlyCollection<ConversionItemInfo> failedItems = status.GetItems(ItemTypes.Failed);
        throw new Exception(failedItems[0].ErrorMessage);
    }
    else if (status.Count == status.Canceled)
    {
        // Conversion was canceled
        throw new Exception("Conversion was canceled.");
    }
    
    // Since the conversion is not yet completed, keep waiting
    

    El código comprueba el estado de la conversión mediante el objeto ConversionJobStatus.

    Nota

    En este ejemplo se supone que el nombre de la aplicación de servicio es Word Automation Services, que es el nombre predeterminado cuando se crea mediante el Asistente para la configuración del conjunto de servidores de SharePoint Server 2010. Si usó un nombre diferente para la aplicación de servicio, úselo como argumento del constructor ConversionJobStatus en el fragmento de código anterior.

    El código comprueba el estado del trabajo de conversión para averiguar si el elemento se ha convertido correctamente o no y reacciona en consecuencia. De lo contrario, el código no realiza ninguna acción porque la conversión está en curso.

  10. Con la actividad While seleccionada en el diseñador de flujos de trabajo, en la ventana Propiedades, haga clic en el campo Condición y, a continuación, seleccione Condición de regla declarativa.

  11. Expanda Condición, lo que expondrá ConditionName y Expression.

  12. En el campo ConditionName, escriba un nombre (por ejemplo, Conversion Complete).

  13. En el campo Expression, haga clic en el botón de puntos suspensivos que aparece junto a Expresión de condición.

  14. En el cuadro de diálogo Editor de condiciones de reglas, agregue el código que establece la condición.

    conversionComplete == false
    
  15. Haga clic en Aceptar para guardar la condición.

  16. En el diseñador de flujos de trabajo, el flujo de trabajo final debe tener la misma apariencia que la reflejada en el siguiente diagrama.

    Diseño de flujo de trabajo en la ventana del Diseñador de flujo de trabajo

Vea también

Otros recursos

Programación de Word Automation Services