Queued Components
The COM+ Queued Components service provides an easy way to invoke and execute components asynchronously using Microsoft Message Queuing. Processing can occur without regard to the availability or accessibility of either the sender or receiver.
To use this service, the class must derive directly or indirectly from the System.EnterpriseServices.ServicedComponent class.
The MaxListenerThreads property indicates the maximum number of concurrent Queued Components listener threads. The valid range for this value is 0 through 1000. For a newly created application, the setting is derived from the algorithm currently used for determining the default number of listener threads: 16 multiplied by the number of CPUs in the server. This value does not dictate the number of threads running at all times, simply the maximum number of possible threads. On an idle server, there would be only one thread running until more messages were found in the queue. Then the server would create more threads as needed until it reaches the MaxListenerThreads value. The following example sets the maximum number of Queued Components listener threads to 64.
**Note **The string supplied to the Marshal.BindToMoniker method can contain optional parameters to specify the computer name and other information. Please refer to the "Developing Queued Components" section of the Platform SDK for more information.
<ApplicationQueuingAttribute(QueueListenerEnabled := _
true, MaxListenerThreads := 64 )>
[C#]
[ApplicationQueuingAttribute(QueueListenerEnabled = true, MaxListenerThreads = 64 )]
The following two-part example shows how to implement a QComponent
class on the server to display a message asynchronously and uses a client to invoke the DisplayMessage method on a Queued Component.
Server
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);
}
See Also
Summary of Available COM+ Services | System.EnterpriseServices Namespace