Java 2 Enterprise Edition, Ver.1.3の設計サンプルとして作られたWebアプリケーション。
SunのWebサイトから無償で入手できます。以下のURLから、Enterprise:Java Pet Store Sample Application をダウンロードします。2003年5月24日時点では、Ver.1.3.1_02が最新となっています。
入手したサンプルを、J2EEサーバ上に配置します。手順一覧は以下の通り。個々の手順詳細は続く節で紹介します。
入手したJava Pet Storeのアーカイブを解凍・展開します。
環境変数を設定します。
環境変数名 | 設定例 | 内容 |
---|---|---|
JAVA_HOME | D:\java\j2sdk1.4.1 | J2SE SDKをインストールしたディレクトリ |
J2EE_HOME | D:\java\j2eesdk1.3.1 | J2EE SDKをインストールしたディレクトリ |
展開したJava Pet Storeの中にあるsetup.batを実行します。
petstore1.3.1_02$ ./setup.bat Buildfile: setup.xml init: help: create_jms_queues: [echo] Creating JMS Queues .... [java] JmsDestination [java] -------------- [java] < JMS Destination : jms/opc/MailQueue , javax.jms.Queue > [java] < JMS Destination : jms/Queue , javax.jms.Queue > [java] < JMS Destination : jms/opc/OrderQueue , javax.jms.Queue > [java] < JMS Destination : jms/opc/InvoiceTopic , javax.jms.Topic > [java] < JMS Destination : jms/opc/MailOrderApprovalQueue , javax.jms.Queue > [java] < JMS Destination : jms/opc/OrderApprovalQueue , javax.jms.Queue > [java] < JMS Destination : jms/supplier/PurchaseOrderQueue , javax.jms.Queue > [java] < JMS Destination : jms/opc/MailCompletedOrderQueue , javax.jms.Queue > [java] < JMS Destination : jms/Topic , javax.jms.Topic > create_users: [echo] Creating users .... [java] グループ default は追加されました。 [java] この変更内容は、J2EE サーバの再起動後に反映されます。 [java] ユーザ jps_admin が追加されました。 [java] この変更内容は、J2EE サーバの再起動後に反映されます。 [java] ユーザ supplier が追加されました。 [java] この変更内容は、J2EE サーバの再起動後に反映されます。 create_petstore_db: create_supplier_db: create_opc_db: core: [echo] The J2EE SDK is now successfully configured to run the petstore appl ication. Please restart cloudscape and the j2ee servers, and deploy all the ear files. You can do this by issuing the following commands: [echo] change directory to j2sdkee1.3/bin; start RI and Cloudscape in separ ate windows [echo] cloudscape -start [echo] j2ee -verbose [echo] change directory to petstore1.3.1_02 to deploy the EAR files [echo] setup.bat deploy (or on Unix, setup.sh deploy) BUILD SUCCESSFUL Total time: 1 minute 0 seconds petstore1.3.1_02$ |
まだJ2EEとは何か分かっていない段階なので、ログに出力されるメッセージは分かりませんが、分からないなりに覗いてみましょう。
JMSのキューを作成しているようです。JMSは非同期通信として用いられるメッセージングに対する標準APIです。
ユーザがいくつか作られています。ユーザ管理があるようです。ユーザとグループという概念があるようです。ここでは、jps_adminユーザとsupplierユーザ、そしてdefaultグループというのが作成されているようです。
データベースがいくつか作られているようです。petstore、supplier、opcという3つのDBが作られているのでしょうか。
J2EEに含まれるデータベース管理プログラムを実行します。データベースはデモ中はずっと起動しっぱなしなので、コンソール(コマンドプロンプト)はこのままにしておきます。
petstore1.3.1_02$ cd $J2EE_HOME/bin bin$ ./cloudscape.bat -start Sat May 24 22:23:38 JST 2003: [RmiJdbc] Starting Cloudscape RmiJdbc Server Versi on 1.7.2 ... Sat May 24 22:23:39 JST 2003: [RmiJdbc] COM.cloudscape.core.JDBCDriver registere d in DriverManager Sat May 24 22:23:39 JST 2003: [RmiJdbc] Binding RmiJdbcServer... Sat May 24 22:23:39 JST 2003: [RmiJdbc] No installation of RMI Security Manager. .. Sat May 24 22:23:39 JST 2003: [RmiJdbc] RmiJdbcServer bound in rmi registry |
このCloudscapeというのは、RMIとJDBCのサーバと書かれています。JDBCということで普通のRDBMSのようですが、RMIとあるのはなんでしょうか。
J2EEには多くのサーバプログラムが含まれます。それらを一括で起動するバッチ(スクリプト)がJ2EE SDKには用意されています。
toru$ cd $J2EE_HOME/bin bin$ ./j2ee.bat -verbose J2EE サーバ待機ポート: 1050 ネームサービスが開始されました:1050 DataSource をバインドしています。名前 = jdbc/Cloudscape、URL = jdbc:cloudscape:r mi:CloudscapeDB;create=true DataSource をバインドしています。名前 = jdbc/DB2、URL = jdbc:cloudscape:rmi:Clou dscapeDB;create=true DataSource をバインドしています。名前 = jdbc/InventoryDB、URL = jdbc:cloudscape: rmi:CloudscapeDB;create=true DataSource をバインドしています。名前 = jdbc/DB1、URL = jdbc:cloudscape:rmi:Clou dscapeDB;create=true DataSource をバインドしています。名前 = jdbc/EstoreDB、URL = jdbc:cloudscape:rmi :CloudscapeDB;create=true DataSource をバインドしています。名前 = jdbc/petstore/PetStoreDB、URL = jdbc/pet store/PetStoreDB__xa DataSource をバインドしています。名前 = jdbc/petstore/PetStoreDB__xa、dataSource = COM.cloudscape.core.RemoteXaDataSource@1a61172 DataSource をバインドしています。名前 = jdbc/XACloudscape、URL = jdbc/XACloudsca pe__xa DataSource をバインドしています。名前 = jdbc/XACloudscape__xa、dataSource = COM. cloudscape.core.RemoteXaDataSource@1d0d45b DataSource をバインドしています。名前 = jdbc/supplier/SupplierDB、URL = jdbc/sup plier/SupplierDB__xa DataSource をバインドしています。名前 = jdbc/supplier/SupplierDB__xa、dataSource = COM.cloudscape.core.RemoteXaDataSource@caf6c1 DataSource をバインドしています。名前 = jdbc/opc/OPCDB、URL = jdbc/opc/OPCDB__xa DataSource をバインドしています。名前 = jdbc/opc/OPCDB__xa、dataSource = COM.clo udscape.core.RemoteXaDataSource@cf710e JMS サービスを開始します... Initialization complete - waiting for client requests バインディング: < JMS Destination : jms/opc/MailQueue , javax.jms.Queue > バインディング: < JMS Destination : jms/supplier/PurchaseOrderQueue , javax.jms. Queue > バインディング: < JMS Destination : jms/opc/InvoiceTopic , javax.jms.Topic > バインディング: < JMS Destination : jms/opc/MailCompletedOrderQueue , javax.jms. Queue > バインディング: < JMS Destination : jms/Topic , javax.jms.Topic > バインディング: < JMS Destination : jms/opc/OrderQueue , javax.jms.Queue > バインディング: < JMS Destination : jms/opc/OrderApprovalQueue , javax.jms.Queue > バインディング: < JMS Destination : jms/opc/MailOrderApprovalQueue , javax.jms.Q ueue > バインディング: < JMS Destination : jms/Queue , javax.jms.Queue > バインディング: < JMS Cnx Factory : jms/supplier/TopicConnectionFactory , Topic , No properties > バインディング: < JMS Cnx Factory : jms/supplier/QueueConnectionFactory , Queue , No properties > バインディング: < JMS Cnx Factory : jms/admin/QueueConnectionFactory , Queue , N o properties > バインディング: < JMS Cnx Factory : jms/TopicConnectionFactory , Topic , No prop erties > バインディング: < JMS Cnx Factory : TopicConnectionFactory , Topic , No properti es > バインディング: < JMS Cnx Factory : QueueConnectionFactory , Queue , No properti es > バインディング: < JMS Cnx Factory : jms/opc/QueueConnectionFactory , Queue , No properties > バインディング: < JMS Cnx Factory : jms/QueueConnectionFactory , Queue , No prop erties > バインディング: < JMS Cnx Factory : jms/opc/TopicConnectionFactory , Topic , No properties > バインディング: < JMS Cnx Factory : jms/petstore/QueueConnectionFactory , Queue , No properties > 次のポートで Web サービスを開始します: 8000 次のポートで、セキュリティで保護された Web サービスを開始します:7000 J2EE SDK/1.3.1 次のポートで Web サービスを開始します: 9191 J2EE SDK/1.3.1 J2EE サーバの起動が完了しました。 |
ネームサービスが起動されています。いくつものDatastoreがこのネームサービスに登録されているようです。
JMSサービスが起動されています。いろいろバインディングという表現で処理されていますが、現時点ではよくわかりません。
Webサービスが起動されています。ここでいうWebサービスは、Webサーバ機能のことを指すのでしょう。ポートは8000となっています。試しにWebブラウザでポート8000に接続してみるとよいでしょう。
セキュリティで保護されたWebサービスが起動されています。これは、httpsで接続できることを指しているのでしょうか。
ポート9191で起動されるWebサービスとは何かは現時点ではよくわかりません。
J2EEでは、作成したアプリケーションを"Deploy"(配備)するという作業があります。
petstore1.3.1_02$ ./setup.bat deploy Buildfile: setup.xml init: deploy: [echo] Deploying ears .... [exec] Generated sql = SELECT "a"."userId" FROM "CustomerEJBTable" "a" [exec] Generated sql = SELECT "a"."userName" FROM "UserEJBTable" "a" [exec] SQL の生成が完了しました。 [exec] petstore.ear のアプリケーションをサーバ localhost に配備し、クライア ント jar を null に保存します。 [exec] 送付側オブジェクト Deploy Tool : PetStoreEAR を localhost に配備しま す。 [exec] リモートメッセージ: コンタクト先サーバ... [exec] リモートメッセージ: アプリケーション PetStoreEAR は転送されました。 [exec] リモートメッセージ: PetStoreEAR には配備する EJB が 15 個、Web コン ポーネントが 1 個あります。 [exec] リモートメッセージ: EJB を配備しています... [exec] リモートメッセージ: Bean を処理しています ... [exec] リモートメッセージ: サーバ JAR を作成しています ... [exec] リモートメッセージ: クライアント JAR を作成しています ... [exec] リモートメッセージ: Web サーバにコンタクトして d:\java\j2sdkee1.3.1\ repository\winchan\applications\PetStoreEAR1053785040656Server.jar の実行を依頼 します。 [exec] リモートメッセージ: Web コンポーネントは配備されました。 [exec] リモートメッセージ: PetStoreEAR の配備が完了しました。 [exec] 送付側オブジェクト Deploy Tool : http://xxx.xxx.xxx.xxx:9191/PetStor eEARClient.jar のクライアントコード [exec] Generated sql = SELECT "a"."poId" FROM "PurchaseOrderEJBTable" "a" W HERE (("a"."poDate" >= ? ) AND ("a"."poDate" <= ? )) [exec] Generated sql = SELECT DISTINCT "a"."orderId" FROM "ManagerEJBTable" "a" WHERE ("a"."status" = ? ) [exec] Null text data?? [exec] SQL の生成が完了しました。 [exec] opc.ear のアプリケーションをサーバ localhost に配備し、クライアント jar を null に保存します。 [exec] 送付側オブジェクト Deploy Tool : OrderProcessingCenterEAR を localho st に配備します。 [exec] リモートメッセージ: コンタクト先サーバ... [exec] リモートメッセージ: アプリケーション OrderProcessingCenterEAR は転送 されました。 [exec] リモートメッセージ: OrderProcessingCenterEAR には配備する EJB が 15 個、Web コンポーネントが 1 個あります。 [exec] リモートメッセージ: EJB を配備しています... [exec] リモートメッセージ: Bean を処理しています ... [exec] リモートメッセージ: ラッパーコードをコンパイルしています ... [exec] リモートメッセージ: RMI-IIOP コードをコンパイルしています ... [exec] リモートメッセージ: サーバ JAR を作成しています ... [exec] リモートメッセージ: クライアント JAR を作成しています ... [exec] リモートメッセージ: Web サーバにコンタクトして d:\java\j2sdkee1.3.1\ repository\winchan\applications\OrderProcessingCenterEAR1053785072468Server.jar の実行を依頼します。 [exec] リモートメッセージ: Web コンポーネントは配備されました。 [exec] リモートメッセージ: OrderProcessingCenterEAR の配備が完了しました。 [exec] 送付側オブジェクト Deploy Tool : http://xxx.xxx.xxx.xxx:9191/OrderPr ocessingCenterEARClient.jar のクライアントコード [exec] Generated sql = SELECT DISTINCT "a"."poId" FROM "SupplierOrderEJBTab le" "a" WHERE ("a"."poStatus" = ? ) [exec] Generated sql = SELECT "a"."itemId" FROM "InventoryEJBTable" "a" [exec] Null text data?? [exec] SQL の生成が完了しました。 [exec] supplier.ear のアプリケーションをサーバ localhost に配備し、クライア ント jar を null に保存します。 [exec] 送付側オブジェクト Deploy Tool : SupplierEAR を localhost に配備しま す。 [exec] リモートメッセージ: コンタクト先サーバ... [exec] リモートメッセージ: アプリケーション SupplierEAR は転送されました。 [exec] リモートメッセージ: SupplierEAR には配備する EJB が 7 個、Web コンポ ーネントが 1 個あります。 [exec] リモートメッセージ: EJB を配備しています... [exec] リモートメッセージ: Bean を処理しています ... [exec] リモートメッセージ: サーバ JAR を作成しています ... [exec] リモートメッセージ: クライアント JAR を作成しています ... [exec] リモートメッセージ: Web サーバにコンタクトして d:\java\j2sdkee1.3.1\ repository\winchan\applications\SupplierEAR1053785094468Server.jar の実行を依頼 します。 [exec] リモートメッセージ: Web コンポーネントは配備されました。 [exec] リモートメッセージ: SupplierEAR の配備が完了しました。 [exec] 送付側オブジェクト Deploy Tool : http://xxx.xxx.xxx.xxx:9191/Supplie rEARClient.jar のクライアントコード [exec] java.io.IOException: Error in opening uri http://localhost:8000/sun- j2ee-ri_1_4.dtdstatus code=404 [exec] java.io.IOException: Error in opening uri http://localhost:8000/sun- j2ee-ri_1_4.dtdstatus code=404 [exec] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3339) [exec] at org.apache.crimson.parser.Parser2.externalParameterEntity(Par ser2.java:3027) [exec] at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.ja va:1314) [exec] at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java: 623) [exec] at org.apache.crimson.parser.Parser2.parse(Parser2.java:333) [exec] at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.j ava:448) [exec] at com.sun.enterprise.deployment.xml.XMLUtils.getNodesByType(XML Utils.java:272) [exec] at com.sun.enterprise.deployment.xml.RuntimeDescriptorNode.readR untimeDescriptorNodes(RuntimeDescriptorNode.java:924) [exec] at com.sun.enterprise.deployment.xml.RuntimeDescriptorNode.read( RuntimeDescriptorNode.java:1012) [exec] at com.sun.enterprise.deployment.ApplicationArchivist.open(Appli cationArchivist.java:487) [exec] at com.sun.enterprise.deployment.ApplicationArchivist.open(Appli cationArchivist.java:342) [exec] at com.sun.enterprise.tools.deployment.main.DeployTool.doGenerat eSQL(DeployTool.java:253) [exec] at com.sun.enterprise.tools.deployment.main.Main.main(Main.java: 268) [exec] java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 [exec] at java.util.Vector.elementAt(Vector.java:431) [exec] at com.sun.enterprise.deployment.xml.RuntimeDescriptorNode.read( RuntimeDescriptorNode.java:1016) [exec] at com.sun.enterprise.deployment.ApplicationArchivist.open(Appli cationArchivist.java:487) [exec] at com.sun.enterprise.deployment.ApplicationArchivist.open(Appli cationArchivist.java:342) [exec] at com.sun.enterprise.tools.deployment.main.DeployTool.doGenerat eSQL(DeployTool.java:253) [exec] at com.sun.enterprise.tools.deployment.main.Main.main(Main.java: 268) [exec] Result: 2 [exec] petstoreadmin.ear のアプリケーションをサーバ localhost に配備し、ク ライアント jar を null に保存します。 [exec] 送付側オブジェクト Deploy Tool : AdminEAR を localhost に配備します 。 [exec] リモートメッセージ: コンタクト先サーバ... [exec] リモートメッセージ: アプリケーション AdminEAR は転送されました。 [exec] 送付側オブジェクト 配備ツール (メイン) : RemoteException occurred in server thread; nested exception is: [exec] java.rmi.RemoteException: 保存/オープンでエラーが発生しました。 [exec] Result: 1 [echo] The petstore application is now installed. [echo] Please restart your cloudscape database and the J2EE server, and the n point your browser to http://localhost:8000/petstore to access petstore. BUILD SUCCESSFUL Total time: 1 minute 23 seconds petstore1.3.1_02$ |
petstore.ear、opc.ear、supplier.ear、petstoreadmin.earといったものをサーバに配備しています。現時点ではearとはなにか分かりませんが、earの中にはEJBやWebコンポーネントが複数入っているようです。
最後にBUILD SUCCESSFULになっているので大丈夫そうですが、途中でIOExceptionエラーが発生しています。j2ee-ri_1_4という表記があるので、どうやら前回J2EE1.4βを入れて試行したときの残骸があったようです。
インストールが完了したら、実際にデモアプリケーションを使ってみましょう。
まず、同じマシン上でWebブラウザを起動し、http://localhost:8000/petstore/ へアクセスします。
Pet StoreデモのWebページが表示されます。画面の赤丸をクリックすると、デモのPetStoreページに飛びます。
J2EEサーバとCloudscopeを終了させる。
bin$ ./j2ee.bat -stop J2EE サーバをシャットダウンします。 bin$ ./cloudscape.bat -stop URL=[jdbc:rmi:jdbc:cloudscape:] Attempting to shutdown RmiJdbc server RmiJdbc Server RmiAddr is: //winchan/RmiJdbcServer WARNING: Shutdown was successful! bin$ |