2013-09-10 5 views
6

Мы используем BizTalk Server для отправки сообщений через MSMQ. Принимающая система требует, чтобы каждое сообщение имело свойство расширения, установленное в guid (как байтовый массив). MSDN документирует свойство Extension для MSMQMessage here и (в .NET) here.Как настроить расширение сообщений MSMQ с помощью адаптера MSMQ BizTalk?

Это просто установить свойство расширения в .NET:

const string messageContent = "Message content goes here"; 
var encodedMessageContent = new UTF8Encoding().GetBytes(messageContent); 

// Create the message and set its properties: 
var message = new System.Messaging.Message(); 
message.BodyStream = new System.IO.MemoryStream(encodedMessageContent); 
message.Label = "AwesomeMessageLabel"; 
// Here is the key part: 
message.Extension = System.Guid.NewGuid().ToByteArray(); 

// Bonus! Send the message to the awesome transactional queue: 
const string queueUri = @"FormatName:Direct=OS:localhost\Private$\awesomeness"; 
using (var transaction = new System.Messaging.MessageQueueTransaction()) 
{ 
    transaction.Begin(); 
    using (var queue = new System.Messaging.MessageQueue(queueUri)) 
    { 
     queue.Send(message, transaction); 
    } 
    transaction.Commit(); 
} 

Однако MSMQ адаптер BizTalk в не поверхности расширения сообщения, как то, что может быть установлено (обратитесь к list of adapter properties on MSDN). Я также декомпилировал сборку Microsoft.BizTalk.Adapter.MSMQ.MsmqAdapter, которая поставляется с BizTalk 2013 и не может найти ссылки на свойство расширения.

Как установить расширение сообщения MSMQ, отправленного BizTalk? Я бы предпочел не создавать пользовательский адаптер, если это возможно, поскольку для этого требуется большое количество накладных расходов и текущего обслуживания.

ответ

3

Вы видите эту статью? http://msdn.microsoft.com/en-us/library/aa560725.aspx

В статье показано, как программно установить местоположение приема MSMQ; кроме того, он предоставляет доступ к дополнительным свойствам, которые могут быть необходимы, но не показаны адаптером BizTalk по умолчанию - (например, Extension) .

ManagementClass objReceiveLocationClass = 
    new ManagementClass(
        "root\\MicrosoftBizTalkServer", 
        "MSBTS_ReceiveLocation", 
        null); 
// Create an instance of the member of the class 
ManagementObject objReceiveLocation = 
      objReceiveLocationClass.CreateInstance(); 

// Fill in the properties 
objReceiveLocation["Name"] = name; 
objReceiveLocation["ReceivePortName"] = port; 
objReceiveLocation["AdapterName"] = adapterName; 
objReceiveLocation["HostName"] = hostName; 
objReceiveLocation["PipelineName"] = pipeline; 
objReceiveLocation["CustomCfg"] = customCfg; 
objReceiveLocation["IsDisabled"] = true; 
objReceiveLocation["InBoundTransportURL"] = inboundTransport; 

// Put the options -- creates the receive location 
objReceiveLocation.Put(options); 

EDIT:

После декомпиляции BizTalk MSMQ адаптер код вниз до уровня интерфейса, я не вижу способ сделать это с помощью адаптера по умолчанию. Адаптер не может быть продлен, поскольку он запечатан.

Единственные другие варианты, которые я нашел в

  1. Создание пользовательского адаптера (как вы уже перечислены)
  2. хак 1: Поместите данные в свойство, которое доступно в MSMQ Адаптер (например, ярлык), перехватите сообщение внешним процессом, преобразуйте его там.
  3. hack 2: Используйте специальный адаптер, который уже написан для вызова сценария powershell и выполняет необходимые преобразования/передачу в этом скрипте. http://social.technet.microsoft.com/wiki/contents/articles/12824.biztalk-server-list-of-custom-adapters.aspx#BizTalk_PowerShell_Adapter
  4. hack 3: Переопределить требования. Например. попросите получателя изменить требуемое поле от расширения до того, что доступно (например, Label).
  5. hack 4: Попытка найти способ отправки сообщения через адаптер WCF-MSMQ. http://msdn.microsoft.com/en-us/library/system.servicemodel.netmsmqbinding.aspx

EDIT: (Причина, почему вы не должны установить свойство расширения)

Свойство Extension используется для связывания больших сообщений вместе, которые получают фрагментированы в транспорте, если общий размер сообщения более 4 МБ. Это делается под обложками, и если обход может привести к повреждению больших сообщений.

Чтобы принять участие в крупных обменах сообщений, на компьютере с очередью сообщений должен быть установлен файл Mqrtlarge.dll, а приложение очередей сообщений должно использовать дополнительные API. В противном случае полные сообщения будут фрагментированы.

BizTalk 2004 Large Message Extension Documentation

BizTalk 2010 Large Message Extension Documentation

+0

Это отличный инструмент для создания программно MSMQ отправить порты, но, к сожалению, мы все еще можем только установить «пользовательские свойства» уже определены с помощью адаптера MSMQ. Это не позволяет нам добавлять дополнительные свойства, такие как расширение сообщения. – schellack

Смежные вопросы