2

私は 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);
    }
}
4

1 に答える 1

0

私はあなたのキューがトランザクションではないと仮定しています。

netMsmqBindingを単一のスレッドに絞る方法があるかどうかはわかりませんが、この制限を適用する必要はありません。

順序付けられた配信を保証するには、キューをトランザクション化してから、exactlyOnce属性をnetMsmqBinding構成に適用するだけです。

こちらの例をご覧ください。

于 2012-12-31T14:43:35.227 に答える