昼間のメモ

お仕事をしているときに、あっ!と思いついたことはすぐに忘れてしまいますので、とにかく残すためのメモです。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

JSR208: Java Business Integration (JBI)

2007-08-10 09:28:10 | Weblog

JBIとは

JBIは、JavaにおけるSOA(ESB)実装を実現するためにJCPで制定された仕様です。

JBIとServlet APIは似ている部分もあります。

まず、JBIとServlet APIは共に仕様であり、それらの実装はApache ServiceMixとApache Tomcatであったりします。

※TomcatはRI(参照実装)ですが、ServiceMixはRIではありません。

・・・

図1はJBIの構成図ですが、JBI EnvironmentはJBIコンテナであることが分かります。各JBI ComponentはJBI SPI(Service Provider Interface)のインターフェイスを実装することでJBIコンテナにプラグインできます。

これは、JBIコンテナをServletコンテナに、JBI ComponentをServlet(コンポーネント)に、それぞれ置き換えてみればどんなものか大体想像が付きます。

・・・

図2はコンポーネントがメッセージを送受信する際のシーケンス図です。左側のComponent Aから右側のComponent Bへメッセージを送っています。

Component AはJBIコンテナに対してsendメソッドを呼び、メッセージを送信します。メソッドは非同期と同期と2種類あり、sendは非同期、sendSync は同期となります。非同期の場合、Javaのメソッド呼び出しと異なり、JBIのキューにメッセージが追加されればすぐに処理は戻ってきます。

一方、Component Bはacceptメソッドを呼び、自分宛のメッセージを受信します。上の図ではsendの後にacceptを呼んでいますが、実際にはComponent BをJBIに登録する際にacceptメソッドを呼び、メッセージが届くまでブロックされている状態となります。

・・・

図4は、BC(Binding Component)とSE(Service Engine)とNMR(Normalized Message Router)等の構成図です。

まず、コンポーネントにはBCとSEの2種類あり、BCは外部とのインターフェイスを持ったもの(例えばHTTPリスナーやメール送信)、SEは単体で実現されるビジネスロジックとなります。真ん中のNMRが一般的にESB(Enterprise Service Bus)と呼ばれる正規化されたメッセージが流れる中核部分です。

JBI内のコンポーネントが動くトリガーとして、タイマーのようなSEコンポーネントから開始される場合と、外部アプリ(External Service Consumer)から開始される場合とあります。

また、JBI内のコンポーネントだけで完結する場合と、外部アプリ(External Service Provider)も巻き込んで処理を返す場合とあります。この外部アプリがレガシーアプリであったり、他のJBIコンテナのConsumerとなる場合もあります。

・・・

図22はデプロイするモジュールの構成図です。

コンポーネントはSU(Service Unit)単位でアーカイブされます。これはWebアプリのアーカイブ(WARファイル)と同じ位置づけです。

さらに複数のコンポーネントの連携の設定をした状態をSA(Service Assembly)単位でアーカイブされます。これはEJBアプリのアーカイブ(EARファイル)と同じ位置づけです。

略語メモ

APIs: Application Programming Interfaces
BC: Binding Component
CSD: Composite Service Description
EPR: Endpoint Reference
ESB: Enterprise Service Bus
JBI: Java Business Integration
JMX: Java Management Extensions
MBean: Management Bean
ME: Message Exchange
MEP: Message Exchange Pattern
NM: Normalized Message
NMR: Normalized Message Router
SA: Service Assembly
SE: Service Engine
SPIs: Service Provider Interfaces
SU: Service Unit
W3C XOP: XML-binary Optimized Packaging
WS-I AP: WS-I Attachments Profile

リンク

http://www.jcp.org/en/jsr/detail?id=208

 

コメント (22)   トラックバック (1)
この記事をはてなブックマークに追加

カスタムtaglibのサンプル

2007-08-10 09:10:38 | Weblog

カスタムtaglib(tag library)のサンプルです。

セットアップ

mytaglib.warをデプロイしてください。

WEB-INF/srcにソースがあります。ビルドするにはclasspathを修正してください。

Helloタグ

<myt:hello>World</myt:hello>

と記述すると、

Hello World !

と出力されるカスタムタグです。

HelloTagクラスのdoStartTagとdoEndTagで接頭辞(prefix)と接尾辞(suffix)を付加しています。

Loopタグ

<myt:loop maxCount="4">Nested Tag</myt:loop>

と記述すると、

<ol><li>Nested Tag<li>Nested Tag<li>Nested Tag<li>Nested Tag</ol>

と出力されるカスタムタグです。

タグの属性に指定するパラメータは、mytaglib.tldにattributeタグを指定し、LoopTagクラスにsetterを用意します。DIコンテナのように値がsetterインジェクションされます。

組み合わせ

<myt:loop><myt:loop maxCount="4"><myt:hello>Nested Tag</myt:hello></myt:loop></myt:loop>

のように組み合わせることもできます。

実行すると、以下のようになります。

    1. Hello Nested Tag !
    2. Hello Nested Tag !
    3. Hello Nested Tag !
    4. Hello Nested Tag !
    1. Hello Nested Tag !
    2. Hello Nested Tag !
    3. Hello Nested Tag !
    4. Hello Nested Tag !
    1. Hello Nested Tag !
    2. Hello Nested Tag !
    3. Hello Nested Tag !
    4. Hello Nested Tag !

 

コメント
この記事をはてなブックマークに追加

JavaScriptの変数のスコープ

2007-08-06 10:23:49 | Weblog

匿名関数を使ってスコープを限定することが分かって思いついたのが、

if (true) {
  //何かいろいろ
}

とすればいいのでは?

ということで試してみる。

if (true) {
  var msg = 'zzz';
  alert(msg);
}
alert(msg);

↑を実行すると、1回目にzzzが表示されるのは当然ですが、2回目もzzzが表示されます。つまり、if文のブレスの中はローカルスコープにならないらしい。

・・・

そこで、次のようにしてみた。

if (false) {
  var msg = 'zzz';
  alert(msg);
} else {
  alert(msg);
}

↑を実行すると、undefinedが表示されます。if文はfalseの判定だが、trueの中の変数宣言だけ(初期化はされない)は生きているらしい。

・・・

さらに次のようにしてみる。

alert("msg1: " + msg1);
msg1 = 'zzz';
alert("msg1: " + msg1);
if (false) {
  var msg1 = 'Ozzz';
  alert("msg1: " + msg1);
}

ぱっと見では、msg1は宣言されていないためスクリプトエラーとなりそうなのだが、結果は「undefined」、「zzz」と2回表示されます。

if (false){}内のvar msg1宣言がなければスクリプトエラーとなるが、とにかくこのスコープ内にvar宣言があれば、あたまからその変数が使える。

当初はvar宣言の後方で変数が使えると思ったが、スコープの先頭からundefinedの値として使えるみたいです。おそらくパス1で変数宣言のリストをピックアップして、パス2で実行しているような感じ。パス1はif文等の通る/通らないは関係なしにvar宣言のみを探している感じか。

で、そのスコープの単位が関数単位らしい。関数の外に出ると変数は宣言されていないことになる。

さらにvar宣言もいい加減で、同じ変数名で2回以上var宣言してもエラーとならない。

var msg1 = 'zzz';
alert("msg1: " + msg1);
var msg1 = 'zzz';
alert("msg1: " + msg1);

・・・

プロトタイプ型言語としては面白いけど、こんな言語を仕事では使いたくはないな。。。

プリプロセッサで危険なコードをチェックできればいいのかもしれんが。

コメント
この記事をはてなブックマークに追加

匿名関数の定義と実行

2007-08-06 10:10:19 | Weblog

JavaScriptのライブラリなんかを見ていると、↓のようなコードになっています。

(function(){
  //何かいろいろ
})();

この(function(){})();が何者なのかよく分からなかったのですが、ようやく意味が分かりました。

匿名関数

匿名関数とは、

var f = function() {
  //何かいろいろ
};

です。Javaの匿名クラスが分かれば似たようなものなので、↑の記述を見れば、変数fに関数自身が入っていることが分かるでしょう。

関数呼び出し

関数呼出しは2通りあり、

var r = func();

と、

var r = (func)();

のどちらでも呼べます。後者は変ですが、C言語の関数へのポインタを使った関数呼出しを知っていれば同じだと分かるでしょう。

匿名関数を変数に入れ、その変数の関数呼出し

匿名関数を変数fに入れ、その変数に入っている関数呼出しとして、2番目の呼び出し方法にします。

var f = function() {
  //何かいろいろ
};
var r = (f)();

ここで、変数fを無くしてしまえば、

var r = (function() {
  //何かいろいろ
})();

さらに戻り値の変数rを無くせば、

(function() {
  //何かいろいろ
})();

となり、これは匿名関数の定義と実行を同時にやっていることになります。

何でこんな面倒なことをやっているのか

意味は分かったのですが、何でこんな記述をするのか理由が分からなかったのです。

つまり、実行結果は、

//何かいろいろ

と同じです。

ここで「何かいろいろ」で変数を3つ定義すると、その3つの変数はグローバル変数となります。

ところが、

(function() {
  var a = 1;
  var b = 2;
  var c = 3;
})();

とすると、3つの変数はこの匿名関数の中でしか使えません。

従って、極力グローバル変数を使わない(=他のライブラリと衝突しない)ことが目的なんでしょうか。

 

コメント
この記事をはてなブックマークに追加

JavaからJavaScriptを呼び出すサンプル

2007-08-06 10:05:04 | Weblog

JDK6よりJavaスクリプトAPIが追加されました(JavaScript APIではない)。

JSR-223に準拠していればjavax.scriptにあるスクリプトAPIを使ってどんなスクリプト言語でも実行できるはずですが、今のところJavaScriptの実装(Rhinoをベースにしたもの)しかないようです。

JavaスクリプトAPIの使い道ですが、エンドユーザにUserExit処理のソースをJavaScriptで記述させ、Java本体から呼び出すみたいなことが可能となります。この場合、自前でスクリプトエンジンを開発する必要がありません。

サンプル

Java スクリプトプログラマーズガイドを読めば使い方は分かります。

テストを兼ねて試してみたのが下のソースです。

import javax.script.*;

public class EvalScript {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
       
        engine.eval("println('Hello JavaScript from Java.')");
       
        engine.eval("var str1 = 'JavaScript String'");
        engine.eval("println(str1);");
        engine.eval("var str2 = new java.lang.String('Java String');");
        engine.eval("println(str2);");
       
        engine.eval("var array = ['JavaScript', 'Array'];");
        engine.eval("println(array);");
        engine.eval("var list = new java.util.ArrayList();");
        engine.eval("list.add('Java');");
        engine.eval("list.add('ArrayList');");
        engine.eval("println(list);");
       
        engine.eval("var obj = {'JavaScript':'Object'};");
        engine.eval("println(obj);");
        engine.eval("var map = new java.util.HashMap();");
        engine.eval("map.put('Java', 'HashMap');");
        engine.eval("println(map);");
       
        Runtime r = Runtime.getRuntime();
        engine.put("r", r);
        engine.eval("print('Max:   ' + r.maxMemory() + ' Bytes\\n');");
        engine.eval("print('Total: ' + r.totalMemory() + ' Bytes\\n');");
        engine.eval("print('Free:  ' + r.freeMemory() + ' Bytes\\n');");
    }
}

実行結果は以下の通り。

Hello JavaScript from Java.
JavaScript String
Java String
JavaScript,Array
[Java, ArrayList]
[object Object]
{Java=HashMap}
Max:   66650112 Bytes
Total: 5177344 Bytes
Free:  4678440 Bytes

JavaScriptの配列やオブジェクト(ハッシュ)と、JavaのListやMapとで、出力が異なります(おそらくクラス型が異なる)。

engine.put()で、JavaのインスタンスをJavaScriptの変数として受け渡す事ができます。

リンク

http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/scripting/index.html
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/scripting/programmer_guide/index.html

 

コメント
この記事をはてなブックマークに追加

jrunscript(JDK6以降)

2007-08-06 10:03:30 | Weblog

JDK6より、jrunscriptという対話型JavaScriptインタープリターが入っています。

これを使って、JRubyからJavaクラスを呼び出すサンプルと同じことをやってみます。

※このツールは試験的なものであり、将来のJDKのバージョンでは利用できなくなる可能性があります。

セットアップ

JDK6をインストールするだけです。

%JAVA_HOME%/binにjrunscript.exeがあります。

swingのサンプル

JRubyと同じサンプルをJavaScriptで作ってみた。

importPackage(javax.swing);
var frame = new JFrame("Hello Swing");
frame.getContentPane().add(new JLabel("Hello World"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);

変数型が無くなった(varになった)だけで、ほとんどJavaのまんまですが・・。

jrunscript

でインタープリターを起動します。

js> importPackage(javax.swing);

何も返ってこない。

js> var frame = new JFrame("Hello Swing");

何も返ってこない。

js> frame.getContentPane().add(new JLabel("Hello World"));
javax.swing.JLabel[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=
8388608,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,hori
zontalAlignment=LEADING,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,
text=Hello World,verticalAlignment=CENTER,verticalTextPosition=CENTER]

何かJRubyの時と似ているような気がする。

js> frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

何も返ってこない。

js> frame.pack();

何も返ってこない。

js> frame.setVisible(true);

swingウィンドウが表示される。

 

コメント
この記事をはてなブックマークに追加

JavaからRubyを呼び出すサンプル

2007-08-06 09:58:42 | Weblog

JavaからRubyを呼び出すサンプルです(当然JRuby上です)。

jruby.jar をCLASSPATHに通します。

簡単に作ったのが以下のサンプル。わざわざRuby上でJavaのインスタンスを生成しています。

import org.jruby.Ruby;

public class embedRuby {
    public static void main(String[] args) {
        Ruby ruby = Ruby.getDefaultInstance();
        ruby.evalScript("puts \"Hello Ruby from Java.\"");
        ruby.evalScript("str1 = \"Ruby String\"");
        ruby.evalScript("puts str1");
        ruby.evalScript("require 'java'");
        ruby.evalScript("str2 = java.lang.String.new(\"Java String\")");
        ruby.evalScript("puts str2");
    }
}

実行結果は以下のとおり。

Hello Ruby from Java.
Ruby String
Java String

 

コメント
この記事をはてなブックマークに追加

JRubyからJavaクラスを呼び出すサンプル

2007-08-06 09:56:19 | Weblog

JRubyはJavaで実装されたRubyインタープリタなので、RubyのコードからJavaのクラスをそのまま使えます。

セットアップ

http://dist.codehaus.org/jruby/ からダウンロードして、解凍します。

JRUBY_HOMEを設定し、%JRUBY_HOME%/binをPATHに通しておきます。

jruby -v

を実行して、バージョン情報が表示されればOKです。

swingのサンプル

%JRUBY_HOME%/samples/swing.rb 等にサンプルがありますが、

jruby swing.rb

を実行するとあっけないので、jirbで一行づつ実行してみます。

jirb

で、インタープリタを起動します。

require 'java'
=> true

JFrame = javax.swing.JFrame
=> Java::JavaxSwing::JFrame

frame = JFrame.new("Hello Swing")
=> #<Java::JavaxSwing::JFrame:0xc59ad5 @java_object=javax.swing.JFrame[frame0,0,
0,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=Hello Swing,resizable,no
rmal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0
,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=null,alignmentY=null
,border=,flags=385,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEna
bled=true]>

frame.getContentPane.add javax.swing.JLabel.new("Hello World")
=> #<Java::JavaxSwing::JLabel:0x1694eca @java_object=javax.swing.JLabel[,0,0,0x0
,invalid,alignmentX=0.0,alignmentY=null,border=,flags=0,maximumSize=,minimumSize
=,preferredSize=,defaultIcon=,disabledIcon=,horizontalAlignment=LEADING,horizont
alTextPosition=TRAILING,iconTextGap=4,labelFor=,text=Hello World,verticalAlignme
nt=CENTER,verticalTextPosition=CENTER]>

frame.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
=> nil

frame.pack
=> nil

frame.setVisible true
=> nil

swingウィンドウが表示される。

 

コメント
この記事をはてなブックマークに追加

Grails(Groovy版Rails)

2007-08-06 09:51:59 | Weblog

Grailsとは、Groovyを使ったRuby on Railsライクなフレームワークです。なお、Groovyとは、Javaで実装されたスクリプト言語で、JSR-241として標準化されようとしています。

アプリ生成

grailsをダウンロードし、grailsにPATHを通しておく。

以下のコマンドを実行し、

grails create-app

アプリ名(以下、sampleとする)を入力する。

ディレクトリを移動して、以下のコマンドを実行し、

cd sample
grails create-domain-class

ドメインクラス名(以下、Bookとする)を入力する。

grails-app/domain/Book.groovyを編集し、項目を追加する。

class Book {
  Long id
  Long version

  String title
  String author
}

以下のコマンドを実行し、

grails generate-all

ドメインクラス名(Book)を入力すると、controllersとviewsに生成される。

以下のコマンドを実行し、

grails run-app

ブラウザより http://localhost:8080/sample/ にアクセスする。

リンク

Grails:
http://grails.codehaus.org/

Grails(日本語):
http://docs.codehaus.org/display/GRAILS/Japanese+Home

Grails-Japan:
http://groups.google.com/group/grails-ja

 

コメント
この記事をはてなブックマークに追加

Railsで作る簡単Webアプリ

2007-08-06 09:41:38 | Weblog

元ネタ:http://masuidrive.jp/rails/rails_app.html

手順のみを抜粋したものです。

  • bookmarkスキーマにitemsテーブルを生成し、id,url,titleのカラムを持たせる。
  • bmuserを生成し、bookmarkスキーマに権限を与える。
  • 以下のコマンドで雛形を生成する。
rails bookmark
  • modelの雛形を生成する。
cd bookmark
ruby script/generate model item
  • controllerの雛形を生成する。
ruby script/generate controller item
  • database.ymlを修正する。
database: bookmark
username: bmuser
password: bmuser
  • railsサーバーを起動
ruby script/server
  • ブラウザでアクセスする。
http://localhost:3000/
  • itemコントローラにアクセスするとエラーとなる。
http://localhost:3000/item/
  • itemコントローラ(app/controllers/item_controller.rb)を修正する。
class ItemController < ApplicationController
  scaffold :item
end
  • 再度、ブラウザでitemコントローラにアクセスするとCRUDページが出来ている。
  • itemテーブルにdescriptionカラムを追加する。
  • 再度、ブラウザでアクセスするとdescription項目が追加されている。

 

コメント
この記事をはてなブックマークに追加