Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Может ли MQ такое?  [new]
olzhas
Member

Откуда: Kazakhstan, Astana
Сообщений: 460
С MQ не работал имею лишь поверхностное представление что это такое.
Поэтому вопрос к форумчанам.
Допустим есть сервер MQ с очередями. Можно ли написать клиента для Win32 (Желательно на Delphi). Что бы он мог ложить и забирать сообщения из очередей сервера.
26 июн 08, 08:10    [5849611]     Ответить | Цитировать Сообщить модератору
 Re: Может ли MQ такое?  [new]
Serg0
Member

Откуда: Алматы
Сообщений: 76
Смочь должны вы. На чем писать не важно, сумеете использовать API - напишете.
26 июн 08, 09:00    [5849732]     Ответить | Цитировать Сообщить модератору
 Re: Может ли MQ такое?  [new]
xze32
Guest
Сложно в google поискать?


http://www-1.ibm.com/support/docview.wss?rs=171&uid=swg24007060&loc=en_US&cs=utf-8&lang=en
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1208241010&n=5
26 июн 08, 09:01    [5849740]     Ответить | Цитировать Сообщить модератору
 Re: Может ли MQ такое?  [new]
toxicdream
Member

Откуда: Astana, Kazakhstan
Сообщений: 5
Ну вот, как всегда, "это уже было, сходи туда, посмотри тама, и еще вон тама", а когда доходит дело до реально работающего примера - фигушки.
В общем была такая задача - на машине 192.168.0.XX работает сервер MQ (или менеджер очередей, кому как удобно), надо с машины 192.168.0.YY ложить сообщения в очередь QQQ и забирать из очереди ZZZ.
После почти недельных поисков в инете нашел всего пару реальных примеров на С.
Вот здесь http://www.capitalware.biz/mq_code_c.html
и в поставляемых вместе с MQ примерах
C:\Program Files\IBM\WebSphere MQ\Tools\c\Samples\amqscnxc.c
И так, не углубляясь в подробности, обертка для длл-ок которая лежит здесь http://www-1.ibm.com/support/docview.wss?rs=171&uid=swg24007060&loc=en_US&cs=utf-8〈=en не дает такой возможности.
После моей доработки, обертка выглядит так (см. аттач)
Кроме того, мне не удалось подключиться к серверу, не устанавливая клиента. :(
Ко всему прочему, надо запускать клиента от имени пользователя, которому разрешено работать с очередями. В моем случае пришлось на клиентской машине 192.168.0.YY добавить пользователя, который уже был прописан на сервере (рабочие группы).
uses MQ;
// -------------------------
procedure TForm1.FormClick(Sender: TObject);
var
  Connect_options : MQCNO;
  ClientConn      : MQCD;
  od              : MQOD;
  QMName          : MQCHAR48;
  Hcon            : MQHCONN;
  Hobj            : MQHOBJ;
  CompCode        : MQLONG;
  OpenCode        : MQLONG;
  Reason          : MQLONG;
  CReason         : MQLONG;
  MsgDescript     : MQMD;
  PutOptions      : MQPMO;
  GetOptions      : MQGMO;
  BufLength       : MQLONG;
  MsgBuffer       : MQCHAR128;
  MsqLength       : MQLONG;
begin
  Connect_options := MQCNO_DEFAULT;
  ClientConn := MQCD_CLIENT_CONN_DEFAULT;
  od := MQOD_DEFAULT;
  QMName := '';  // менеджер по умолчанию, если другой, можно указать, например QMName := 'mymq.manager'
  ClientConn.ConnectionName := '192.168.0.XX';
  ClientConn.ChannelName    := 'JAVA.CHANNEL'; // укажите свой канал подключения, у нас такой
  Connect_options.ClientConnPtr := Addr(ClientConn);
  Connect_options.Version := MQCNO_VERSION_2;
  MQCONNX(@QMName, @Connect_options, @Hcon, @CompCode, @CReason);
  if CompCode = MQCC_FAILED then begin
    MessageBox(0, PAnsiChar(Format('MQCONNX ended with reason code %d', [CReason])), 'Error!', MB_ICONWARNING);
    Halt(CReason);
  end;
  od.ObjectType := MQOT_Q;
  od.ObjectName := 'QQQ';  // название очереди

  MQOPEN(Hcon, @od, MQOO_OUTPUT + MQOO_FAIL_IF_QUIESCING, @Hobj, @OpenCode, @Reason);
  if Reason <> MQRC_NONE then
    MessageBox(0, PAnsiChar(Format('MQOPEN ended with reason code %d', [Reason])), 'Error!', MB_ICONWARNING);
  if OpenCode = MQCC_FAILED then
    MessageBox(0, 'Unable to open queue manager for inquire', 'Error!', MB_ICONWARNING)
  else begin
    MsgDescript := MQMD_DEFAULT;
    PutOptions  := MQPMO_DEFAULT;
    MQPUT(Hcon, Hobj, @MsgDescript, @PutOptions, 12, 'Hello World!', @CompCode, @Reason);
    if Reason = MQRC_NONE then
      MessageBox(0, 'MQPUT succesfull!', 'Done!', MB_ICONINFORMATION)
    else
      MessageBox(0, PAnsiChar(Format('MQPUT ended with reason code %d', [Reason])), 'Error!', MB_ICONWARNING);
    MQCLOSE(Hcon, @Hobj, MQCO_NONE, @CompCode, @Reason);
    if Reason <> MQRC_NONE then
      MessageBox(0, PAnsiChar(Format('MQCLOSE ended with reason code %d', [Reason])), 'Error!', MB_ICONWARNING);
  end;

  MQOPEN(Hcon, @od, MQOO_INPUT_SHARED + MQOO_FAIL_IF_QUIESCING, @Hobj, @OpenCode, @Reason);
  if Reason <> MQRC_NONE then
    MessageBox(0, PAnsiChar(Format('MQOPEN ended with reason code %d', [Reason])), 'Error!', MB_ICONWARNING);
  if OpenCode = MQCC_FAILED then
    MessageBox(0, 'Unable to open queue manager for inquire', 'Error!', MB_ICONWARNING)
  else begin
    MsgDescript := MQMD_DEFAULT;
    GetOptions  := MQGMO_DEFAULT;
    GetOptions.Options := MQGMO_NO_WAIT + MQGMO_NO_SYNCPOINT;
    MsgBuffer   := '';
    BufLength   := 100;
    MQGET(Hcon, Hobj, @MsgDescript, @GetOptions, BufLength, @MsgBuffer, @MsqLength, @CompCode, @Reason);
    if Reason = MQRC_NONE then
      MessageBox(0, PAnsiChar('MQGET succesfull! ' + MsgBuffer), 'Done!', MB_ICONINFORMATION)
    else
      MessageBox(0, PAnsiChar(Format('MQGET ended with reason code %d', [Reason])), 'Error!', MB_ICONWARNING);

    MQCLOSE(Hcon, @Hobj, MQCO_NONE, @CompCode, @Reason);
    if Reason <> MQRC_NONE then
      MessageBox(0, PAnsiChar(Format('MQCLOSE ended with reason code %d', [Reason])), 'Error!', MB_ICONWARNING);
  end;

  if CReason <> MQRC_ALREADY_CONNECTED then begin
    MQDISC(@Hcon, @CompCode, @Reason);
    if Reason <> MQRC_NONE then
      MessageBox(0, PAnsiChar(Format('MQDISC ended with reason code %d', [Reason])), 'Error!', MB_ICONWARNING);
  end;
  MessageBox(0, 'Sample MQCONNX end', 'Done!', MB_ICONINFORMATION);
end;

end.

Если есть что добавить, пишите.
Например, если сможете избавиться от необходимости ставить клиента.
Или разберетесь с авторизацие пользователей. Буду рад конструктивной критике. :)

К сообщению приложен файл (MQ.PAS - 90Kb) cкачать
7 авг 08, 10:26    [6037419]     Ответить | Цитировать Сообщить модератору
 Re: Может ли MQ такое?  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
1. Без клиента MQ работать с сервером MQ не получится. А как ты себе это вообще представляешь?
2. Можно самому средствами борланда (implib по моему) сделать файл экспорта и библиотеку импорта для mqsi32.dll и пользоваться потом ей. Все базовые функции там есть. Для Borland С++ Builder когда то делал такое и оно работало.
3. Про авторизацию читай в документации. Варианты есть. Начиная от явного указания имени пользователя через MQ_USER_ID.

Примеров рабочих идет много в комплекте с MQ (как клиентом так и сервером), как в исходниках так и откомпилированных. Но для Дельфи там примеров нет.

В общем начинать нужно вот отсюда по моему WebSphere(R) MQ information center
7 авг 08, 11:43    [6037995]     Ответить | Цитировать Сообщить модератору
 Re: Может ли MQ такое?  [new]
d----
Member

Откуда:
Сообщений: 2
olzhas
(Желательно на Delphi)

В архиве - описания интерфейсов к MQ и пара примеров.

К сообщению приложен файл (MQSeriesOnPascal.rar - 89Kb) cкачать
7 авг 08, 14:08    [6039192]     Ответить | Цитировать Сообщить модератору
 Re: Может ли MQ такое?  [new]
toxicdream
Member

Откуда: Astana, Kazakhstan
Сообщений: 5
Евгений Хабаров
1. Без клиента MQ работать с сервером MQ не получится. А как ты себе это вообще представляешь?
2. Можно самому средствами борланда (implib по моему) сделать файл экспорта и библиотеку импорта для mqsi32.dll и пользоваться потом ей. Все базовые функции там есть. Для Borland С++ Builder когда то делал такое и оно работало.
3. Про авторизацию читай в документации. Варианты есть. Начиная от явного указания имени пользователя через MQ_USER_ID.

Примеров рабочих идет много в комплекте с MQ (как клиентом так и сервером), как в исходниках так и откомпилированных. Но для Дельфи там примеров нет.

В общем начинать нужно вот отсюда по моему WebSphere(R) MQ information center

1. Теоретический если положить рядом с программой mqic32.dll и вызывать MQI-функции из нее, то все должно работать. На деле mqic32.dll в зависимости от версии, тянет за собой еще несколько библиотек. Но даже если положить их рядом, попытка подключения заканчивается ошибкой, кажется 2195 = UNEXPECTED_ERROR. Приходится устанавливать MQ Client от IBM хотя бы в минимальной комплектации (~70 mb)
2. Что-то не нашел я такую библиотеку (в версии 6.0 и 7.0). Для импорта предлагается mqax200.dll (в 6-ой версии). Получаем кучу компонентов, работающие через интерфейсы. Лень было разбираться с ними.
3. По поводу авторизации: в примерах на Си видел что-то похожее, а вот в той обертке этого нет. Попробую портировать, посмотреть что получится.
7 авг 08, 15:39    [6039818]     Ответить | Цитировать Сообщить модератору
 Re: Может ли MQ такое?  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
Клиента ставить нужно обязательно, хотя бы в минимальном варианте.
По библиотеке, прошу прощения за опечатку, имелся в виду именно mqic32.dll, который содержит все базовые функции.
7 авг 08, 16:30    [6040312]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить