Compartir a través de


Componentes en cola

El servicio de componentes en cola de COM+ proporciona una manera fácil de llamar y ejecutar componentes de manera asincrónica utilizando Microsoft Message Queuing. El procesamiento se puede producir independientemente de la disponibilidad o accesibilidad del remitente o el receptor.

Para utilizar este servicio, la clase debe derivar directa o indirectamente de la clase System.EnterpriseServices.ServicedComponent.

La propiedad MaxListenerThreads indica el número máximo de subprocesos simultáneos de agente de escucha de componentes en cola. El intervalo válido para este valor va de 0 a 1000. Para una aplicación recién creada, el valor deriva del algoritmo usado actualmente para determinar el número predeterminado de subprocesos de agente de escucha: 16 multiplicado por el número de unidades de procesamiento (CPU) del servidor. Este valor no impone el número de subprocesos que se ejecutan en todo momento, sólo el número máximo de subprocesos posibles. En un servidor inactivo sólo habría un subproceso en ejecución hasta que se encontraran más mensajes en la cola. Entonces, el servidor crearía más subprocesos según fuera necesario hasta llegar al valor de MaxListenerThreads. En el ejemplo siguiente se establece en 64 el número máximo de subprocesos de agente de escucha de componentes en cola.

**Nota   **La cadena proporcionada al método Marshal.BindToMoniker puede contener parámetros opcionales para especificar el nombre del equipo así como otro tipo de información. Vea la sección "Desarrollar componentes en cola" de Platform SDK si desea obtener más información.

<ApplicationQueuingAttribute(QueueListenerEnabled := _ 
true, MaxListenerThreads :=  64 )>
[C#]
[ApplicationQueuingAttribute(QueueListenerEnabled = true, MaxListenerThreads =  64 )]

En el ejemplo siguiente que se compone de dos partes, se muestra cómo se implementa una clase QComponent en el servidor para mostrar un mensaje de manera asincrónica y se utiliza un cliente para llamar al método DisplayMessage en un componente en cola.

Servidor

Imports System.Reflection
Imports System.EnterpriseServices
Imports System

<assembly: ApplicationName("QCDemoSvr")>
<assembly: ApplicationActivation(ActivationOption.Server)>
<assembly: ApplicationQueuing(Enabled := True, _
            QueueListenerEnabled := True)>
<assembly: AssemblyKeyFile("QCDemoSvr.snk")>

Namespace QCDemo
   Public Interface IQComponent
      Sub DisplayMessage(msg As String)
   End Interface 
   
   <InterfaceQueuing(Interface := "IQComponent")> _
   Public Class QComponent 
   Inherits ServicedComponent Implements IQComponent 
          Public Sub DisplayMessage(msg As String) implements _
          IQComponent.DisplayMessage
             MessageBox.Show(msg, "Processing message")
          End Sub 'DisplayMessage
   End Class 
End Namespace 
[C#]
using System.Reflection;
using System.EnterpriseServices;

[assembly: ApplicationName("QCDemoSvr")]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationQueuing(Enabled=true, QueueListenerEnabled=true)]
[assembly: AssemblyKeyFile("QCDemoSvr.snk")]

namespace QCDemo
{
    public interface IQComponent 
    {
        void DisplayMessage(string msg);
    }

 [InterfaceQueuing(Interface = "IQComponent"]
    public class QComponent  : ServicedComponent, IQComponent
    {
        public void DisplayMessage(string msg)
        {
            MessageBox.Show(msg, "Processing message");
        }
    }
} 

Client

Protected Sub Send_Click(sender As Object, e As System.EventArgs) _
Handles send.Click
      Dim iQc As IQComponent = Nothing
      Try
            iQc = CType(Marshal.BindToMoniker("queue:/new:QCDemo.QComponent"), _
            IQComponent)
      Catch l as Exception
            Console.Writeline("Caught Exception: " & l.Message)
      End Try
      iQc.DisplayMessage(messageToSend.Text)
      Marshal.ReleaseComObject(iQc)
End Sub 'Send_Click
[C#]
protected void Send_Click (object sender, System.EventArgs e)
{
      IQComponent iQc = null;
      try
      {
            iQc = (IQComponent)      Marshal.BindToMoniker("queue:/new:QCDemo.QComponent");
      }
      catch
      {
            MessageBox.Show("Cannot create Queued Component");
      }
      iQc.DisplayMessage (messageToSend.Text);
      Marshal.ReleaseComObject(iQc);
}

Vea también

Resumen de servicios COM+ disponibles | System.EnterpriseServices (Espacio de nombres)