キュー コンポーネント

COM+ のキュー コンポーネント サービスでは、Microsoft メッセージ キューを使用して、コンポーネントを非同期で簡単に呼び出し、実行することができます。送信元または受信側の可用性またはアクセシビリティに関係なく、処理を発生させることができます。

このサービスを使用するには、System.EnterpriseServices.ServicedComponent クラスから直接または間接的にクラスを派生させる必要があります。

MaxListenerThreads プロパティは、並列キュー コンポーネント リスナ スレッドの最大数を示します。有効な値範囲は、0 ~ 1000 です。新しく作成したアプリケーションについては、既定のリスナ スレッド数を決定するために現在使用されているアルゴリズム (16×サーバーの CPU 数) から設定を派生させます。この値は、常時実行するスレッドの数ではなく、使用できるスレッドの最大数を示します。アイドル サーバーでは、キュー内にメッセージが追加されるまで、スレッドが 1 つだけ実行されます。その後、サーバーは、必要に応じてスレッドを作成し、MaxListenerThreads 値に達するまで追加していきます。キュー コンポーネント リスナ スレッドの最大数を 64 に設定する例を次に示します。

****メモ   Marshal.BindToMoniker メソッドに渡す文字列に、コンピュータ名およびその他の情報を指定するオプションのパラメータを含めることができます。詳細については、『Platform SDK』の「Developing Queued Components」のセクションを参照してください。

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

サーバー上に QComponent クラスを実装して非同期でメッセージを表示し、キュー コンポーネントの DisplayMessage メソッドをクライアントから呼び出す方法を次の 2 つの部分から構成される例で示します。

サーバー

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");
        }
    }
} 

クライアント

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);
}

参照

利用可能な COM+ サービスの概要 | System.EnterpriseServices