Apache Camel コンポーネント開発 @ssogabe Data Format Component Apache Camel コンポーネント開発 @ssogabe.

Slides:



Advertisements
Similar presentations
Copyright © NTT COMWARE 2014 NTT COMWARE CONFIDENTIAL PROPRIETARY OSS-EAI ドキュメント生成ツール 利用マニュアル NTT コムウェア 品質生産性技術本部 技術 SE 部 OSS ・ AP 技術担当.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
復習ー I (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー.
S2.4 & S2EJB3Unit 中村( taedium ). Seasar 2.4 の特徴 1 Sesar 2.4 は EJB 3.0 を実 装しています。 EJB 3.0 の仕様は 5 月 12 日に Final Release されたばかりの新しい技 術です。
Scala + Liftフレームワーク その2.
WebサービスII (第12回)‏ 2007年12月19日 植田龍男.
Apache Camel Data Format Component Apache Camel
Remote Method Invocation
JPAを利用した RESTful Webサービスの開発
2006年11月22日 植田龍男 Webサービス II (第9回) 年11月22日 植田龍男.
Javaのための暗黙的に型定義される構造体
Mavenによる プロジェクト管理 近畿大学理工学部 情報学科3年  小野実.
JSFによるWebアプリケーション開発 第11回
Servlet J2EE I 第8回 /
Apache Camel Data Format Component Apache Camel
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
OSS-EAI ドキュメント生成ツール 利用マニュアル
アルゴリズムとデータ構造 2011年6月13日
JavaBeans とJSP データベース論 第5回.
JSFによるWebアプリケーション開発 第6回
エンタープライズアプリケーション II 第7回 / 2006年7月9日
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
RMI ソフトウェア特論 第6回 /
Stateful Session Beans
第12回 2007年7月13日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとプログラミング (Algorithms and Programming)
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
第11回 2007年7月6日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
第3回 2007年4月27日 応用Java (Java/XML).
第6回 2007年6月1日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
Jakarta Struts (2) ソフトウェア特論 第11回.
Javaによる Webアプリケーション入門 第2回
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
Javaによる Webアプリケーション入門 第11回
ソフトウェア制作論 平成30年11月21日.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
EntityManager と EJB QL EJB 3.0 コース 第8回 2006年8月5日.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
C#プログラミング実習 第3回.
Javaによる Webアプリケーション入門 第8回
アルゴリズムとデータ構造 2012年6月11日
Javaによる Webアプリケーション入門 第4回
Annotation EJB 3.0 コース 第3回 2006年8月4日.
オープンソースソフトウェアに対する コーディングパターン分析の適用
WebアプリケーションとTomcat ― これまでの復習とこれからの予習 ―
Action Method の実装 J2EE II 第9回 2004年12月2日.
稚内北星学園大学 情報メディア学部 安藤 友晴
Jakarta Struts (1) ソフトウェア特論 第10回.
JSPの基本 J2EE I (データベース論) 第8回 /
クラスの追加 メソッドの追加 TestCaseの追加 Test Methodの追加.
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
アルゴリズムとデータ構造 2012年6月21日
2006年10月18日 植田龍男 Webサービス II (第4回) 年10月18日 植田龍男.
JSFによるWebアプリケーション開発 第7回
Presentation transcript:

Apache Camel コンポーネント開発 @ssogabe Data Format Component Apache Camel コンポーネント開発 @ssogabe

概要 Apache Camelがサポートするデータフォーマットを変換するData Formatコンポーネントの仕組みを理解し、簡単なコンポーネントを作成する。 題材として、Amateras Projectが提供するXLSBeansを使用し、Excelで作成された定型フォーマットからデータを読み取り、JavaBeansに変換する。

Data Formatとは EIPにおけるMessage Translator(メッセージ変換)を提供する仕組み Camelでは、コンポーネントとして、以下のコンポーネントを提供 Bindy JAXB Zip Jackson ...

使用例 JAXBコンポーネントを使って、XML⇔JavaBeans <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">   <dataFormats> <!– JAXBのオプション設定 -->     <jaxb id="myJaxb" prettyPrint="true" />   </dataFormats>   <!– JavaBeans ⇒ XML -->   <route>     <from uri="direct:start"/>     <marshal ref="myJaxb"/>     <to uri="direct:marshalled"/>   </route> <!– XML ⇒ JavaBeans -->     <from uri="direct:marshalled"/>     <unmarshal ref="myJaxb"/>     <to uri="mock:result"/>   </route>  </camelContext> <marshal> <jaxb prettyPrint=“true” /> </marshal> でもOK

XLSBeansとは Amateras Projectが提供する、アノテーションを付与したJava BeansとExcelをマッピングするライブラリ @Sheet(name = "UserList") public class UserList { @LabelledCell(label = "title", type = LabelledCellType.Right) public String title; @HorizontalRecords(tableLabel = "User List", recordClass = User.class) public List<User> users; } シートの定義 public class User { @Column(columnName = "id") public int id; @Column(columnName = "name") public String name; @Column(columnName = "gender") public String gender; @Column(columnName = "age") public int age; } シートをマッピング UserList userList = (UserList) XMLSBeans().load( new FileInputStream(“user.xlsx”), UserList.class) for (User user : userList.users) { ...... } リストに含まれるユーザの定義

DataFormatインタフェース Excel⇔JavaBeansを行うメソッドを提供 必須のインタフェース package org.apache.camel.spi; public interface DataFormat { // JavaBeans の変換 今回は実装しない void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception; // Excel ⇒ JavaBeansの変換を行う // streamは、Excelファイルのストリーム形式 Object unmarshal(Exchange exchange, InputStream stream) throws Exception; }

ServiceSupportクラス コンポーネントのライフサイクルを制御するクラス インスタンスの生成など、初期処理、終了処理が必要な場合は、このクラスを継承する package org.apache.camel.support; public abstract class ServiceSupport implements StatefulService { // 初期処理 protected abstract void doStart() throws Exception; // 終了処理 protected abstract void doStop() throws Exception; }

CamelContextAwareインタフェース Camel本体がCamelContextをインジェクト package org.apache.camel; public interface CamelContextAware { // CamelContextの設定 void setCamelContext(CamelContext camelContext); // CamelContextの取得 CamelContext getCamelContext(); }

Maven Projectの作成 (1) mvn archetype:generate を実行し、CamelのData Format向けMaven Projectの雛形を生成 mvn eclipse:eclipse を実行し、Eclipseの.classpathなどのファイルを作成 C:\mvn archetype:generate \ -DarchetypeGroupId=org.apache.camel.archetypes \ -DarchetypeArtifactId=camel-archetype-dataformat \ -DarchetypeVersion=2.13.2 \ -DgroupId=osseai \ -DartifactId=xlsbeans \ -Dversion=1.0-SNAPSHOT \ -Dpackage=jp.co.nttcom.eai.component.xlsbeans \ -Dname=XLSBeans \ -Dscheme=xlsbeans

Maven Projectの作成 (2) 以下のディレクトリ、ファイルが生成される

Maven Projectの作成 (3) ビルドできることを確認する C:\xlsbeans\mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Camel XLSBeans Data format 1.0-SNAPSHOT (snip) [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ xlsbeans --- [INFO] Building jar: c:\home\tmp\xlsbeans\target\xlsbeans-1.0-SNAPSHOT.jar [INFO] BUILD SUCCESS [INFO] Total time: 13.370s [INFO] Finished at: Wed Jul 16 10:52:18 JST 2014 [INFO] Final Memory: 7M/17M

依存ライブラリの追加 XLSBeansを使用できるようにpom.xmlを修正 <dependencies> (snip) <dependency> <groupId>jp.sf.amateras.xlsbeans</groupId> <artifactId>xlsbeans</artifactId> <version>1.2.5</version> </dependency> </dependencies> <repositories> <repository> <id>amateras</id> <name>Project Amateras Maven2 Repository</name> <url>http://amateras.sourceforge.jp/mvn/</url> </repository> </repositories>

仕様 変換対象となるExcelファイルは、Fileコンシューマーなどで取得し、ExchangeのBODYに設定 Spring XMLで、Excelファイルから変換するJavaBeansの完全修飾名(objectType)を指定 XLSX形式のみサポート <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:unmarshal"/> <unmarshal> <custom ref="xlsBeansDataFormat" /> </unmarshal> <to uri="mock:unmarshal" /> </route> </camelContext> <bean id="xlsBeansDataFormat" class=“jp.co.nttcom.eai.component.xlsbeans.XLSBeansDataFormat" > <property name="objectType" value="jp.co.nttcom.eai.model.UserList" /> </bean>

XLSBeansDataFormatの実装(1) パラメータはフィールドとして定義 objectTypeの確認とXLSBeansのインスタンスを生成 public class XLSBeansDataFormat extends ServiceSupport implements DataFormat { private Class objectType; // setter/getterは必要 private XLSBeans xlsBeans; @Override protected void doStart() throws Exception { // objectTypeは必須 ObjectHelper.notNull(objectType, "objectType"); xlsBeans = new XLSBeans(); } protected void doStop() throws Exception { // do nothing

XLSBeansDataFormatの実装(2) unmarshalのみ実装 XLSBeansのインスタンスは、スレッドで共有しても問題ないので、先に生成しておく @Override public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception { throw new UnsupportedOperationException("Not supported yet."); } public Object unmarshal(Exchange exchange, InputStream stream) // XLSX形式のみ対応(固定) return xlsBeans.load(stream, objectType, WorkbookFinder.TYPE_XSSF);

テストライブラリの追加 Camelでは、いくつかのテストをサポートするライブラリを提供 Spring XMLで作成したルートをテストするために、pom.xmlに以下を追加 <dependencies> (snip) <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-test-spring</artifactId> <version>2.13.2</version> <scope>test</scope> </dependency> </dependencies>

タイトル部分(背景が水色)は変更しないこと テスト資材の配置 (1) テスト対象のExcelファイルuserlist.xlsxを、src\test\resources\jp\co\nttcom\eai\component\xlsbeansに配置 タイトル部分(背景が水色)は変更しないこと シート名は”UserList”

テスト資材の配置 (2) src\test\jp\co\nttcom\eai\modelに配置 Excelシートをマッピングするクラスを作成 package jp.co.nttcom.eai,model; (snip) @Sheet(name = "UserList") public class UserList { @LabelledCell(label = "title", type = LabelledCellType.Right) public String title; @HorizontalRecords(tableLabel = "User List", recordClass = User.class) public List<User> users; } シート名 内容が”title”のセルの右側のセルの値をtitleに設定 “User List”のセルの下にある表の行の内容をUserクラスにマッピングする

テスト資材の配置 (3) “User List”テーブルの1行の情報をマッピングするUserクラスを作成 “id”列の値をマッピング package jp.co.nttcom.eai,model; (snip) public class User { @Column(columnName = "id") public int id; @Column(columnName = "name") public String name; @Column(columnName = "gender") public String gender; @Column(columnName = "age") public int age; } “id”列の値をマッピング

テストするルートの作成 テストするルートは、”テストクラス名”-context.xml Excelシートと同じディレクトリに配置する。 テストクラス名がXLSBeansDataFormatTest.javaの場合は、XLSBeansDataFormatTest-context.xml Excelシートと同じディレクトリに配置する。 <?xml version="1.0" encoding="UTF-8" ?> <beans ... > <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:unmarshal"/> <unmarshal> <custom ref="xlsBeansDataFormat" /> </unmarshal> <to uri="mock:unmarshal" /> </route> </camelContext> <bean id="xlsBeansDataFormat" class=“jp.co.nttcom.eai.component.xlsbeans.XLSBeansDataFormat" > <property name="objectType" value="jp.co.nttcom.eai.model.UserList" /> </bean> </beans>

テストクラスの作成(1) 作成したExcelファイル、ルートを使用したテストクラス(XLSBeansDataFormatTest)を作成 package jp.co.nttcom.eai.component.xlsbeans; (snip) @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class XLSBeansDataFormatTest { @Produce(uri = "direct:unmarshal") private ProducerTemplate template; @EndpointInject(uri = "mock:unmarshal") private MockEndpoint mock; : テストルートの”<from uri=“direct:unmarshal”/>”に データを送付するためのオブジェクト。 インジェクトされる テストルートの ” <to uri=“mock:unmarshal” />”のモック

テストクラスの作成(2) <to uri=“mock:unmarshal” />が受け取るBODYが、UserListのインスタンスであることなどを確認 @Test public void testUnmarshal() throws Exception { // 期待値の設定 // Exchangeを1つ受け取り、BODYがUserListのインスタンスであること mock.expectedMessageCount(1); mock.message(0).body().isInstanceOf(UserList.class); // テスト用のExcelファイルを、BODYとして送信する String fileName = getClass().getResource("userlist.xlsx").getFile(); template.sendBody(new File(fileName)); // 期待値を満たしていることを確認 mock.assertIsSatisfied(); // BODYを取得して、タイトル、Userの数を確認 UserList userList = mock.getReceivedExchanges().get(0).getIn().getBody(UserList.class); assertThat(userList.title, is("ユーザリスト")); assertThat(userList.users, hasSize(5)); }

共有できるので、データ変換のオプションとして提供 モデラーでのコンポーネント Spring XMLをもとに、モデラーのコンポーネントをどのように提供するか検討する データ変換として提供 <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:unmarshal"/> <unmarshal> <custom ref="xlsBeansDataFormat" /> </unmarshal> <to uri="mock:unmarshal" /> </route> </camelContext> <bean id="xlsBeansDataFormat" class=“jp.co.nttcom.eai.component.xlsbeans.XLSBeansDataFormat" > <property name="objectType" value="jp.co.nttcom.eai.model.UserList" /> </bean> 共有できるので、データ変換のオプションとして提供 objectTypeはパラメータ