Administrador de grupo: ejemplo de servidor de Automatización

Un servidor de Automatización expone las propiedades y métodos que se pueden establecer y llamar desde otras aplicaciones que admiten Automatización.

Lo único que necesita hacer para crear un servidor de Automatización es:

  1. Crear un proyecto.
  2. Agregar un archivo .vcx con una clase OLE Public o un archivo .prg que defina una clase con la palabra clave OLEPUBLIC.
  3. Crear un archivo .dll o .exe.

Se puede distribuir un servidor de Automatización de forma local o remota para exponer la funcionalidad comercial a través de métodos que se pueden llamar y propiedades que se pueden establecer.

Éste es un ejemplo de un Administrador de grupo implementado en un servidor de Automatización personalizado. Un cliente puede enviar trabajos a este Administrador de grupo, que puede estar situado en un equipo remoto, y hacer que éste controle el procesamiento del trabajo. Esto le permite continuar trabajando porque los recursos del administrador de grupo controlan todo el trabajo. Los trabajos de este ejemplo son simulaciones sencillas.

Para abrir el proyecto para el ejemplo del Administrador de grupo

  • Escriba la siguiente línea de código en la ventana Comandos:

    MODIFY PROJECT (HOME(2) + 'servers\poolmgr\pool')
    

Para ejecutar el ejemplo del Administrador de grupo

  1. Abra Pool.pjx y elija Generar.
  2. En el cuadro de diálogo Opciones de generación, elija Generar ejecutable y, después, Aceptar para crear Pool.exe. Se registrará el servidor cuando usted genere el archivo ejecutable.
  3. Ejecute Pool.scx.

Evento Init de conjuntos

El primer código que se ejecuta cuando se ejecuta el formulario Conjuntos es el evento Init, que crea un objeto poolmgr:

* Pool Init
SET PROC TO jobmgr.prg
THIS.oPoolMgr = CreateObject('Pool.Poolmgr')

Cuando se ha creado el objeto oPoolMgr, se dimensiona una matriz para realizar un seguimiento de trabajos y se crea un objeto Timer, basado en la clase PoolTimer, para comprobar si hay trabajos nuevos o terminados.

Método AddJob de conjuntos

Cuando el usuario elige los botones Imprimir, Fax o Gráfico de Excel en el formulario de conjuntos, se llamará al método AddJob del formulario. AddJob lleva a cabo las siguientes acciones:

  1. Cambia el tamaño de una matriz para realizar un seguimiento de los trabajos pendientes.

  2. Crea un objeto basado en una subclase específica de NewJob: FaxJob, PrintJob o GraphJob. Estas clases se definen en JOBMGR.prg y toman una referencia al formulario como un argumento.

  3. Pasa el objeto de trabajo al método NewJob del objeto PoolMgr:

    PARAMETER cJobType
    LOCAL oNewJobRef
    IF ALEN(THIS.aJobs)>1 OR TYPE('THIS.aJobs[1]') = 'O'
       DIMENSION THIS.aJobs[ALEN(THIS.aJobs)+1]
    ENDIF
    oNewJobRef = CreateObject(m.cJobType,THIS)
    THIS.oPoolMgr.NewJob(m.oNewJobRef)
    

Método NewJob de PoolMgr

El método NewJob del objeto PoolMgr cambia el tamaño de la matriz de trabajo bidimensional PoolMgr y almacena una referencia al objeto de trabajo en el primer elemento de la nueva fila y 0 en el segundo elemento, lo que indica que se trata de un nuevo trabajo.

PARAMETER oNewJob
IF TYPE('oNewJob') # 'O' OR ISNULL(m.oNewJob)
   RETURN .F.
ENDIF
IF ALEN(THIS.aJobObjs,1) > 1 ;
  OR ISNULL(THIS.aJobObjs[1])
   DIMENSION THIS.aJobObjs[ALEN(THIS.aJobObjs,1)+1,2]
ENDIF
THIS.aJobObjs[ALEN(THIS.aJobObjs,1),1] = oNewJob
THIS.aJobObjs[ALEN(THIS.aJobObjs,1),2] = 0

Evento Timer de PoolTimer

Cada tres segundos, se ejecuta el código del evento cronómetro PoolTimer. Este código realiza un bucle a través de la matriz de trabajo. Si el segundo elemento es 0, que indica un nuevo trabajo, después se crea un nuevo objeto PrintJob, FaxJob o GraphJob (subclases de Job en Poolmgr.prg) para administrar el trabajo. Por ejemplo, la siguiente línea crea un objeto basado en PrintJob y almacena una referencia a éste en la matriz aJobs del cronómetro:

THIS.aJobs[ALEN(THIS.aJobs)] = CREATEOBJECT('Pool.PrintJob')

A continuación, se establece el segundo elemento de la matriz para esa fila como 1 para indicar que ha comenzado el trabajo y que se ha llamado al método SetupJob del nuevo objeto. Se pasa una referencia del objeto de Job al método SetupJob:

THIS.aJobs[ALEN(THIS.aJobs)].SetupJob(THIS.Parent.aJobObjs[m.i,1])

La clase Job

La clase Job se define en Poolmgr.prg:

DEFINE CLASS Job AS FORM

Cuando se crea un objeto basado en la clase Job o en cualquiera de sus subclases, se llama al método StartJob del objeto.

PROCEDURE SetupJob
   PARAMETER oJob
   THIS.oJob = m.oJob
   THIS.Caption = THIS.oJob.Jobtype
   THIS.Visible = .T.
ENDPROC

La clase PrintJob, por ejemplo, es una subclase de Job. Si el proyecto creado está basado en PrintJob, el método StartJob realizará el procesamiento predeterminado del método StartJob de la clase primaria, lo que establece el título del formulario y muestra una etiqueta. Después se llamará a la función INKEY( ) para establecer un tiempo de espera de 10 segundos. En una implementación funcional de este ejemplo, en lugar de la función INKEY( ), usted incluiría código en este momento para procesar el trabajo de impresión.

DEFINE CLASS PrintJob AS Job OLEPublic
   PROCEDURE StartJob
      DoDefault()
      =INKEY(10)
      THIS.EndJob()
   ENDPROC
ENDDEFINE

El método EndJob del objeto llama al método JobDone del trabajo original y libera al objeto PrintJob, FaxJob o GraphJob.

PROCEDURE EndJob
   THIS.lbl1.caption = 'Ending job...'
   THIS.oJob.JobDone()
   THIS.oJob = .null.
   THIS.Visible = .F.
   THISFORM.Release 
ENDPROC

El código del método JobDone del objeto de trabajo original notifica al formulario que se ha terminado el trabajo al llamar al método JobDone del formulario.

PROCEDURE jobdone
   IF TYPE('THIS.oFormRef')='O'
      THIS.oFormRef.JobDone(THIS.JobType)
   ENDIF
ENDPROC

Por último, el método JobDone del formulario muestra el estado del trabajo en el cuadro de lista del formulario:

PARAMETER cJob
THIS.lstJobs.AddItem(m.cJob+' job is complete.')

La vida del objeto Job

El objeto Job (basado en la clase PrintJob, FaxJob o GraphJob definida en JOBMGR.prg) es:

  • Se crea en el método AddJob del formulario Conjuntos.
  • Se pasa al método NewJob de la clase PoolMgr.
  • Se almacena en la clase PoolMgr para un elemento de una matriz.
  • Se pasa del evento Timer del objeto cronómetro en PoolMgr al método SetupJob del objeto PrintJob, FaxJob o GraphJob (tal como se haya definido en Poolmgr.prg, no en JOBMGR.prg, y creado en el evento Timer).
  • Se almacena en una propiedad de la clase PrintJob, FaxJob o GraphJob del método SetupJob.
  • Se establece como .NULL. en el método EndJob del objeto PrintJob, FaxJob o GraphJob, después de haber llamado al método JobDone del trabajo.

Vea también

Ejemplos de soluciones | Ejemplos de servidor