私は WCF を初めて使用し、MSMQ を使用してクライアントをホスト (両方のコンソール アプリケーション) と通信させる方法を学んでいます。
クライアントからホストにメッセージを送信し、ホストがすぐにそれらを取得できるようにしたい、またはホストが停止している場合は、再起動したときに中断したところから続行できるようにしたい.
これはほぼ機能していますが、キューに 10 個のメッセージがある状態でホストを再起動すると、メッセージがキューの順序で処理されないことがわかりました。マルチスレッド化が進行しているため、それらが順不同に見えると思います。WCF サービスが一度に 1 つのメッセージを処理するように制限して、これを停止できるようにしたいと考えています (より良い解決策がない限り)。
これから取り組むシステムでは、MSMQ メッセージが並列ではなく順番に処理されることが不可欠です。
私のサービス契約のコードは次のとおりです。
[ServiceContract(Namespace = "http://www.heronfoods.com/DemoService")]
public interface IDemoService
{
[OperationContract(IsOneWay = true)]
void SendMessage(string message);
}
サービス契約の実装については、これを持っています。(コンソール出力は、これが私が学ぶためのデモアプリであるためです):
public class DemoService : IDemoService
{
public void SendMessage(string message)
{
Console.WriteLine("{0} : {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message);
}
}
私のホスト アプリケーションは、次のコードを含むコンソール アプリケーションです。
class Program
{
static void Main(string[] args)
{
Console.Title = "WCF Host";
using (var host = new ServiceHost(typeof(Library.DemoService)))
{
var endpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof(Library.IDemoService)),
new NetMsmqBinding(NetMsmqSecurityMode.None),
new EndpointAddress("net.msmq://localhost/private/test"));
host.AddServiceEndpoint(endpoint);
host.Open();
Console.WriteLine("Host Active");
Console.ReadLine();
}
}
}
クライアントも同様に単純です。
class Program
{
static void Main(string[] args)
{
Console.Title = "WCF Client";
IDemoService proxy = ChannelFactory<IDemoService>.CreateChannel(
new NetMsmqBinding(NetMsmqSecurityMode.None),
new EndpointAddress("net.msmq://localhost/private/test")
);
do
{
string msg = Console.ReadLine();
if (msg=="")
break;
else
proxy.SendMessage(msg);
} while (true);
}
}