- PR -

Webアプリケーション内のstaticフィールド値をWebコンテナ外から変更したい

投稿者投稿内容
まあや
会議室デビュー日: 2005/07/28
投稿数: 6
投稿日時: 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 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-07-28 16:57
static 変数はクラスローダ毎に異なる値を保持できます。
ましてや別の JVM から参照や書き込みはできません。
Web アプリケーション内にそのフィールドを書き換えるサーブレットを作って外部からアクセスしてはいかがでしょうか。
まあや
会議室デビュー日: 2005/07/28
投稿数: 6
投稿日時: 2005-07-28 17:08
インギさん

回答ありがとうございます!そうですかぁ・・・やはり無理なのですね。。Servletから呼び出すという方法は私も考えたのですが、逆にバッチでサーブレットを起動?する方法というのはあるのでしょうか?正直、こういう切り替えをすること自体、初めてなものでぜんぜん想像がつきません・・・すみません。よろしかったら教えて下さい。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-07-28 17:19
通常外からアクセスするとなると必ず「通信」が必要となるので
送信側はもちろんのこと、受信側も必須になります。

インギさんのおっしゃられているパターンで言うならば、現状の
Webアプリケーションに新規のバッチ受け付け用servletを一つ
作り、送信側からそのservletにアクセスすることで実現可能の
ように思えます。

アクセス手段ですが、単純にhttp://***/servlet/***にアクセス
するだけでいいと思います。

送信側がプログラムであれば、URLConnectionか何かでアクセス
すればいいでしょうか。
# URLConnectionとか使ったことないので詳細は言えませんが
まあや
会議室デビュー日: 2005/07/28
投稿数: 6
投稿日時: 2005-07-28 17:28
(株)ぽち さん

回答ありがとうございます。やはり通信は必須ですか・・。サーブレットを作るのはよいのですが、わたしもURLConnectionというクラス?はつかったことがナイので、お勉強しないといけませんよね。もうちょっと、ガンバってみます。

(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-07-28 17:32
もしくはバッチを起動する時刻が決まっているなら
内部でTimerまわして定期起動するとかThread使って
定期起動するとかできなくもなさそうですが、要件
は「外から叩く」なんですよね?

であればやはり通信必須に思えます。
まあや
会議室デビュー日: 2005/07/28
投稿数: 6
投稿日時: 2005-07-28 17:46
(株)ぽち さん

正確にいうと、サービス時間外になる前にいくつか別の処理が走った後、最後にフラグ変更されるという順番なので、定期起動はまずいですね。バッチ自体は同じWebサーバ上にあって、やはりWebサーバのスケジューラから実行されるのですが、VMからしてみたらどちらにしても「外からたたく」ということに変わりはないので、やはり通信は必須ぽいです。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2005-07-28 17:57
「ある特定のファイルが存在していたらサービスしない」なんて実装もできるかもしれませんね。これで済めば、バッチの中ではファイルを作ったり消したりするだけ。

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