メニューボタン
IBMi海外記事2016.11.28

IBM iで.Net、XMLSERVICE リモート・コマンドを使うには

Richard Schoen 著

.Net デスクトップ、ウェブ、Web サービス・アプリケーションから既存のプログラム機能を使用する場合、CL コマンドを実行し、バッチ・ジョブをサブミットするのが最良の方法です。この記事では、 XMLSERVICE リモート・コマンド機能を中心にお話しします。IBM i システムで XMLSERVICE を使い、いかに簡単にプログラムを実行したり、バッチ・ジョブをサブミットできるかおわかりになると思います。

今号では、リモート・コマンド呼び出しの例をスタートに、XMLSERVICEi .Net アプリケーション・コードおよびサンプルをご紹介します。まだ XMLSERVICE アプリケーション・コードのインストールとセットアップが完了しておらず、Apache Web サーバー・インスタンスが作成されていない場合、まずこちらの導入記事を確認してください。 .Net アプリケーション・コードが動作するには、 XMLSERVICE が稼働している必要があるためです。また、テスト・アプリケーションを少なくとも 1 回は開いて構成し、実行していることを前提としています。

さきに、最近発生した重要なイベントについてお話しさせてください。7 月にマルチプラットフォームの新製品 Microsoft .Net Core 1.0 バージョンがリリースされました。タイムリーなことに、 XMLSERVICE ラッパーが .Net で使用できるようになりました。IBM i Access ODBC ドライバーは、 Linux および MacOS などの Windows 以外のプラットフォームで .Net Core では動作しないため、IBM i で新しい .Net または .Net Core アプリケーションを開発する場合、XMLSERVICE は、いっそう重要なデータ・アクセス方法としての役割を果たすようになります。詳細は www.microsoft.com/net/core#windows をご覧ください。

テスト・アプリを実行する

Visual Studio を起動し、XmlServiceApi ソリューション・ファイル C:\XmlServiceiApi\XmlServiceiApi.sln を読み込んで開きます。ソリューション内の XmlServiceApiTester プロジェクトを見つけて、FormMain.vb をダブルクリックしてメイン・フォームを開きます。

技術情報01

正しく構成したら、再生ボタンを押して API テスター・アプリケーションを実行させると、アプリケーション・ウィンドウを表示させることができるはずです。API で CL コマンド機能をテストするには、SNDMSG MSG(TEST) TOUSR(QSYSOPR) などのテスト CL コマンドを入力し、Run CL Command ボタンを押して選択された CL コマンドを実行します。すでに入力したデフォルト・コマンドを使用することもできます。CL コマンドを実行した後、メッセージ応答情報がデータ・グリッド内の XML 結果ウィンドウに表示されます。コマンドが成功すると、戻りコード "true" も、 ExecuteCommand 関数から返されます。コマンドが失敗すると、戻りコード "false" が返されます。"true" が返されると、リモート・コマンド呼び出しが成功したと見なされます。

コードをレビューする

リモート・コマンドを実行するコードをざっと見てみましょう。まず、接続パラメーターをセットアップする必要があります。IBM i への呼び出しをセットアップするには、SetBaseURL 関数を使用して、テスト・プロジェクト設定から基本 URL を XMLSERVICE オブジェクトに設定します。次に、SetUserInfo 関数を使用して、設定から目的の IBM i ユーザーとパスワードを設定します。実際のアプリケーションでは、ユーザー ID とパスワードを入力するようユーザーに要求することになります。SetIpcInfo 関数を呼び出して、この接続固有の IPC 会話を設定します。この関数は、 .Net アプリケーションをジョブ・パーシスタンスが可能な関連 IBM i ジョブに接続します。SetHttpTimeout 関数を使用して、タイムアウトするまでに何秒間 HTTP 接続しようとするか判断します。トランザクションのタイムアウトは通常 30 秒です。希望のトランザクション長に応じて、高い値または低い値を設定できます。

セットアップ作業が終了したら、適切な CL コマンド・ラインを ExecuteCommand 関数に渡します。この関数は、正常に完了すれば"true" を返し、失敗であれば" false" を返します。リモート・アプリケーションから CL コマンドを呼び出す場合、CL コマンドの配下で起動されるRPG、CL、または COBOL コード内のエラーを処理する必要がある点を覚えておくことが大切です。エラーを処理しないと、IBM i プログラムは、 QSYSOPR に CPF 例外エラー・メッセージを投げる場合があります。これは、エンド・ユーザーからは、実際はシステム・オペレーターからのエラー応答を待っている状態だとしても、 .Net アプリケーションがロックしているように見えてしまいます。HTTP サーバーは最終的にタイムアウトしますが、XMLSERVICE アプリが強制停止するのはあまり良いものではありません。コツコツとコーディングし、エラーはあるという前提で考えてください。リモート・プログラム呼び出しエラーを厳密に処理するのは .Net に限ったことではありません。PHP、Java、および Ruby など他の言語を使用してリモートでコマンドを呼び出す場合、同じ問題が発生することがあります。

技術情報02

Run CL Command ボタンを押した後の VB コードをご覧ください。クリックすると、XMLSERVICEi データ・アクセス・オブジェクトを使用して、いかに簡単に CL コマンドを呼び出すことができるかわかります。開いた FormMain designer ウィンドウをダブルクリックもしくは、FormMain.vb を右クリックして View Code を選択し、コード・ウィンドウを開きます。FormMain.vb を開いた後のコードを見ると、すべてのコード呼び出しに接頭部 XMLServiceiApi を付けるといううんざりする作業をする必要がないよう、XMLServiceiApi 名前空間 (Imports XMLServiceiApi) をインポートしていることがわかります。そしてこれはデスクトップ・アプリケーションであるため、_xmlService (Dim _xmlService As New XmlServicei) という変数を作成します。この変数はプログラム起動時に、設定済みの接続情報で初期化されます。この変数を使用すると、 Windows アプリケーションがアクティブな状態で、同じ接続を再利用することができます。Web アプリケーションの場合、XMLSERVICE 接続はステートレスのため、この情報はおそらく Web セッションに保存されているか、ページ呼び出しごとにインスタンス化されているでしょう。

Run CL Command コードにアクセスするには、Run CL Command ボタンをダブルクリックします。これにより ButtonCLCommand_Click サブルーチンが開きます。コード呼び出しがすべて Try/Catch でエラー処理されるようにしていることがわかると思います。これは、 RPG における MONMSG CL コマンドおよび MONITOR および END-MON 命令コードに似ています。また、アプリ構成から接続およびログインの情報をセットアップするのに、SetBaseURL、SetUserInfo、SetIpcInfo、および SetHttpTimeout がすべて呼び出されているのがわかると思います。通常、これらの設定はユーザーに入力してもらうようにします。次に、CL コマンドを実行する ExecuteCommand 関数への単一の呼び出しが確認できます。

CL コマンド呼び出しが完了すると、GetDataTableCommandResponse 関数が呼び出され、応答をグリッド内に表示する DataTable フォーマットで呼び出します。必要であれば、GetLastXmlResponse を呼び出して、XML 応答ストリング全体を、 XMLSERVICE から表示または処理します。XmlServiceiApi ラッパーを使用する場合、.Net アプリケーションから CL コマンドを呼び出すのはこれほどに簡単なのです。それでもまだ信じられないという場合は、XmlServicei.vb ソースを開いて、ExecuteCommand コードを見ることもできます。この関数は、 HTTP 経由で XMLSERVICE xmlcgi プログラムに通知するよう、 XML データ・ストリームを構成しており、XML 応答を処理することがわかります。.Net communications plumbing codeはほとんど要求されません。なぜならXMLSERVICEは高負荷なワークのほとんどをIBMi側でおこない、セキュアな呼び出しをするためにHTTPまたはHTTPS経由で呼び出すだけだからです。

技術情報03

次のステップへ

IBM i Access ODBC ドライバーは Linux や OS X など他のプラットフォームの .Net Core とは動作しないため、IBM i 向けの新しい .Net または .Net Core アプリケーションを開発してする場合、XMLSERVICE を使用することがさらにいっそう重要になります。

次号では、プログラム呼び出しおよびストアード・プロシージャー呼び出し機能についてお話します。最後に簡単ですが、XmlServiceiApi プロジェクトに対して私にフィードバックをくださるようお願いします。

大方のオープン・ソース・プロジェクトのことはよくわかりませんが、このプロジェクトが 2015 年初頭にリリースされて以降、フィードバックがほとんどありません。少なくともある一人の方がこのコードをフォークしC# に変換したのですが、フィードバックはもらえませんでした。XmlServiceiApi プロジェクトに貢献するお気持ちがあれば、直接私にフィードバックくだされば非常に助かります。そうすれば、Google 検索で見つけなくてもプロジェクトに組み込むことができますので。プロジェクト・フォークがいくつもあるよりは、メインの開発ラインが 1つある方が良いと思うのです。とはいえ、オープン・ソースの精神に則れば、コードは自由にいじることができるのですが。では、次号まで。

あわせて読みたい記事

PAGE TOP