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)