2

キューにメッセージがあるときはいつでも、キュー内のメッセージを処理するために Windows サービスが必要です。

Windows サービスをセットアップするのがおそらく最善であり、キューにメッセージがあるときはいつでも、MSMQ がトリガーされ、Windows サービスへの呼び出しが発生するはずだと考えていました。

誰もこれを行う方法を知っていますか?

4

2 に答える 2

2

必要に応じて、Windows サービスで WCF ServiceHost をホストできます。これにより、受信したメッセージが自動的に取得されます。MSMQ への接続は必要ありません。メッセージが表示されると、WCF はメッセージを自動的にサービスに取り込みます。

MSMQ プライベート キュー 'test' に既に書き込みを行っているとします。実行中の Windows サービスを作成するには、次のようにします。サービスのメソッド精度の例は許してください。

namespace WcfService
{
  public class Order 
  { 
    public int ID { get; set; }
  }

  [ServiceContract]
  public interface IOrderService
  {
    [OperationContract(TransactionScopeRequired=true)]
    void ProcessOrder(Order order);
  }

  public class OrderService : IOrderService
  {
    public void ProcessOrder(Order order)
    {
      Debug.Print("Order ID: ", order.ID);
    }
  }
}

namespace Client
{
  public class WindowsService : IDisposable
  {
    private ServiceHost host = null;

    // TODO: Implement static void Main to initialize service

    // OnStart
    public void OnStart()
    {
      if(host == null)
        host = new ServiceHost( typeof ( OrderService ) );

      host.Open();
    }   

    public void OnStop()
    {
      host.Close();
    }

    public void Dispose()
    {
      // TODO: Implement Dispose() pattern properly
      if(host!=null) 
        host.Dispose();
    }
  }
}

次に、MSMQ から読み取る Windows サービスの構成

<?xml version="1.0"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netMsmqBinding>
                <binding name="readFromQueueBinding" exactlyOnce="false">
                    <security mode="None"/>
                </binding>
            </netMsmqBinding>
        </bindings>
        <services>
            <service name="WcfService.OrderService">
                <endpoint address="net.msmq://localhost/private/test" 
                          binding="netMsmqBinding" 
                          contract="WcfService.IOrderService" 
                          name="IOrderService_Msmq_Service" 
                          bindingConfiguration="readFromQueueBinding"/>
            </service>
        </services>
    </system.serviceModel>
</configuration>
于 2012-08-27T11:14:33.487 に答える
2

これは非常に大雑把な質問ですが、キューを同期または非同期でリッスンし、メッセージを受信して​​、到着時に処理する Windows サービスを作成できます。これを実現する方法については、Visual Studio によって提供される既定のサービス プロジェクトが適切な出発点です。そこから、サービスの開始時にインスタンス化されるクラスを作成し、キューにバインドしてReceiveor BeginReceive(同期または非同期) を呼び出してメッセージを取得し、それらを処理できます。

もう 1 つのオプションは、アクティベーション サービスを使用することです。これは、環境の観点からはより複雑になる可能性があり、利用するには特定のバージョンの Windows と .NET が必要です。

最後に、MSMQ トリガーがあります。これは、MSMQ 自体と共に (オプションで) インストールされるサービスです。キューを監視し、メッセージが到着したときにアクションを実行するように構成できます。これが最も簡単なオプションですが、これを選択する場合は、サービスの代わりに通常の EXE を作成し、トリガーを使用してそれを実行することをお勧めします。

この記事では、各アプローチの長所と短所について説明します。決断を下す前に一読することをお勧めします。

于 2012-08-20T17:23:36.960 に答える