nimbus (1.2.4) | 2018-01-25 20:02 |
nimbus-sample (1.2.4) | 2018-01-26 17:06 |
Webアプリケーション開発において、サーバへのリクエストを処理するためにJavaEE規格であるサーブレットを使用します。
サーブレットの手前に配置して、サーブレットへのリクエスト処理の前処理と後処理を付加する機能をサーブレットフィルタと呼びます。
この特定の処理の前後に処理を挟み込むというアーキテクチャは、いわゆるアスペクト指向と同じもので、Nimbusで言えばアスペクト指向/Interceptorに該当します。
そこで、サーブレットフィルタにアスペクト指向/Interceptorを挟み込む機能を提供するのが、InterceptorChainCallFilterです。
純粋なJavaEEサーブレットを使ったWebアプリケーション開発では、リクエストのパス毎にサーブレットを開発して、リクエストに紐付く業務処理を実装します。
NImbusでは、業務処理の実装は、業務フローを使うため、リクエストのパスから業務フローにマッピングして呼び出すサーブレットBeanFlowServletを提供します。
Webソケット接続に対して、認証Webアプリケーションを組み込むWebSocketAuthServletを提供します。
RESTfulなWebアプリケーション開発では、RESTfulサーバの受付窓口となるRestServletを提供します。詳細は、RESTfulサーバを参照してください。
HTTPによるサービスのリモート呼び出しを実現するRemoteServiceServerServletを提供します。
ユーティリティ的なサーブレットとして、Nimbusにホスティングされているサービスにアクセスするサービスコンソールを提供するServiceManagerFactoryServlet 、共有コンテキスト上にあるデータを照会及び編集する共有コンテキストコンソールを提供するSharedContextServlet、スケジュール管理上にあるスケジュールを照会及び更新するスケジュール管理コンソールを提供するScheduleManagerServlet、JMXサーバの管理コンソールを提供するJMXConsoleServletがあります。
関連するパッケージは、以下です。
InterceptorChainCallFilterは、javax.servlet.Filterインタフェースを実装したサーブレットフィルタで、InterceptorChainListを取得して、InterceptorChainを生成し、サーブレットのフィルタ層にInterceptorを織り込みます。
以下に、このサーブレットフィルタをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Sample Web application</display-name>
- <filter>
- <filter-name>InterceptorChainCallFilter</filter-name>
- <filter-class>jp.ossc.nimbus.servlet.InterceptorChainCallFilter</filter-class>
- <!-- InterceptorChainListサービスのサービス名を設定する -->
- <init-param>
- <param-name>InterceptorChainListServiceName</param-name>
- <param-value>Nimbus#InterceptorChainList</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>InterceptorChainCallFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- </web-app>
BeanFlowServletは、リクエストされたパスに紐づけて業務フロー呼び出すサーブレットです。
全体の処理の流れとしては、サーブレットフィルタ層のInterceptorChainCallFilterによって織り込んだServletRequestExchangeInterceptorServiceや、StreamExchangeInterceptorServiceがリクエストの内容を入力オブジェクトに変換して、ServletRequestの属性に入力オブジェクトとして設定します。
BeanFlowServletは、ServletRequest、ServletResponseや、ServletRequestの属性に設定された入力オブジェクトなどをひとまとめにしたBeanFlowServletContextを生成します。
BeanFlowSelectorを使って、リクエストパスに紐付く業務フロー名を特定します。
特定した業務フローに関連する入力検証用の業務フローが存在する場合は、BeanFlowServletContextを引数として入力検証用の業務フローを呼び出します。
戻り値がfalseの場合は、そこで応答を返します。その際、BeanFlowServletContextに出力オブジェクトを設定しておくと、ServletRequestの属性に出力オブジェクトとして設定してます。
戻り値がtrueの場合は、続けてBeanFlowServletContextを引数としてリクエスト処理用の業務フローを呼び出し、戻り値をServletRequestの属性に出力オブジェクトとして設定します。
BeanFlowServletがServletRequestの属性に出力オブジェクトとして設定したオブジェクトは、サーブレットフィルタ層のStreamExchangeInterceptorServiceが適切なストリームに変換して、サーブレットの出力ストリームに出力します。
業務フローで発生した例外は、サーブレットフィルタ層にExceptionHandlingInterceptorServiceを織り込んで、例外処理をさせると良いでしょう。
以下に、このサーブレットをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Sample Web application</display-name>
- <servlet>
- <servlet-name>BeanFlowServlet</servlet-name>
- <servlet-class>jp.ossc.nimbus.servlet.BeanFlowServlet</servlet-class>
- <!-- BeanFlowInvokerFactoryサービスのサービス名を設定する -->
- <init-param>
- <param-name>BeanFlowInvokerFactoryServiceName</param-name>
- <param-value>Nimbus#BeanFlowInvokerFactory</param-value>
- </init-param>
- <!-- 検証用の業務フローを有効にするかを設定する -->
- <init-param>
- <param-name>Validate</param-name>
- <param-value>true</param-value>
- </init-param>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>BeanFlowServlet</servlet-name>
- <url-pattern>*.bf</url-pattern>
- </servlet-mapping>
- </web-app>
インタフェースBeanFlowSelectorは、基本的に他のサービスがサーブレットリクエストと業務フローをマッピングするために利用する下位機能である。
このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。
上位サービス | 用途 |
jp.ossc.nimbus.servlet.BeanFlowServlet | リクエストの処理を行う業務フローを特定するために使用する。 |
jp.ossc.nimbus.service.aop.interceptor.servlet.StreamExchangeInterceptorService | 入力オブジェクトを生成する業務フローを特定するために使用する。 |
実装サービスの一覧は以下のとおりです。
実装サービス | 実装概要 |
jp.ossc.nimbus.servlet.DefaultBeanFlowSelectorService | デフォルト実装。リクエストされたサーブレットパスから拡張子を外したものを業務フロー名とする |
jp.ossc.nimbus.servlet.MappingBeanFlowSelectorService | リクエストされたサーブレットパスと業務フロー名のマッピングを定義する |
ServiceManagerFactoryServletは、サーブレットコンテナ上でNimbusのサービス定義を読み込む機能と、サービスの管理コンソールWebアプリケーションを提供する機能を持ちます。
以下に、このサーブレットをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Sample Web application</display-name>
- <servlet>
- <servlet-name>NimbusServlet</servlet-name>
- <servlet-class>jp.ossc.nimbus.servlet.ServiceManagerFactoryServlet</servlet-class>
- <!-- ロードするサービス定義ファイルのパスを指定する
- コンテキストパスからの相対パス、または、クラスパス上のパスを指定可能
- -->
- <init-param>
- <param-name>ServicePaths</param-name>
- <param-value>/WEB-INF/service-definition.xml</param-value>
- </init-param>
- <!-- サービス定義のロードが正常に行われたかチェックするかどうかを設定する
- チェックしたい場合は、true
- -->
- <init-param>
- <param-name>CheckLoadManagerCompleted</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- サービス定義ファイルの検証を行うかどうかを設定する
- 検証する場合は、true
- -->
- <init-param>
- <param-name>Validate</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- Nimbusコンソールを有効にするかどうかを指定する
- 有効にする場合、true
- -->
- <init-param>
- <param-name>ConsoleEnabled</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- コンソールからの属性設定を有効にするかどうかを指定する
- 有効にする場合、true
- -->
- <init-param>
- <param-name>AttributeSetEnabled</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- コンソールからのメソッド呼び出しを有効にするかどうかを指定する
- 有効にする場合、true
- -->
- <init-param>
- <param-name>MethodCallEnabled</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- Warファイルのデプロイ時に、サーブレットが初期化されるように設定する -->
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>NimbusServlet</servlet-name>
- <url-pattern>/nimbus-console</url-pattern>
- </servlet-mapping>
- </web-app>
RestServletは、RESTfulリクエストを受けてRestServerを呼び出すサーブレットです。
以下に、このサーブレットをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Sample RESTful Web application</display-name>
- <servlet>
- <servlet-name>RestServlet</servlet-name>
- <servlet-class>jp.ossc.nimbus.servlet.RestServlet</servlet-class>
- <!-- RestServerサービスのサービス名を設定する -->
- <init-param>
- <param-name>RestServerServiceName</param-name>
- <param-value>Nimbus#RestServer</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>RestServlet</servlet-name>
- <url-pattern>/rest/*</url-pattern>
- </servlet-mapping>
- </web-app>
WebSocketAuthServletは、Webソケット接続に対して、認証Webアプリケーションを組み込むサーブレットです。
以下に、このサーブレットをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Sample WebscoketWeb application</display-name>
- <servlet>
- <servlet-name>WebSocketAuthServlet</servlet-name>
- <servlet-class>jp.ossc.nimbus.servlet.WebSocketAuthServlet</servlet-class>
- <!-- Authenticatorサービスのサービス名を設定する -->
- <init-param>
- <param-name>AuthenticatorServiceName</param-name>
- <param-value>Nimbus#Authenticator</param-value>
- </init-param>
- <!-- Configuratorサービスのサービス名を設定する -->
- <init-param>
- <param-name>ConfiguratorServiceName</param-name>
- <param-value>Nimbus#Configurator</param-value>
- </init-param>
- <!-- Acceptに対するConverterのマッピングを設定する -->
- <init-param>
- <param-name>ConverterMapDefinition</param-name>
- <param-value>
- application/json=Nimbus#BeanJSONConverter
- </param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>WebSocketAuthServlet</servlet-name>
- <url-pattern>/wsauth</url-pattern>
- </servlet-mapping>
- </web-app>
RemoteServiceServerServletは、リモートからのサービス呼び出しをHTTPで行うためのサーブレットです。
以下に、このサーブレットをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Sample Remote Service Server</display-name>
- <servlet>
- <servlet-name>RemoteServiceServerServlet</servlet-name>
- <servlet-class>jp.ossc.nimbus.servlet.RemoteServiceServerServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>RemoteServiceServerServlet</servlet-name>
- <url-pattern>/invoke</url-pattern>
- <url-pattern>/aliveCheck</url-pattern>
- <url-pattern>/resourceUsage</url-pattern>
- </servlet-mapping>
- </web-app>
SharedContextServletは、共有コンテキスト上にあるデータを照会及び編集するHTMLベースの共有コンテキストコンソールと、JSONベースのWebサービスを提供する機能を持ちます。
以下に、このサーブレットをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Sample Web application</display-name>
- <servlet>
- <servlet-name>SharedContextServlet</servlet-name>
- <servlet-class>jp.ossc.nimbus.servlet.SharedContextServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>SharedContextServlet</servlet-name>
- <url-pattern>/context-console</url-pattern>
- </servlet-mapping>
- </web-app>
ScheduleManagerServletは、スケジュール管理上にあるスケジュールを照会及び更新するHTMLベースのスケジュール管理コンソールと、JSONベースのWebサービスを提供する機能を持ちます。
以下に、このサーブレットをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Sample Web application</display-name>
- <servlet>
- <servlet-name>ScheduleManagerServlet</servlet-name>
- <servlet-class>jp.ossc.nimbus.servlet.ScheduleManagerServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ScheduleManagerServlet</servlet-name>
- <url-pattern>/schedule-console</url-pattern>
- </servlet-mapping>
- </web-app>
JMXConsoleServletは、JMXサーバのHTMLベースの管理コンソールと、JSONベースのWebサービスを提供する機能を持ちます。
以下に、このサーブレットをWebアプリケーションに配置するweb.xmlの記述例を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>JMX Console Web application</display-name>
- <servlet>
- <servlet-name>JMXConsoleServlet</servlet-name>
- <servlet-class>jp.ossc.nimbus.servlet.JMXConsoleServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>JMXConsoleServlet</servlet-name>
- <url-pattern>/jmx-console</url-pattern>
- </servlet-mapping>
- </web-app>
サンプルは、以下。