キューにメッセージがあるときはいつでも、キュー内のメッセージを処理するために Windows サービスが必要です。
Windows サービスをセットアップするのがおそらく最善であり、キューにメッセージがあるときはいつでも、MSMQ がトリガーされ、Windows サービスへの呼び出しが発生するはずだと考えていました。
誰もこれを行う方法を知っていますか?
キューにメッセージがあるときはいつでも、キュー内のメッセージを処理するために Windows サービスが必要です。
Windows サービスをセットアップするのがおそらく最善であり、キューにメッセージがあるときはいつでも、MSMQ がトリガーされ、Windows サービスへの呼び出しが発生するはずだと考えていました。
誰もこれを行う方法を知っていますか?
必要に応じて、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>
これは非常に大雑把な質問ですが、キューを同期または非同期でリッスンし、メッセージを受信して、到着時に処理する Windows サービスを作成できます。これを実現する方法については、Visual Studio によって提供される既定のサービス プロジェクトが適切な出発点です。そこから、サービスの開始時にインスタンス化されるクラスを作成し、キューにバインドしてReceive
or BeginReceive
(同期または非同期) を呼び出してメッセージを取得し、それらを処理できます。
もう 1 つのオプションは、アクティベーション サービスを使用することです。これは、環境の観点からはより複雑になる可能性があり、利用するには特定のバージョンの Windows と .NET が必要です。
最後に、MSMQ トリガーがあります。これは、MSMQ 自体と共に (オプションで) インストールされるサービスです。キューを監視し、メッセージが到着したときにアクションを実行するように構成できます。これが最も簡単なオプションですが、これを選択する場合は、サービスの代わりに通常の EXE を作成し、トリガーを使用してそれを実行することをお勧めします。
この記事では、各アプローチの長所と短所について説明します。決断を下す前に一読することをお勧めします。