- PR -

Javaからimpコマンドを実行した際の問題を解決したいです

1
投稿者投稿内容
一人チーム
会議室デビュー日: 2006/01/18
投稿数: 5
投稿日時: 2006-01-18 15:15
初めまして.
内容的にJavaも絡んでしまいますが,問題となっているのがimpコマンドなので,まずはこちらに投稿させていただきます.

javaで開発中のあるユーティリティにおいて,impコマンドを使ったテーブルのコピーをしようとしているのですが,以下の問題が発生しております.
1) impコマンドの実行をした後,コマンドが出力するメッセージが拾えない
2) impコマンドの実行をかけると,Javaではすぐに次の処理へ入ってしまう.テーブルのコピーはその裏で走っている状態となるので,テーブルのコピーが終わってしまう前にテーブルへのアクセスが発生するといった事態が発生している.

2)の問題を解決できればよいのですが,以下のようなコードではずっとimpコマンドが処理中になってしまい,コマンドからの戻り値を取得できませんでした.どのようにすればよいのでしょうか.
private void tableCopy(){
try {
Process process = Runtime.getRuntime().exec("imp system/manager@*** file=c:\\tmp.dmp tables=***** log=c:\\imp.log fromuser=**** touser=****");
process.waitFor();
int ret = process.exitValue();
System.out.println( ret );
} catch (Exception e) {
e.printStackTrace();
}
}

なお,開発及び実行に利用しているツールなどは以下のようになっております.
・OS:Windows XP Professional SP2
・Java:J2SDK 1.4.2_09 もしくは J2SDK 1.5.0_03
・IDE:eclipse 3.1.1
・Oracle:oracle 10g rel2(インストールしているのはクライアント用の内容のみ)

以上です.識者の方々のご意見,ご指摘をお待ちしております.
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2006-01-18 15:59
imp コマンドのみならず、標準出力および標準エラー出力に出力するコマンドを起動すると同様の問題が発生します。
ということで Java 会議室の方が相応しいと思いますが、ごく簡単に回答します。
細かい点については Java 会議室に移動してくだされば、詳しい方から回答があるかもしれませんし私が回答するかもしれません。

ということで本題。
Process オブジェクトにコマンドを実行させるのと同時に、Process#getOutputStream() および Process#getErrorStream() で得られる標準出力と標準エラー出力を読み出してあげてください。
これらのバッファが一杯になってしまい、そのせいでコマンド本体の実行が止まってしまっていると考えられます。

実行優先度を考慮したマルチスレッド処理が必要になりますが、それは Java 会議室のトピックですので、このスレッドでは以上としたいと思います。
一人チーム
会議室デビュー日: 2006/01/18
投稿数: 5
投稿日時: 2006-01-18 17:00
Gioさん,早速のご回答,ありがとうございました.
ご指摘いただいたとおり,Java会議室に同じ質問を投稿しました.
また,Java会議室ということで,もう少しコードで実施したことも追記しました.

以降は以下のスレッドで議論を継続したいと思います.
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27593&forum=12&0
一人チーム
会議室デビュー日: 2006/01/18
投稿数: 5
投稿日時: 2006-01-18 17:00
Gioさん,早速のご回答,ありがとうございました.
ご指摘いただいたとおり,Java会議室に同じ質問を投稿しました.
また,Java会議室ということで,もう少しコードで実施したことも追記しました.

以降は以下のスレッドで議論を継続したいと思います.
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27593&forum=12&0
1

スキルアップ/キャリアアップ(JOB@IT)