2010-04-03 6 views
3

j'avais posté cette question plus tôt post ?En utilisant MSMQ et WCF

commencé à lire sur WCF et MSMQ. Ma première question serait - disons que j'ai 100 messages dans la file d'attente, comment dirais-je à mon service de commencer à travailler sur chaque message de façon asynchrone afin qu'il travaille sur plusieurs messages en même temps. est-ce même possible ou est-ce toujours une opération synchrone?

Mise à jour: Disons que mon système est en tant que tel que j'ai des emplacements/serveurs distants où les fichiers sont téléchargés aussi. Tout mon traitement se passe à un emplacement central. Msmq et wcf seraient-ils exploités de manière à ce que tous les fichiers provenant d'emplacements distants soient copiés vers un emplacement central. Les messages peuvent être alimentés par une application surveillant un DB et une fois qu'il détermine qu'un fichier doit être copié, il alimente un message que le service wcf reçoit et copie le fichier de l'emplacement distant à l'emplacement central.

Comme il s'agit d'un réseau dédié, le fichier sera accessible via des chemins non définis. Je sais que mes clients seront enclins à le faire à un moment donné et à essayer de déterminer si cela est faisable étant donné le volume de fichiers et les exigences de copies de fichiers simultanées.

J'ai suggéré BITS mais le client n'est pas à l'aise avec BITS en raison de la politique avec leur département informatique.

Répondre

1

La file d'attente (comme son nom l'indique) contient une file d'attente linéaire d'objets. Vous devez en enlever un avant de pouvoir prendre le suivant.

Vous pouvez créer un gestionnaire d'événements receiveCompleted pour prendre un objet hors de la file d'attente et le transmettre à un autre composant pour le traitement

qq.ReceiveCompleted += new ReceiveCompletedEventHandler(qq_ReceiveCompleted); 
qq.BeginReceive(); 

static void qq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) 
{ 
    //DO SOMETHING WITH e.Message.Body e.g. Start a seperate thread which processes the object. 

    // Listen for the next message. 
    queue.BeginReceive(); 
} 
3

Le code côté serveur WCF sera contrôlée par les paramètres de limitation de service dans config . Par défaut, pour chaque requête (message dans la file d'attente), une instance de la classe de service sera créée pour gérer le message. Le WCF serveur côté ServiceHost gère cette gestion pour vous - aucune manipulation spéciale de votre côté n'est nécessaire.

La limitation de service peut être contrôlée par le comportement serviceThrottling. Découvrez cet excellent blog post by Dan Rigsby sur les détails de la configuration de la limitation dans la configuration.

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="throttled"> 
       <serviceThrottling 
        maxConcurrentCalls="16" 
        maxConcurrentInstances="2147483647" 
        maxConcurrentSessions="10"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Les paramètres les plus importants seront les maxConcurrentCalls - ce qui définit la façon dont seront traitées de nombreux appels simultanés par votre service WCF.

Vous devriez également consulter ce blog post here qui montre comment utiliser MSMQ + WCF et comment cela contraste directement avec MSMQ et WCF-sur-HTTP. Excellente intro, excellente vidéo.