ablog

不器用で落着きのない技術者のメモ

Oracle から Messaging Gateway を使って WebSphere MQ にメッセージを飛ばしてみる

[構成]

  • node1
  • node2
    • Solaris 10
    • WebSphere MQ 7.0 server
      • Queue manager: saturn.queue.manager
      • Local Queue: queue1, out_log_queue1, in_log_queue1
      • Channel: channel1(server-connect), MCA user ID=mqm
    • IP: 192.168.0.140


[設定手順]

  • node2: WMQのキュー・マネージャーを設定する。
# su - mqm
$ bash
$ crtmqm -q saturn.queue.manager
$ strmqm
$ runmqsc
: define qlocal (queue1)
: define qlocal (out_log_queue1)
: define qlocal (in_log_queue1)
: define channel (channel1) chltype (svrconn) trptype (tcp) mcauser ('mqm')
: define listener (listener1) trptype (tcp) control (qmgr)
: start listener (listener1)
: end
  • node1: WQMの動作確認をする。
# su - mqm
$ bash
$ export MQSERVER='CHANNEL1/TCP/192.168.0.140(1414)'
$ cd /opt/mqm/samp/bin
$ ./amqsputc QUEUE1 saturn.queue.manager
test<RETURN>
<RETURN>
$ ./amqsgetc QUEUE1 saturn.queue.manager
Sample AMQSGET0 start
message <test> ← さきほど入力したメッセージが出力されればOK
./amqsgetc QUEUE1 saturn.queue.managerno more messages
Sample AMQSGET0 end
  • node1: $ORACLE_HOME/netowrk/admin/listener.ora を設定する。
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.130)(PORT = 1521))
    )
  )

SID_LIST_LISTENER =
(SID_LIST =
    (SID_DESC =
        (SID_NAME = PLSExtProc)
        (ORACLE_HOME = /export/home/oracle/app/oracle/product/11.1.0/db_1)
        (PROGRAM = extproc)
    )
    (SID_DESC =
        (SID_NAME = mgwextproc)
        (ENVS="LD_LIBRARY_PATH=/export/home/oracle/app/oracle/product/11.1.0/db_1/jdk/jre/lib/sparcv9:/export/home/oracle/app/oracle/product/11.1.0/db_1/lib:/export/home/oracle/app/oracle/product/11.1.0/db_1/jdk/jre/lib/sparcv9/server")
        (ORACLE_HOME = /export/home/oracle/app/oracle/product/11.1.0/db_1)
        (PROGRAM = extproc)
  )
)

※ENVSの記述に注意。タブ・スペース・改行などを含めると正常に動作しない。エージェント起動時にORA-06520、ORA-06520などが発生する。

  • node1: リスナーを再起動する。
$ lsnrctl stop
$ lsnrctl start
  • node1: $ORACLE_HOME/network/admin/tnsnames.ora を設定する。
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.130)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

MGW_AGENT=
(DESCRIPTION =
 (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL=IPC)(KEY=EXTPROC1521)))
  (CONNECT_DATA = (SID=mgwextproc) (PRESENTATION=RO)))
  • $ORACLE_HOME/mgw/admin/mgw.ora を作成する。
# su - oracle
$ cd $ORACLE_HOME/mgw/admin
$ perl -ple 's/\/myOracleHome/$ENV{ORACLE_HOME}/g' sample_mgw.ora > mgw.ora
$ vi mgw.ora
log_directory=/export/home/oracle/app/oracle/product/11.1.0/db_1/mgw/log
log_level = 3
  • MGW関連のオブジェクト・ロールなどを作成する
$ cd $ORACLE_HOME/mgw/admin
$ sqlplus / as sysdba 

--catmgw.sql を実行する。
SQL> spool catmgw.log
SQL> @catmgw.sql
SQL> spool off

--管理ユーザを作成する。
SQL> create user mgwadmin identified by oracle; 
SQL> grant connect, resource to mgwadmin; 
SQL> grant mgw_administrator_role to mgwadmin;

--エージェントユーザを作成する。
SQL> create user mgwagentuser identified by oracle; 
SQL> grant connect, resource to mgwagentuser; 
SQL> grant mgw_agent_role to mgwagentuser;

--接続設定を行う
SQL> conn mgwadmin/oracle
SQL> exec dbms_mgwadm.db_connect_info ('mgwagentuser','oracle', 'orcl');
/*
ここで指定する接続識別子はsqlplusでログインできるものでないといけない。
接続できない場合、$ORACLE_HOME/mgw/log/*.logにORA-28547が出力される。
*/

--エージェントを起動する。
SQL> conn mgwadmin/oracle
SQL> exec dbms_mgwadm.startup

--エージェントが起動していることを確認する。
SQL> set linesize 160
SQL> col last_error_msg for a60
SQL> select agent_status,agent_ping,last_error_msg from mgw_gateway;
AGENT_STATUS    AGENT_PING  LAST_ERROR_MSG
--------------- ----------- ------------------------------------------------------------
RUNNING         REACHABLE


/*
(↓)起動に失敗した場合の例。$ORACLE_HOME/mgw/log 以下のログをチェックすべし。

AGENT_STATUS    AGENT_PING  LAST_ERROR_MSG
--------------- ----------- ------------------------------------------------------------
NOT_STARTED                 ORA-06520: PL/SQL: 外部ライブラリのロード中にエラーが発生し
                            ました。
                            ORA-06522: ld.so.1: extproc: 重大なエラー: libjvm.so: open
                            に失敗しました: ファイルもディレクトリもありません。

AGENT_STATUS    AGENT_PING  LAST_ERROR_MSG
--------------- ----------- ------------------------------------------------------------
NOT_STARTED                 ORA-32830: 結果コード-101がMessaging Gatewayエージェントによ
                            って戻されました。
*/
  • キュー、キュー・テーブル、システム・リンク、foreignキュー、サブスクライバ、スケジュールを作成する。
--キューとキュー・テーブルを作成する。
conn  mgwadmin/oracle
begin
   dbms_aqadm.create_queue_table (queue_table => 'sample_queue_table', 
   queue_payload_type => 'sys.mgw_basic_msg_t', multiple_consumers => true);
		
   dbms_aqadm.create_queue (queue_name => 'mgwadmin.omg_sample_queue', 
   queue_table => 'mgwadmin.sample_queue_table', max_retries => 1000);
end;
/

--キューを起動する。
begin
   dbms_aqadm.start_queue (queue_name => 'omg_sample_queue');
end;
/

--システム・リンクを作成する。
declare
   v_options sys.mgw_properties;
   v_prop sys.mgw_mqseries_properties;
begin
   v_prop := sys.mgw_mqseries_properties.construct();
   v_prop.max_connections := 1;
   v_prop.username := null;
   v_prop.password := null;
   v_prop.hostname := '192.168.0.140';
   v_prop.port     := 1414;
   v_prop.channel  := 'channel1';
   v_prop.queue_manager := 'saturn.queue.manager'; 
   v_prop.outbound_log_queue := 'out_log_queue1';
   v_prop.inbound_log_queue := 'in_log_queue1';
   dbms_mgwadm.create_msgsystem_link(
      linkname => 'omg_link', properties => v_prop, options => v_options );
end;
/

--foreignキューを作成する。
begin
   dbms_mgwadm.register_foreign_queue(
   name => 'queue1',
   linkname => 'omg_link',
   provider_queue => 'queue1',
   domain => dbms_mgwadm.domain_queue);
end;
/

--サブスクライバを登録する
begin
   dbms_mgwadm.add_subscriber(
   subscriber_id => 'sub_omg_sample_queue',
   propagation_type => dbms_mgwadm.outbound_propagation,
   queue_name => 'mgwadmin.omg_sample_queue', 
   destination => 'queue1@omg_link');
end;
/

--スケジュールを作成する
begin
   dbms_mgwadm.schedule_propagation(
   schedule_id => 'sch_omg_sample_queue',
   propagation_type => dbms_mgwadm.outbound_propagation,
   source => 'mgwadmin.omg_sample_queue',
   destination => 'queue1@omg_link',
   latency => 10);
end;
/

--スケジュールを有効化する
begin
   dbms_mgwadm.enable_propagation_schedule('sch_omg_sample_queue');
end;
/

--スケジュールを確認する。
set linesize 200
col  schedule_id for a20
col destination for a24
col source for a20
select schedule_id,source,destination,latency,propagation_type,schedule_disabled from mgw_schedules;


[確認手順]
これで設定完了。Oracle から WMQ にメッセージを飛ばしてみる。

  • node2: キューにメッセージがないことを確認する。
# su - mqm
$ runmqsc
: display ql(QUEUE1) curdepth
  • node1: キューにメッセージを書き込む。
declare
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
msgid raw(16);
payload sys.mgw_basic_msg_t;
header sys.mgw_name_value_array_t;
text_body sys.mgw_text_value_t;
msg varchar2(100);
begin
header := sys.mgw_name_value_array_t(
sys.mgw_name_value_t.construct_integer('mgw_mq_characterset', '1208'),
sys.mgw_name_value_t.construct_integer('mgw_mq_priority', '7')
);
select 'sample msg:'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') into msg from dual;
text_body := sys.mgw_text_value_t(msg, null);
payload := sys.mgw_basic_msg_t(header, text_body, null);
dbms_aq.enqueue(queue_name => 'mgwadmin.omg_sample_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => payload,
msgid => msgid);
commit;
end enqueue;
/
  • node2: キューが到着していることを確認する。
: display ql(QUEUE1) curdepth


[おまけ]

  • node1: オブジェクト削除手順
conn mgwadmin/oracle
exec dbms_mgwadm.disable_propagation_schedule('sch_omg_sample_queue');
exec dbms_mgwadm.unschedule_propagation('sch_omg_sample_queue');
exec dbms_mgwadm.remove_subscriber('sub_omg_sample_queue',dbms_mgwadm.force);
exec dbms_mgwadm.unregister_foreign_queue('queue1','omg_link');
exec dbms_mgwadm.remove_msgsystem_link('omg_link');
exec dbms_aqadm.stop_queue(queue_name => 'omg_sample_queue');
exec dbms_aqadm.drop_queue('omg_sample_queue');
exec dbms_aqadm.drop_queue_table (queue_table => 'sample_queue_table');


[参考]
メッセージ・ゲートウェイの使用
http://www.oracle.com/lang/jp/database/product_editions.html
Oracle Databaseのインストール後の作業
19 Getting Started with Oracle Messaging Gateway
Integrating Oracle database applications with WebSphere MQ applications
Testing Oracle 11g Message Gateway with IBM websphere MQ v7 | Haiyanliang's Weblog
Oracleのメッセージキューイング機能をJavaで使ってみる
Oracle9i ステップマスター