椎間板ヘルニア
火曜日, 6 月 16th, 2009腰痛がひどいので病院で診てもらってきた。
レントゲン写真にしっかりと異常があらわれていた。
椎間板ヘルニア
なんてこった・・・
まだ大丈夫なのか?とりあえず薬で様子をみるらしい。
だめなら通院して治療とのこと・・・
やりたいことがいっぱいあるのに。。。
腰痛がひどいので病院で診てもらってきた。
レントゲン写真にしっかりと異常があらわれていた。
椎間板ヘルニア
なんてこった・・・
まだ大丈夫なのか?とりあえず薬で様子をみるらしい。
だめなら通院して治療とのこと・・・
やりたいことがいっぱいあるのに。。。
急に昨日から腰が痛くなった。
凄く重く痛い。
椅子に座ってるだけでも痛くなる。
まいった(><)
よりによって今日は日曜で病院はお休みだ。。。。。
javax.ejb.ConcurrencyManagementType.CONTAINER あるいは javax.ejb.ConcurrencyManagementType.BEAN を使用すればいいようだ。
@ConcurrencyManagement(CONTAINER)
@Singleton
public class ExampleSingletonBean {
private String state;
@Lock(READ)
public String getState() {
return state;
}
@Lock(WRITE)
public void setState(String newState) {
state = newState;
}
}
@ConcurrencyManagement(CONTAINER) アノテーションによってコンテナによって並行処理を管理する。
ちなみにデフォルトで @ConcurrencyManagement(CONTAINER) が設定されるようなのです。
これを利用することによって、@Lock(READ) と @Lock(WRITE) アノテーションによって排他制御を可能とする。
タイムアウトの設定方法
@AccessTimeout アノテーションによって可能となります。
下記コードでは Singleton Session Bean のデフォルトタイムアウトの設定時間は 120000 ミリ秒となってます。
doTediousOperation メソッドのタイムアウト設定時間は Singleton Session Bean のデフォルトタイムアウト時間より優先され 360000 ミリ秒となります。
@Singleton
@AccessTimeout(value=120000)
public class StatusSingletonBean {
private String status;
@Lock(WRITE)
public void setStatus(String new Status) {
status = newStatus;
}
@Lock(WRITE)
@AccessTimeout(value=360000)
public void doTediousOperation() {
...
}
}
ちなみに TimeUnit.SECONDS 定数を使えばこのように解りやすくなります。
@Singleton
@AccessTimeout(value=60, timeUnit=SECONDS)
public class StatusSingletonBean { ... }
@ConcurrencyManagement(BEAN) による並行処理は全てのビジネスメソッド及びタイムアウトメソッドの並行処理を可能とします。
ただし、それらは開発者によりすべてのクライアントへの同期化を保証する責任があります。
Java の並行処理技術を駆使して高レベルなプログラミング技術が必要とされるようです。
@ConcurrencyManagement(BEAN)
@Singleton
public class AnotherSingletonBean { ... }
Java EE 6 Tutorial の Singleton Session Bean の並行処理をざっと目を通してる最中ですがなかなか凝ってますね。
最後にこの内容は英語が駄目な素人が勝手に解釈したメモ書き程度のものですから詳しく知りたい方は本家のチュートリアルをご参照くださいませ。
The Java EE 6 Tutorial より Singleton Session Bean の初期化にはこんなのもありだ。
@Singleton
public class PrimaryBean { ... }
SecondaryBean depends on PrimaryBean:
@Singleton
@DependsOn("PrimaryBean")
public class SecondaryBean { ... }
これで EJB コンテナが SecondaryBean の前に PrimaryBean を初期化することを保証するらしい。
φ(..)メモメモ
エアコンが壊れました。
長く快調に動いていたのですがいきなり冷えなくなるし、水は漏れてくるし、かき氷のようなものまで降ってきます。
修理をするか買い換えるか検討中です。
エコポイントのつく製品は何故か割高になってますね。
それよりもエコポイントって何につかえるんだろう?
エコポイントの付かない製品だとお値段はちょっと安いみたい。
都会ではエコポイントの付いてる製品でも安いんでしょうけど田舎では上手くバランスとってます。
どうでもいいけど・・・今週の夜勤は地獄だぁ!
さて、今日一日頑張って乗り切ろう。 って暑くて眠れるかなぁ。。。
睡眠不足な毎日が続きます。orz
昨日のつづきです。
@Schedule(dayOfMonth = “1″, hour = “7″, minute = “30″)
public void hoge() {
// …
}
とすると、毎月午前7 時 30 分に hoge() メソッドが実行される。
@Schedules({@Schedule(hour = “5″),@Schedule(hour = “15″, dayOfWeek = “Wed”)})
public void hogehoge() {
// …
}
は二つのタイマーを持つ。
一つは、毎日午前 5 時に、もう一つは毎週水曜日の午後 3 時に hogehoge() メソッドを実行させます。
@Schedule アノテーションによってカレンダーを基本にタイマーを設定しているようです。
これらの機能はデフォルトでサーバーがシャットダウンし、再起動しても実行されるようです。
オプションで無効にするには下記のように persistent = false を設定します。
@Schedule(minute = “*/15″, hour = “*”, persistent = false)
public void hogehogehoge() {
// …
}
これで 15 分毎に hogehogehoge() メソッドを実行します。
ただし、サーバーがダウンし、再起動した場合は実行されません。
ちなみに stateful beans ではこのタイマーサービスを使えない(使わない方がいい)ようです。
@Schedule の API ドキュメント見たけど Optional Element Summary の設定値のなかに * ってあるけど意味が解らない。
@Schedule(second=”*/3″, minute=”*”, hour=”*”, info=”@Schedule の * ってなんだ?”)
上記のコードの場合 3 秒ごとにスケジュールされていると思う。
info の項目はただの情報だとしても時間、分、秒の設定が良く解らない。
minute=”*” と hour=”*” は設定無しの無限大というところでしょうか?
ちなみに時間、分、秒のデフォルト設定値は 0 となってました。
second=”3″ じゃなくて何故 second=”*/3″ とするんだろう?
根本的に考え方を間違っているのだろうか?
追記
second=”*/3″ の*はワイルドカードと呼ばれるものらしい。
で、second=”30/10″ とすれば、30 , 40 , 50 秒と実行されるようだ。
つまり、 / の前がスタート時間で後ろがインターバル時間ってこと?かも(^^;
Java EE 6 良く解らないけど動かしてみました。
コードはこのようになってます。
@Startup アノテーションによって @PostConstruct アノテーションの付加された startup() メソッドが Web アプリケーションを配備完了後にすぐに呼ばれるようだ。
配備取り消しの場合は @PreDestroy アノテーションの付加された shutdown() メソッドが呼ばれるみたい。
@Startup アノテーションがなければ @PostConstruct アノテーションの付加された startup() メソッドと @PreDestroy アノテーションの付加された shutdown() メソッドは呼ばれない。
とりあえず @Startup アノテーションによってこのように動作するようだ。
@Startup アノテーションによって Web アプリケーションの準備と後始末をすませようとしているような気がする。
Your First Cup: An Introduction to the Java EE Platform Chapter 3 を試してみました。
製品バージョン: NetBeans IDE 6.7 RC2 (Build 200906042131)
Java: 1.6.0_14; Java HotSpot(TM) 64-Bit Server VM 14.0-b16
システム: amd64 上で動作する Windows Vista バージョン 6.0; MS932; ja_JP (nb)
ユーザーディレクトリ: C:\Users\Yucchi\.netbeans\6.7rc2
上記の環境にて GlassFish V3 Preview にてさくさくっとチュートリアルの指示にしたがってあっさりとできてしまいました。
NetBeans 6.7 RC2 で GlassFish V3 Preview を使う方法はこちらにあります。
チュートリアルを進めていくと NetBeans 6.7 ではとりあえず Java EE 6 が試せますよってのが解る。
Java EE 6 対応の GlassFish V3 Preview を選択しても Java EE 6 のバージョンが選べなかったりします。
でも、Java EE 5 で Java EE 6 も対応してます。
細かいところでは GlassFish V3 Preview 側にライブラリがあるので NetBeans が親切に用意してくれるライブラリの中には不要なものがあります。
下図の二つのライブラリも必要ありません。
最初に JAX-RS RESTful web service を利用した Web アプリケーションを作ります。
作ったプログラムを動かすとデューク君の年齢が表示されます。
チュートリアルを進めていくとまた不要なものに出会います。
指示に従い不要なものは削除していきます。
また、Java EE 6 のバージョン仕様に従い各ファイルを編集しなくてはいけないようです。
NetBeans 6.7 がデフォルトで作成する Facelets のバージョンは 1.2 なので faces-config.xml をバージョン 2.0 の仕様に手動で編集しなければなりません。
web.xml ファイルにも必要のないエレメントがあるので編集、削除します。
Facelets Simple File にいたってはほぼ手動編集作業となります。
ちょっと面倒なことをしなければいけないけど Java EE 6 正式版がリリースされれば NetBeans が完全対応してくれるのに期待しましょう。
チュートリアルの指示にしたがってプログラムを完成させれば下図のように動作します。
私のようなうっかり者は[ Back ] ボタンを押すとエラーを表示させてしまいます。
この原因はこのインポートを誤ったからです。orz
このチュートリアルを含んだドキュメントは英語なので詳しい内容はわかりませんが無いよりはいいですね。
久しぶりにサーバーサイドジャバに触れてみたって感じです。
もう、すっかり忘れてしまった(^^;
そう言えば、昔は「サーバーサイドジャバ」とか言って何やらカッコイイと思ったけど今では死語なんだろうか?
JavaOne で何かしらの新技術がお披露目されるだろうと期待している私ですが待ちきれずに NetBeans で Java EE 6 って動くのか調べてみました。
といってもネットでググって調べただけです。
結果は・・・ ありました!
下記サイトです。
英語が駄目なのでだいたいこんな感じじゃないかと真似てみました。
一部コードは簡略化してありますが問題ないはずだと思います。
NetBeans 6.7 開発版に GlassFish V3 Preview を追加して Java EE 6 を試してみます。
まず GlassFish V3 Preview の zip 版をダウンロードしてインストールします。
NetBeans のサーバーに GlassFish V3 Preview を追加できるように GlassFish v3 Enabler というプラグインをインストールします。
インストールが完了したら [ サービス ] ウィンドウでサーバーを追加します。
GlassFish v3 が追加可能になってますので画面の指示にしたがって追加します。
GlassFish v3 が追加され利用可能となりました。
Java EE 6 の機能の一部ですが早速試してみます。
新規プロジェクトを作成します。
[ Java Web ] カテゴリを選択し、プロジェクトに [ Web アプリケーション ] を選び [ 次へ> ] ボタンをクリックします。
プロジェクトの設定を行います。
とりあえずここはデフォルト設定としました。
サーバーには GlassFish v3 を設定します。
Java EE バージョンには本当は Java EE 6 を選びたいところですが無いので Java EE 5 をドロップダウンリストから選択します。
フレームワークは利用しないので [ 完了 ] ボタンを押して終了します。
プロジェクトに POJO ベースの EJB を追加します。
[ 新規 ] → [ Java クラス... ] を選択します。
名前と場所を設定します。
HelloEJB クラスが自動生成されます。
このクラスに @Stateless アノテーションをつけます。
エラー表示が出てヒントが出ますのでヒントの指示どおり javax.ejb.Stateless をインポートします。
sayHello メソッドを作ります。
これで EJB の作成は終わりです。
次に、この EJB を呼び出すサーブレットを作成します。
[ 新規 ] → [ Java クラス... ] を選択します。
名前と場所の設定を下図のようにします。
自動生成された HelloServlet クラスに @WebServlet をつけます。
URL パターンも忘れずにつけます。
javax.servlet.annotation.WebServlet をインポートします。
HttpServlet を継承します。
EJB をインジェクトします。
ヒントのとおりインポートを修正してエラーを修正します。
doGet メソッドをオーバーライドします。
下記コードのように doGet メソッドを編集します。
これで単純にサーブレットから EJB を呼び出して http://localhost:8080/WebApplication1/hello のアドレスに ” こんにちわ(^^) ゆっち ” と表示されればOKです。
おっと、Java EE 6 では sun-web.xml ファイルと web.xml が不要となるんでしたね。
削除してしまいましょう。
なんか寂しい気がするけど気にしない。
それではプロジェクトを実行し、http://localhost:8080/WebApplication1/hello にアクセスしてみましょう。
動きましたね(^^)
Java EE 6 ってシンプルでいいですね。
アノテーションでなんでもありのようになったような気がしないでもないが大歓迎です(^^)