domingo, 18 de março de 2012

Trocar mensagens com Endpoints WCF e aplicativos de enfileiramento de mensagens


Exchange Messages with WCF Endpoints and Message Queuing Applications

Você pode integrar existentes Message Queuing (MSMQ) aplicações com o Windows Communication Foundation (WCF) aplicativos usando a integração MSMQ ligação para converter mensagens MSMQ para mensagens do WCF. Isto permite-lhe pôr em aplicações receptor de clientes MSMQ do WCF, bem como chamada em serviços WCF a partir de aplicações MSMQ remetente.
Nesta seção, vamos explicar como usar MsmqIntegrationBinding para a comunicação entre na fila (1) um cliente WCF e um serviço de aplicação MSMQ escrito usando System.Messaging e (2) um aplicativo cliente MSMQ e um serviço WCF.
Para um exemplo completo que demonstra como chamar um aplicativo receptor MSMQ de um cliente WCF, consulte o link Windows Communication Foundation para o enfileiramento de mensagens.
Para um exemplo completo que demonstra como chamar um serviço WCF de um cliente MSMQ, consulte o link enfileiramento de mensagens para o Windows Communication Foundation.
Para criar um serviço WCF que recebe mensagens de um cliente MSMQ
1. Definir uma interface que define o contrato de serviço para o serviço WCF que recebe as mensagens na fila de um aplicativo remetente MSMQ, como mostrado no seguinte exemplo de código.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}

2. Implementar a interface e aplicar o ServiceBehaviorAttribute atributo para a classe, como mostrado no código exemplo a seguir.
public class OrderProcessorService : IOrderProcessor
{
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> ordermsg)
    {
        PurchaseOrder po = (PurchaseOrder)ordermsg.Body;
        Random statusIndexer = new Random();
        po.Status = (OrderStates)statusIndexer.Next(3);
        Console.WriteLine("Processing {0} ", po);
}
public static void Main()
{
    // Get base address from appsettings in configuration.
    Uri baseAddress = new Uri(ConfigurationManager.AppSettings["baseAddress"]);
 
    // Create a ServiceHost for the CalculatorService type and provide the base address.
    using (ServiceHost serviceHost = new ServiceHost(typeof(IOrderProcessor), baseAddress))
    {
    // Open the ServiceHostBase to create listeners and start listening for messages.
        serviceHost.Open();
 
    // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("The service is running in the following account: {0}", WindowsIdentity.GetCurrent().Name);
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();
 
    // Close the ServiceHostBase to shutdown the service.
        serviceHost.Close();
    }
}
}
3. Criar um arquivo de configuração que especifica o MsmqIntegrationBinding.
<configuration>
  <appSettings>
    <!-- use appSetting to configure MSMQ queue name -->
    <add key="orderQueueName" value=".\private$\Orders" />
    <add key="baseAddress" value="http://localhost:8000/ServiceModelSamples/Service" />
  </appSettings>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.ServiceModel.Samples.OrderProcessorService" >
        <endpoint address="msmq.formatname:DIRECT=OS:.\private$\Orders"
                                                                                                                                                  binding="msmqIntegrationBinding"
                  bindingConfiguration="OrderProcessorBinding" 
                  contract="Microsoft.ServiceModel.Samples.IOrderProcessor">
        </endpoint>
      </service>
    </services>
 
    <bindings>
      <msmqIntegrationBinding>
        <binding name="OrderProcessorBinding" >
          <security mode="None" />
        </binding>
      </msmqIntegrationBinding>
    </bindings>
 
  </system.serviceModel >
 
</configuration>

4. Instanciar um ServiceHost objeto que usa a ligação configurada.
// Create the purchase order.
PurchaseOrder po = new PurchaseOrder();
po.customerId = "somecustomer.com";
po.poNumber = Guid.NewGuid().ToString();
 
PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
lineItem1.productId = "Blue Widget";
lineItem1.quantity = 54;
lineItem1.unitCost = 29.99F;
 
PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
lineItem2.productId = "Red Widget";
lineItem2.quantity = 890;
lineItem2.unitCost = 45.89F;
 
po.orderLineItems = new PurchaseOrderLineItem[2];
po.orderLineItems[0] = lineItem1;
po.orderLineItems[1] = lineItem2;
         
OrderProcessorClient client = new OrderProcessorClient("OrderResponseEndpoint");
MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    client.SubmitPurchaseOrder(ordermsg);
    scope.Complete();
}
 
Console.WriteLine("Order has been submitted:{0}", po);
 
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
 
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

Nenhum comentário:

Postar um comentário