2015-04-07 2 views
2

Я пытаюсь создать пользовательский выход mq для архивирования сообщений, попавших в очередь. У меня есть следующий код.Parse byteBuffer в Websphere MQ Exit

class MyMqExits implements WMQSendExit, WMQReceiveExit{ 

@Override 
public ByteBuffer channelReceiveExit(MQCXP arg0, MQCD arg1, ByteBuffer arg2) { 
    // TODO Auto-generated method stub 

    if (arg2){ 
     def _bytes = arg2.array() 
     def results = new String(_bytes) 
     println results; 
    } 

    return arg2; 
} 
... 

Содержание сообщения (заголовок/тело) находится в буфере байт, наряду с некоторой нечитаемой двоичной информацией. Как я могу разобрать сообщение (включая тело и имя очереди) из arg2? Мы прошли документацию IBM, но не нашли объект или что-то, что упростит это.

ответ

3

Предполагая, что следующие два момента:

1) Приложение отправитель не трудно закодированные имя очереди, в которой он помещает сообщения. Таким образом, вы можете изменить конфигурацию приложения для отправки сообщений другому объекту.

2) MessageId архивированного сообщения не имеет значения, важно только тело сообщения.

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

1) Подписчик 1: Административно определенный долговечный абонент с очередью, предоставляемой для приема сообщений. Укажите то же имя очереди, из которого ваше существующее приложение-получатель получает сообщения.

2) Подписчик 2: Другой административно определенный долговечный подписчик с предоставленной очередью. Вы можете написать простое Java-приложение для получения сообщений из этой очереди и архива.

3) Оба подписчика подписываются на эту же тему.

Вот шаги:

// Create a topic 
define topic(ANY.TOPIC) TOPICSTR('/ANY_TOPIC') 
// Create an alias queue that points to above created topic 
define qalias(QA.APP) target(ANY.TOPIC) targtype(TOPIC) 
// Create a queue for your application that does business logic. If one is available already then no need to create. 
define ql(Q.BUSLOGIC) 
// Create a durable subscription with destination queue as created in previous step. 
define sub(SB.BUSLOGIC) topicstr('/ANY_TOPIC') dest(Q.BUSLOGIC) 
// Create a queue for application that archives messages. 
define ql(Q.ARCHIVE) 
// Create another subscription with destination queue as created in previous step. 
define sub(SB.ARCHIVE) topicstr('/ANY_TOPIC') dest(Q.ARCHIVE) 

написать простое приложение MQ Java/JMS для получения сообщений от Q.ARCHIVE и архивировать сообщения.

3

Получатель получает не все сообщение. Отправлять и получать выходы работают на буферах передачи, отправляемых/принимаемых по каналам. Они будут содержать различные потоки протокола, которые не документируются, потому что протокол не является общедоступным, и часть этих потоков протокола будет фрагментами сообщений, разбитых на разделы в 32 Кб.

Вы не даете достаточно информации в своем вопросе, чтобы узнать, какой тип канала вы используете, но я предполагаю, что это на стороне клиента, так как вы пишете его на Java, и это единственная среда, это применимо.

Дать выход на стороне клиента, вам нужно быть осторожным, вы имеете дело со случаями, когда сообщение успешно не ставится на целевой очереди, и вы должны будете управлять syncpoints и т.д.

Если вы использовали каналы QMgr-QMgr, вы должны использовать выход сообщения, чтобы захватить вызовы MQXR_MSG, где вам предоставляется все сообщение. Если вы отправляете какие-либо дополнительные сообщения в выход из канала, отправляемые вами сообщения включаются в Syncpoint канала и поэтому совершаются, если исходные сообщения были совершены.

Поскольку вы используете каналы client-QMgr, вы можете посмотреть выход API на конец QMgr (в настоящее время API-интерфейсы клиентской стороны поддерживаются только для клиентов C) и улавливают все вызовы MQPUT. Этот выход также даст вам коды возврата MQPUT, чтобы вы могли закодировать свой выход, чтобы посмотреть, и справиться с неудачными статами.

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

2

Я полностью согласен с Morag & Шаши, неправильный подход. Существует проект с открытым исходным кодом, называемый Message Multiplexer (MMX), который получит сообщение из очереди и выведет его в одну или несколько очередей. Контекстная информация поддерживается через сообщения (-ы) сообщения. Для получения дополнительной информации о MMX перейдите по ссылке: http://www.capitalware.com/mmx_overview.html

Если вы не можете изменить исходные или целевые очереди для вставки MMX в микс, тогда выход API может сделать трюк. Вот сообщение в блоге о репликации сообщений через API-выход: http://www.capitalware.com/rl_blog/?p=3304