ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのstaticにすべきか・・・

  • mixiチェック
  • このエントリーをはてなブックマークに追加
staticについて少し調べたのですが、いまひとつ理解できない為質問させて頂きます。
シェルからそのプロセスIDを引数に起動されるJAVAのバッチ処理のアプリケーションがあります。
1サーバ上で複数プロセスから起動され、1つのログファイルに書くという仕様の為
ログファイル内でそのログが、どのプロセスのものかも書き込み、判断する為です。

現段階では、、
ログ出力のクラスに書き込みを行うメソッド(非static)があります。
そしてログ出力のクラスに起動の引数のプロセスIDをstaticなクラス変数に持たせます。
(各メソッドからログ出力メソッドを呼ぶ度にインスタンス生成するのでstaticにしています)
心配なのは、このログ出力のクラスに持たせたプロセスIDのstaticな変数は、
新たなプロセスが起動される度に書き換えられるのでは??という事です。
staticはクラスに関連付くという事はわかるのですが、
それはプロセスが同じ場合(1回のmainの中での話)なのでしょうか?
それとも、上記の現段階の処理では新しいプロセスから起動された時にも書き換えられてしますのでしょうか?
説明不足ありましたら補足致します。ご教授宜しくお願い致します。

コメント(27)


> 1サーバ上で複数プロセスから起動され、

サーバって、サービスプロセスじゃなくてサーバーマシンのことですよね?

> シェルからそのプロセスIDを引数に起動されるJAVAのバッチ処理のアプリケーションがあります。

staticと言っても起動されたJavaVMの中でのstaticなので、サーバマシンの別々のメモリに収まるのでは。
そうでないと、何人もがログインして使う開発マシンとか困っちゃいます。
Cappuccinoさんありがとうございます!

>サーバって、サービスプロセスじゃなくてサーバーマシンのことですよね?
そうです。サーバマシンの事です。

>起動されたJavaVMの中でのstaticなので、サーバマシンの別々のメモリに収まるのでは
1サーバプロセスに付き1JavaVMが起動され、その中でstaticという事ですね?

では、staticの同時実行の危険性というのは
1JavaVMの中でスレッドによる同時実行時に考えるべき問題で、
今回の私の状況では考慮する必要はないと考えてよろしいのでしょうか?
staticの同時実行の危険性って、何が危ないんですか?
2: NJOROGEさん

多分。何せ言っていることが推測でしかわからないもので。
お仕事でしたら、知らない人の断定だけでなくて、実際に動作確認した方がいいと思いますけど。
プロセスIDをThreadLocalに突っ込んでstaticメソッドで書き出せばいいのでは?具体的にわからないんでなんともいえないですが。

static変数にする理由が分からないんですが、特に必要がないなら、
ログのメソッドを呼ぶ度にプロセスIDを渡すか、一つのログクラスの
インスタンスを使いまわした方が良いと思います。
皆様いろいろなご意見ありがとうございました。
大変参考になり、勉強になりました。
> シェルからそのプロセスIDを引数に起動されるJAVAのバッチ処理のアプリケーション

シェルのプロセスIDをJavaプログラムに引数で渡す理由が読み取れませんでした。もしかして、Javaプログラム内の処理で、ログに、シェルのプロセスIDを吐きたいってことでしょうか。
そうだとしたら、そのメリットを是非とも教えてもらいたいです。
実際のところシェルのプロセスIDではないのです。
シェルから渡される引数はファイル名で、
そのファイルの中にある一意なIDです。
(紛らわしいことしてすいません。)

目的はどのプロセスも同じ1日の間は同じログファイルに
書き込む為、複数プロセス同時に実行された時に
プロセスごとに一意なIDをログに記入する事によって
どのプロセスで問題が起こったのかを追う為です。
なんか変な事言ってますっけ?
問題はログファイルは1つである事で、
複数のプロセスが同じファイルに同じタイミングで
書き込む事があり、それを判別したいという事です。
何か他にいい方法はありますでしょうか?
> 複数のプロセスが同じファイルに同じタイミングで
> 書き込む事があり

ここ、自分で作りこんだんですか?
まともに動いてますか?
>同じVMで並行処理したら?
仕様上僕の判断ではできないので
>毎日ログファイルをマージすれば?
こちらは提案してみたいと思います。
ありがとうございます。

>ここ、自分で作りこんだんですか?
まだ設計の段階で、開発サーバでの同時起動でのテストは
行っていません。

>まともに動いてますか?
動かなそうですか?
現在、排他制御など考えていませんでした・・
そうですよね。他プロセスが書き込みを行っているかの
判断があって、していなければ書き込むという処理が必要
という事ですよね?
> 実際のところシェルのプロセスIDではないのです。

もしかして、プロセスIDはシェルプログラムIDという意味で、プロセスはシェルプログラムという意味ですかね。そういう解釈だと辻褄が通るんで。つか、シェルのPID(OSの方の)はログに出力する意味があんまりないです。

Javaからログに書き込む時、排他とか考えたく無い時はLog4Jというツールを使えばよいです。

これは学校の課題というよりお仕事の話ですかね。もし学校の課題なら課題文を出してもらった方が答えやすいです。

あと、プログラムが長くないならそれも書いてしまって良いと思います。その方が回答し易いです。
プロセスIDっていうのは、きっとジョブスケ上のIDか名前かなんでしょうね。

自分で使ったことは無いですが、Log4Jからsyslogに出すのが一般的なんでしょうか?
> 実際のところシェルのプロセスIDではないのです。

プロセスを見分けるために独自で発行しているID。ってことでいいのかな。

14: chunさん

> つか、シェルのPID(OSの方の)はログに出力する意味があんまりないです。
PIDがないと強制終了が出来ないのでは。

> Javaからログに書き込む時、排他とか考えたく無い時はLog4Jというツールを使えばよいです。

Log4jって別のJavaVMでもファイルロックしてるの?
同じJavaVMの別threadなら排他してると思うけど。
> Log4jって別のJavaVMでもファイルロックしてるの?

FileAppenderはしてないです。
>プロセスを見分けるために独自で発行しているID。
そうです!うまく表現できず申し訳ありませんでした。

ログファイルは<日付>.logなのですべてのプロセスから
書き込まれ、
<プロセスA> main start
<プロセスB> main start
<プロセスB> ○○ start
<プロセスA> ○○ start
と入り混じるようになり、それを見分ける為のものです。

ロックについても調べ、考えたのですが、
「あるプロセスの書込み内容を読み込み、それをもとに
 処理や書込みを行う」ものでしたらロックが必要になる
と思いますが、今回ファイルに書き出すものはログなので
ロックは必要ないのではないかと思っています。

syslogとか通信クライアントのAppenderなら新しく作らなくていいので楽ですね。
DailyRollingFileAppenderあたりが一般的だと思いますが。
単に私がweb系だからかな。
> PIDがないと強制終了が出来ないのでは。

保守担当者がログに記録されているPIDをみて、そのプロセスをKILLするケースってあるんでしょうか?まぁ、無いとはいえないですが、その場合はプログラムIDで代用できません?

> Log4jって別のJavaVMでもファイルロックしてるの?
気にしたことないです。
既存のアペンダに無ければ自分で実装するのでしょうが、nioの知識があればそんなに工数はかからないと思います。
20: chunさん

> 保守担当者がログに記録されているPIDをみて、そのプロセスをKILLするケースってあるんでしょうか?まぁ、無いとはいえないですが、その場合はプログラムIDで代用できません?

プロセスに異常に時間がかかっている場合とか。無限ループしてる場合とか。とにかく私の携わったシステムでは要求にありました。
プログラムIDって何ですか?

> Javaからログに書き込む時、排他とか考えたく無い時はLog4Jというツールを使えばよいです。

では、複数のJavaVMからログに書き込む時は気にする必要があるということですね。
log4jの場合でもAppenderの選択、自作を含め。
> プロセスに異常に時間がかかっている場合とか。無限ループしてる場合とか。とにかく私の携わったシステムでは要求にありました。

それはシェルプログラムファイル名、あるいはジョブ名がわかればよいのではないですか。別プロセス同一シェルが起動したJavaプログラムが吐いたログをみて、それぞれのプロセスを識別しなければいけないというケースが想定出来ません。具体的に教えてもらえませんか。
ちなみに、9で説明しているように文脈でのプロセスIDはファイル名で一意になるIDです。誤読されているようなので。

> では、複数のJavaVMからログに書き込む時は気にする必要があるということですね。

別VMでも同一VMでも排他は気にする必要があります。
同一VMでは既存のAppenderがやってくれるので設計の必要はありません。別VMで排他してくれるAppenderがあるかはわかりません。
psで見ても、Javaアプリはjavaとしか出てこないので、PIDが欲しい気持ちはちょっとわかる。

で、やったことないので質問なんですが、
シェルスクリプトからjavaを起動したとして、起動元のシェルをkillしたらjavaもちゃんと死んでくれますよね?
22: chunさん

特定のプロセスに異常に時間がかかっている場合とか。
同一のプログラムでも特定のプロセスだけ異常という状況にはならないのでしょうか。
これは14からのPIDの話なので9は関係ないかと。
14> シェルのPID(OSの方の)はログに出力する意味があんまりないです。

23: マイさん
やってみたら、私の環境では死んでくれませんでした。
何のバージョンを書けばいいんだろ…。
sysvinit 2.86.ds1-38
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)

$ ./boot & #無限ループのjavaを起動するsh
[1] 17739
$ pstree -p|grep boot
|-gnome-terminal(3325)-+-bash(3347)---boot(17739)---java(17740)-+-{java}(17741)
$ kill 17739
$ pstree -p|grep 17740
|-java(17740)-+-{java}(17741)
ありがとうございました。

pstreeなんてコマンドあったんですね。
知りませんでした(恥)
> 特定のプロセスに異常に時間がかかっている場合とか。
> 同一のプログラムでも特定のプロセスだけ異常という状況にはならないのでしょうか。

断っておきますがPIDを記録することを否定してるわけではないですよ。「PIDを記録しなければならない」のはどういうケースかがわからないだけです。

同一プログラムで正常プロセスと異常プロセスが混在し、異常プロセスだけをkillしなければならないケースが実際にあるのか。あるとすればどういうケースなのか。その辺りを教えてほしいです。
26: chunさん

データによって処理が異なる場合。
javaではif文等を使用すると分岐ができるのです。

問題のプロセスをkillして、データを修正してマニュアルで再実行します。

ログインすると、残り2件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング