Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Может ли MQ такое? / 8 сообщений из 8, страница 1 из 1
26.06.2008, 08:10
    #35395183
olzhas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может ли MQ такое?
С MQ не работал имею лишь поверхностное представление что это такое.
Поэтому вопрос к форумчанам.
Допустим есть сервер MQ с очередями. Можно ли написать клиента для Win32 (Желательно на Delphi). Что бы он мог ложить и забирать сообщения из очередей сервера.
...
Рейтинг: 0 / 0
26.06.2008, 09:00
    #35395251
Serg0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может ли MQ такое?
Смочь должны вы. На чем писать не важно, сумеете использовать API - напишете.
...
Рейтинг: 0 / 0
26.06.2008, 09:01
    #35395255
xze32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может ли MQ такое?
Сложно в 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
...
Рейтинг: 0 / 0
07.08.2008, 10:26
    #35475379
toxicdream
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может ли MQ такое?
Ну вот, как всегда, "это уже было, сходи туда, посмотри тама, и еще вон тама", а когда доходит дело до реально работающего примера - фигушки.
В общем была такая задача - на машине 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 добавить пользователя, который уже был прописан на сервере (рабочие группы).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
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.

Если есть что добавить, пишите.
Например, если сможете избавиться от необходимости ставить клиента.
Или разберетесь с авторизацие пользователей. Буду рад конструктивной критике. :)
...
Рейтинг: 0 / 0
07.08.2008, 11:43
    #35475637
Может ли MQ такое?
1. Без клиента MQ работать с сервером MQ не получится. А как ты себе это вообще представляешь?
2. Можно самому средствами борланда (implib по моему) сделать файл экспорта и библиотеку импорта для mqsi32.dll и пользоваться потом ей. Все базовые функции там есть. Для Borland С++ Builder когда то делал такое и оно работало.
3. Про авторизацию читай в документации. Варианты есть. Начиная от явного указания имени пользователя через MQ_USER_ID.

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

В общем начинать нужно вот отсюда по моему WebSphere(R) MQ information center
...
Рейтинг: 0 / 0
07.08.2008, 14:08
    #35476220
d----
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может ли MQ такое?
olzhas(Желательно на Delphi)
В архиве - описания интерфейсов к MQ и пара примеров.
...
Рейтинг: 0 / 0
07.08.2008, 15:39
    #35476529
toxicdream
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Может ли MQ такое?
Евгений Хабаров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. По поводу авторизации: в примерах на Си видел что-то похожее, а вот в той обертке этого нет. Попробую портировать, посмотреть что получится.
...
Рейтинг: 0 / 0
07.08.2008, 16:30
    #35476726
Может ли MQ такое?
Клиента ставить нужно обязательно, хотя бы в минимальном варианте.
По библиотеке, прошу прощения за опечатку, имелся в виду именно mqic32.dll, который содержит все базовые функции.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Может ли MQ такое? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]