コード例
COM+ のキュー コンポーネント サービスでは、Microsoft メッセージ キューを使用して、コンポーネント クラスを非同期に呼び出すことができます。System.EnterpriseServices.ServicedComponent クラスから派生したキュー コンポーネントの詳細については、「キュー コンポーネント」を参照してください。
非同期でメッセージを表示するキュー コンポーネントを実装するには
-
System.EnterpriseServices 名前空間をインポートします。
Imports System.EnterpriseServices
using System.EnterpriseServices;
-
次のコード例に示すように、ApplicationActivation 属性を ActivationOption.Server に設定し、ApplicationQueuing アセンブリ属性を設定してアプリケーション キューとキュー リスナを有効にします。
<assembly: ApplicationActivation(ActivationOption.Server)>
<assembly: ApplicationQueuing(Enabled := True, _
QueueListenerEnabled := True)>
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationQueuing(Enabled=true, QueueListenerEnabled=true)]
-
キュー インターフェイスを定義し、インターフェイスに InterfaceQueuing 属性を適用します。たとえば、DisplayMessage という単一のメソッドがある IQComponent インターフェイスに InterfaceQueuing 属性を適用する方法を次のコード例に示します。
<InterfaceQueuing>
Public Interface IQComponent
Sub DisplayMessage(msg As String)
End Interface
[InterfaceQueuing]
public interface IQComponent
{
void DisplayMessage(string msg);
}
-
System.EnterpriseServices.ServicedComponent クラスから派生するクラスを定義し、キュー インターフェイスを実装します。たとえば、次のコード例は、System.EnterpriseServices.ServicedComponent クラスから派生した QComponent という名前のクラスを宣言し、IQComponent インターフェイスを実装します。
Public Class QComponent
Inherits ServicedComponent Implements IQComponent
Public Sub DisplayMessage(msg As String) implements _
IQComponent.DisplayMessage
MessageBox.Show(msg, "Processing message")
End Sub
End Class
public class QComponent : ServicedComponent, IQComponent
{
public void DisplayMessage(string msg)
{
MessageBox.Show(msg, "Processing message");
}
}
-
クライアント アプリケーションを作成し、キュー コンポーネントをテストします。
-
データ型がキュー インターフェイス (キュー コンポーネント クラスの派生元) である変数を作成します。
Dim iQc As IQComponent = Nothing
-
キュー インターフェイスに対応するモニカにバインドし、メソッドをキュー コンポーネントで呼び出してメッセージを非同期で表示します。たとえば、次のコードは、IQComponent インターフェイスに対応するキュー コンポーネントにバインドし、DisplayMessage メソッドを呼び出してメッセージを非同期で表示します。
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)
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);
使用例
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
<InterfaceQueuing>
Public Interface IQComponent
Sub DisplayMessage(msg As String)
End Interface
Public Class QComponent
Inherits ServicedComponent Implements IQComponent
Public Sub DisplayMessage(msg As String) implements _
IQComponent.DisplayMessage
MessageBox.Show(msg, "Processing message")
End Sub
End Class
End Namespace
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
{
[InterfaceQueuing]
public interface IQComponent
{
void DisplayMessage(string msg);
}
public class QComponent : ServicedComponent, IQComponent
{
public void DisplayMessage(string msg)
{
MessageBox.Show(msg, "Processing message");
}
}
}
参照