Naoki Kurosawa
naoki_kuros****@ybb*****
2003年 2月 26日 (水) 00:02:42 JST
小島さん 黒澤です。お疲れ様です。 KH> 小島です。いつもご丁寧に教えていただきありがとうございます。 そういわれますと、私も一生懸命に書いたのが報われた気持ちになり、 うれしいです。 KH> > mysql> select * from check_errors; KH> > とやった結果を教えてください。 KH> KH> Empty set (0.00 sec) KH> となり中身は空っぽです。 うへ。そうですか。 Robotチェックエラー情報をDBに書き込めていませんね。バグです。 もうちょっとバグの内容を調査する必要がありますが、 ちょっと私、今週と来週はあんまり時間が取れそうにないので、 ペンディングにさせてください。 KH> その時のJBossのログですが KH> KH> 09:57:10,031 INFO [RobotCheckerBean] Robot checking start. requestId:3 KH> 09:57:24,401 INFO [RobotManagerBean] New robot [cx.MinixHT_1.33.jar] comming! KH> 09:57:24,430 WARN [LocalTxConnectionManager$LocalConnectionEventListener] prepa KH> re called on a local tx. You are not getting the semantics you expect! KH> となり警告を受けます。[RobotCheckerBean] は通っているようです。 これはちょっと難しいところで申し訳ないんですが、 EJBによるDBアクセスとJMSのXA連携というのをやっています。 これは現在のシステム開発でもあまりやらない #つまり、あまり実績がない システム構築方法で、 ■RobotManagerBeanはロボット登録を受け付けると、 ロボット登録情報をDBに格納し、メッセージキューに登録リクエストが あったということをポスト ■RobotCheckerBeanはメッセージキューからメッセージを取り出して ロボットチェックを行い、チェック結果をDBに格納し、メッセージキューから ロボット登録リクエストを削除 ということをやっています。 ポイントはDBアクセスとメッセージキューのアクセスが トランザクション連携するところで、ここがXA連携と言っているところです。 普通のシステム構築ではDBとメッセージキューが連携する、 というのはあまりやらないので、登場人物はたいていDBのみになります。 DBのみの場合、 1.トランザクションの開始 2.なにかしらのロジック実行とDB更新処理 3.トランザクションのコミット という処理の流れになります。 2番のロジック実行やDB更新処理が失敗すると、 3番はトランザクションのロールバック処理になり、 DBの更新処理をすべてなかったことにする、というようなことになりますが、 DBとメッセージキューがトランザクション連携するような場合、 1.トランザクションの開始 2.何かしらのロジック実行とDB更新処理と、 メッセージキューへのメッセージのポストやメッセージの取り出し 3.トランザクションのコミット という流れになります。 2番のロジック実行などが失敗した場合、 DBの更新処理をなかったことにするとともに、 メッセージキューへのメッセージのポストやメッセージの取り出しも なかったことにする、ということになります。 DBのみの場合のトランザクション処理は、 1つのトランザクションに絡むのはDBのみなので 何か失敗したらDBだけをロールバックすればいいし、 成功したらDBだけをコミットすればいいのに対し、 DBとメッセージキューが絡む場合、 トランザクションに絡むのはDBとメッセージキューの2つなので、 何か失敗したらDBとメッセージキューをどちらも ロールバックしなければならないし、 成功したらどちらもコミットしなければなりません。 ここで出てくるのがXAという仕組みで、 1つのトランザクションに絡む、DBやメッセージキューの コミットとロールバックを管理してくれるものです。 失敗したとなったら関係のあるすべてのDB操作やメッセージキュー操作を ロールバックしたり、 成功したら関係のあるすべてのDB操作やメッセージキュー操作をコミット してくれます。 システム構築の事例であまりにもこのXAを使ったものがないので、 #正確に言えば、Javaのアプリケーションサーバを使って、 #XAを利用した事例がない 本当に使えるのかな?という疑問が私にはありまして、 試しに使ってみたのが今回のシステムです。 その結果、 ・XAの動作が正常でなかった(これは設定ミスが原因かもしれません) ・MySQLのXA機能が日本語をサポートしていなかった ということがわかり、 現状XA連携機能をOFFにしています。 OFFにした結果、XA連携しなければならないところでXA機能がOFFなので 以上のような警告がでているんです。 何でうまくいかないかというと、みんながあんまり使わないので、 ・デバッグがあまり進んでいない ・機能の実装も進んでいない(ので、多国後対応も進んでいない) のかな、と思っています。 どうせオープンソースなので、あとで自分で直しちゃえばいいよね、 と思って、現状放置しています。 ということなので、現状はこの警告は無視してかまいません。 KH> また KH> 09:57:24,683 INFO [RobotCheckerBean] Robot checking start. requestId:4 KH> 09:57:24,693 INFO [RobotCheckerBean] Exception occured in zip handling. request KH> Id:4 KH> java.util.zip.ZipException: error in opening zip file KH> at java.util.zip.ZipFile.open(Native Method) KH> at java.util.zip.ZipFile.<init>(ZipFile.java:112) KH> at java.util.zip.ZipFile.<init>(ZipFile.java:127) KH> at rumblejp.ejb.message.RobotCheckerBean.isValidRobot(RobotCheckerBean.j KH> ava:226) KH> (後略) KH> といったエラーがたまに出ます。こちらはロボットが登録されません。 これは問題ですね。 KH> *[RobotManagerBean] KH> * 1. check_robotsテーブルにロボット登録リクエストを保存します。 KH> テーブルには正しく書かれています。 KH> * 2.このときのrequest_idをファイル名として一時ディレクトリにロボットファイルを保存します。 KH> この一時ディレクトリはどこのことでしょうか? KH> 多分この辺りに問題があるのではないかと思います。 setupツールは、一時ディレクトリを<JBOSS_HOME>/checkrobots という名前で作成します。 このディレクトリのパーミションは、JBossを起動するアカウントで 読み書きできるようになっていますでしょうか? そもそもこのディレクトリが存在しますか? ちょっとご確認お願いします。 -- Naoki Kurosawa <naoki_kuros****@ybb*****>