[構成]
- 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 ステップマスター