- - PR -
Webアプリケーション内のstaticフィールド値をWebコンテナ外から変更したい
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-07-28 16:49
はじめての書き込みになります。
まあや と申します。宜しくお願いします。m(_ _)m まず、わたしが今開発しているWebアプリケーションでは、 下記のようなstaticフィールドを、サービス時間外のチェック フラグとして使い、処理を切り替えているコードがあるの ですが、これ自体はちゃんと動いているようです。 === staticフィールドを持つクラス ======================== public class GOcmnOnlineStatus { public static boolean overtime; public static final void setOvertime(boolean overtime) { GOcmnOnlineStatus.overtime = overtime; } public static final boolean isOvertime() { return overtime; } } ====================================================== === フラグを使っているクラスの一部 ==================== public class NoticeOvertime public Object invoke() throws Throwable { // 現在の時刻がサービス時間内であるかどうか調べる if(GOcmnOnlineStatus.overtime){ // 時間外であった場合 ・・・・・ }else{ // 時間内であった場合 ・・・・・ } } } ====================================================== ところが、このフラグを外部から変更したいというところ で行き詰ってしまいました。運用方法としては、サービスの 終了時間になったら、バッチでこのstaticフィールドを 持つクラスにアクセスしてtrueをセットするというすごく単純 な処理なはずなのですが、どうもうまくいきません。 方法としては、下記のようなクラスを用意して、これをjavaコマンド を使って起動しているのですが、コマンド自体は正常に動作し、最後の system.outで表示される値もちゃんとtrueになっているように見える のに、Webアプリケーション側では「時間外」のほうの処理が実行され ません。要するに、値が変わっていないようなのです。 === ステータスを変更するクラス =========================== public class GOcmnOnlineStatusChange { public static void main(String args[]){ // staticメソッドでフラグを設定値に切り替える GOcmnOnlineStatus.setOvertime = true; System.out.println(GOcmnOnlineStatus.isOvertime); } } ======================================================== javaコマンドの仕様や、static修飾子の仕様など、昨日から丸2日間 Googleや書籍などをつかって調べたのですが(もちろんココの過去ログ も調べました)、調べれば調べるほど、わたしのコードの書き方が おかしいのか、そもそもWebコンテナの中にいるものを外部から変更する ことなどできるわけがないのか、やろうとしていることが根本的におか しいのか、もう訳がわからなくなってしまいました。。 動きとしては、明らかにバッチ側とWebアプリケーション側で、違う クラスを参照・変更しているようにしか見えません。 これが出来ないとなると、時間外の判別と時間外のときの処理は別の 方法で組み込まないといけないので、お客様への説明をしてから仕様 変更を。。。というちょっと面倒なことになりそうなので、できる ことならこのままの仕様でいきたいのですが・・・。 識者の皆様、どうかお知恵をお貸し下さい。 宜しくお願い致します。 ※2005/07/28追加 環境は次の通りです。 Tomcat4.1.31、J2SDK1.4.2_06、Struts1.1、Seasar2.2.10 開発IDEはEclipse3.0.1です。 [ メッセージ編集済み 編集者: まあや 編集日時 2005-07-28 17:01 ] |
|
投稿日時: 2005-07-28 16:57
static 変数はクラスローダ毎に異なる値を保持できます。
ましてや別の JVM から参照や書き込みはできません。 Web アプリケーション内にそのフィールドを書き換えるサーブレットを作って外部からアクセスしてはいかがでしょうか。 |
|
投稿日時: 2005-07-28 17:08
インギさん
回答ありがとうございます!そうですかぁ・・・やはり無理なのですね。。Servletから呼び出すという方法は私も考えたのですが、逆にバッチでサーブレットを起動?する方法というのはあるのでしょうか?正直、こういう切り替えをすること自体、初めてなものでぜんぜん想像がつきません・・・すみません。よろしかったら教えて下さい。 |
|
投稿日時: 2005-07-28 17:19
通常外からアクセスするとなると必ず「通信」が必要となるので
送信側はもちろんのこと、受信側も必須になります。 インギさんのおっしゃられているパターンで言うならば、現状の Webアプリケーションに新規のバッチ受け付け用servletを一つ 作り、送信側からそのservletにアクセスすることで実現可能の ように思えます。 アクセス手段ですが、単純にhttp://***/servlet/***にアクセス するだけでいいと思います。 送信側がプログラムであれば、URLConnectionか何かでアクセス すればいいでしょうか。 # URLConnectionとか使ったことないので詳細は言えませんが |
|
投稿日時: 2005-07-28 17:28
(株)ぽち さん
回答ありがとうございます。やはり通信は必須ですか・・。サーブレットを作るのはよいのですが、わたしもURLConnectionというクラス?はつかったことがナイので、お勉強しないといけませんよね。もうちょっと、ガンバってみます。 |
|
投稿日時: 2005-07-28 17:32
もしくはバッチを起動する時刻が決まっているなら
内部でTimerまわして定期起動するとかThread使って 定期起動するとかできなくもなさそうですが、要件 は「外から叩く」なんですよね? であればやはり通信必須に思えます。 |
|
投稿日時: 2005-07-28 17:46
(株)ぽち さん
正確にいうと、サービス時間外になる前にいくつか別の処理が走った後、最後にフラグ変更されるという順番なので、定期起動はまずいですね。バッチ自体は同じWebサーバ上にあって、やはりWebサーバのスケジューラから実行されるのですが、VMからしてみたらどちらにしても「外からたたく」ということに変わりはないので、やはり通信は必須ぽいです。 |
|
投稿日時: 2005-07-28 17:57
「ある特定のファイルが存在していたらサービスしない」なんて実装もできるかもしれませんね。これで済めば、バッチの中ではファイルを作ったり消したりするだけ。
|