Olá pessoal. Tudo certo?!
Outro dia, falamos sobre como aumentar a flexibilidade de nossos sistemas usando “Pipes and Filters”. Também exploramos alternativas para aumentar integração e escalabilidade através de “Message Routers”
Nesse post, continuo explorando alternativas arquiteturais de integração (e mensageria) para EIP, através de “Message Translators”.
Este pattern também está descrito no excelente livro Enterprise Integration Patterns.
O que é um Message Translator?!
Um “Message Translator” é um tipo especial de filtro (veja Pipes and Filters) que converte mensagens representadas em um determinado formato para outro. Assim, ampliamos as possibilidades de integração enre aplicações.
Com alguma abstração, podemos assumir que este padrão é equivalente ao Adapter descrito pelo GoF. Veja:
Ou seja,
- temos uma Message Queue com dados em determinado formato;
- temos um “Filtro” (unidade de processamento);
- temos um “resultante”, a mensagem traduzida, sendo produzida pelo “translator” e encaminhada para uma Queue de destino.
Implementando
Como já disse, um Message Translator, na prática, é apenas um tipo especial de filtro. Por isso, a classe abstrata que definimos outro dia continua válida. Relembrando:
using System;
using System.Messaging;
namespace MSMQ.PipersAndFilters
{
public abstract class Filter
{
readonly MessageQueue inputQueue;
readonly MessageQueue outputQueue;
public Filter(MessageQueue input, MessageQueue output)
{
this.inputQueue = input;
this.outputQueue = output;
}
public void Start()
{
this.inputQueue.ReceiveCompleted += OnReceiveCompleted;
this.inputQueue.BeginReceive();
}
void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
var source = (MessageQueue)sender;
var message = source.EndReceive(e.AsyncResult);
message.Formatter = new XmlMessageFormatter(new [] { typeof(T) });
this.outputQueue.Send(Process(message));
this.inputQueue.BeginReceive();
}
protected abstract Message Process(Message original);
}
}
Para implementar um translator, nesse cenário, basta implementar o método Process adequadamente. Perceba:
using System;
using System.Messaging;
namespace MSMQ.PipersAndFilters
{
public class ContertStringToRichDataFilter :
Filter
{
public ContertStringToRichDataFilter(MessageQueue input, MessageQueue output) :
base(input, output)
{}
protected override Message Process(Message original)
{
var s = (string)original.Body;
return new Message(
new RichData(s)
);
}
}
public class RichData
{
private RichData()
{}
public RichData(string data)
{
this.Data = data;
this.Length = data.Length;
}
public string Data { get; set; }
public int Length { get; set; }
}
}
Era isso!






janeiro 28th, 2012 → 19:24
[...] Promovendo compatibilidade com Message Translator (usando C#) [...]
fevereiro 21st, 2012 → 23:33
[...] Message Translator [...]
fevereiro 21st, 2012 → 23:35
[...] Message Translator [...]