Как запретить очередь из потока сообщений, используя e sql? - PullRequest
0 голосов
/ 31 января 2020

Я работаю над инструментарием IIB 10. Мне нужно остановить поток сообщений, который прослушивает очередь. Как запретить входную очередь этого потока сообщений от другого сервиса с помощью команд e sql? Я знаю mqs c команды для изменения очередей, но я не знаю, как сделать то же самое из кода e sql. Пожалуйста, помогите.

Привет, пожалуйста, найдите код ниже: Я получил это с форума, и у меня все еще есть сомнения в этом коде, например, как указать менеджер q, с которым связана очередь.

    CREATE NEXTSIBLING OF OutputRoot.Properties DOMAIN 'MQMD';
    CREATE NEXTSIBLING OF OutputRoot.MQMD DOMAIN 'MQADMIN' NAME 'MQPCF';

    CREATE FIELD OutputRoot.MQPCF;
    DECLARE refRequest REFERENCE TO OutputRoot.MQPCF;
    SET refRequest.Command = MQCMD_CHANGE_Q;
    /* First parameter: Queue Name. */
    SET refRequest.Parameter[1] = MQCA_Q_NAME;

    SET refRequest.Parameter[1].* = 'TEST.IN';
    /* Second parameter: Queue Type. */
    SET refRequest.Parameter[2] = MQIA_Q_TYPE;
    SET refRequest.Parameter[2].* = MQQT_LOCAL ;

    /* Third parameter: Allow/Inhibit GET.*/

    SET refRequest.Parameter[3] = MQIA_INHIBIT_GET;
    SET refRequest.Parameter[3].* = MQQA_GET_INHIBITED;
    SET OutputRoot.BLOB.BLOB = asbitstream(OutputRoot.MQPCF);

    SET OutputRoot.MQPCF = null;
    SET OutputRoot.MQMD.Format = MQFMT_ADMIN;                                              

Ответы [ 2 ]

3 голосов
/ 01 февраля 2020

Ваш единственный выбор - создать внешнюю программу, чтобы либо выполнить команду MQ PCF, либо использовать вызов API MQSET. Любой из них достаточно прямолинеен.

Вы можете использовать MQSET в C, COBOL, C#, Java, et c.

В Java, вы может сделать:

MQQueue queue = qMgr.accessQueue("TEST.Q1", CMQC.MQOO_SET + CMQC.MQOO_FAIL_IF_QUIESCING);
queue.setInhibitGet(CMQC.MQQA_GET_INHIBITED);

Вы можете проверить этот блог публикация для полной программы Java, которая будет вызывать вызов API MQSET для атрибутов get & put очереди с запретом или позволяют.

0 голосов
/ 04 февраля 2020

Кажется, вы не понимаете, как работает МИБ. Вы определяете QM тем, как вы настроили свой выходной узел потока сообщений.

Вы используете E SQL только для создания сообщения PCF. Вы должны заглянуть в анализатор MQCFH.

Затем вы отправляете это сообщение в своем потоке сообщений через узел вывода MQ, указывающий на QM и очередь SYSTEM.ADMIN.COMMAND.QUEUE.

Ваш код кажется неправильным только в том случае, если он конвертируется в BLOB, что не является необходимым, и не устанавливает некоторые значения заголовка. Проверьте эту ссылку для получения более подробных примеров: https://www.ibm.com/support/knowledgecenter/en/SSMKHH_10.0.0/com.ibm.etools.mft.doc/ac16915_.html

Я считаю, что этот код должен работать для создания командного сообщения, но я не могу его сейчас попробовать:

CREATE NEXTSIBLING OF OutputRoot.Properties DOMAIN 'MQMD';
CREATE NEXTSIBLING OF OutputRoot.MQMD DOMAIN 'MQADMIN'
NAME 'MQPCF';
DECLARE refRequest REFERENCE TO OutputRoot.MQPCF;

SET OutputRoot.MQMD.MsgType = MQMT_REQUEST;
SET OutputRoot.MQMD.ReplyToQ = 'REPLYQ';

SET refRequest.Type = MQCFT_COMMAND;
SET refRequest.StrucLength = MQCFH_STRUC_LENGTH;
SET refRequest.Version = MQCFH_CURRENT_VERSION;
SET refRequest.Command = MQCMD_CHANGE_Q;
SET refRequest.MsgSeqNumber = 1;
SET refRequest.Control = MQCFC_LAST;

SET refRequest.Parameter[1] = MQCA_Q_NAME;
SET refRequest.Parameter[1].* = ‘QYOUWANTTOINHIBIT’;
SET refRequest.Parameter[2] = MQIA_Q_TYPE;
SET refRequest.Parameter[2].* = MQQT_LOCAL;
SET refRequest.Parameter[3] = MQIA_INHIBIT_GET;
SET refRequest.Parameter[3].* = MQQA_GET_INHIBITED;

RETURN TRUE;
...