解決osgi spring 事務配置問題
前久看了一篇文章,
http://www.javaeye.com/topic/315257
裡面說
由於目前還無法解決 osgi 環境下的 aspectj 問題 , 所以 , 處理事務無法使用 tx:advice 和 aop:config, 改用 DataSourceTransactionManager.
後又看了一篇文章頁是他的,說Equinox Aspects可以解決這個問題。
於是去看了看,現在問題已經解決了。
以下我把我的例子的整個流程寫一下。
一.jar包的準備,我用的是eclipse環境
1).首先去 http://download.eclipse.org/equinox/ 下載
equinox-SDK 這裡我用的3.4的 配置事務的 3.5好像有問題。
2).去 http://www.springsource.org/osgi 下載
spring-osgi-1.2.0-rc1.zip
spring-osgi-1.2.0-rc1-with-dependencies.zip
3).去 http://www.springsource.org/download 下載
spring-framework-2.5.6.zip
spring-framework-2.5.6-with-dependencies.zip
4).去 http://www.eclipse.org/aspectj/downloads.php 下載
aspectj-1.6.1.jar
5).去 http://www.eclipse.org/equinox/incubator/aspects/equinox-aspects-quick-start.php 下載
org.eclipse.equinox.weaving-incubation-1.0.0.200807082136-archive.zip
下載好了就先解壓吧。
二.配置eclipse的環境
首先,我們建一個環境專案,裡面放jar包就可以了。
File->NewProject 選general->project 起個名字,我的是myTargetPlatform2。在這個專案裡面建立一個目錄,目錄名是 target
在target裡放入用到的包:
spring-osgi要用到的包
spring-osgi-annotation-1.2.0-rc1.jar
spring-osgi-core-1.2.0-rc1.jar
spring-osgi-extender-1.2.0-rc1.jar
spring-osgi-io-1.2.0-rc1.jar
spring-osgi依賴包裡的
com.springsource.net.sf.cglib-2.1.3.jar
com.springsource.org.aopalliance-1.0.0.jar
spring的包
spring.jar
這裡是執行要用到的包
org.eclipse.osgi_3.4.0.v20080605-1900.jar
這個是Equinox Aspects的
org.eclipse.equinox.weaving.aspectj_1.0.0.200807082136.jar
org.eclipse.equinox.weaving.caching_1.0.0.200807082136.jar
org.eclipse.equinox.weaving.caching.j9_1.0.0.200807082136.jar
org.eclipse.equinox.weaving.hook_1.0.0.200807082136.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
放好後,window->preferences plug-in Development->Target Platform 點一下。
這時旁邊有add點一下,直接點next,點add,這時可以選路徑,選擇前邊專案的裡的target目錄,同時設定一下Name。選定你建立好的平臺(黑體是選定)。可以了。
三.建立專案。這裡不說了,我把專案上傳,自己匯入一下吧。
org.aspectj.runtime
org.aspectj.weaver
分別是aspectj-1.6.1.jar包裡的2個jar。
我沒用ibatis,讀取配置好像有問題,
我的spring是bundle的方式載入的,ibatis包是在dao實現的專案裡classpath載入的,是讀取不到ibatis的配置,看網上說是classloader的問題,希望高手能給解決一下。
這裡事務用的標籤式的事務。在實現類裡配置的。
啟動,下邊有圖是用到的包。
com.myTest.service.daoJdbcImpl 專案下有資料庫配置要改一下。
資料庫測試表結構
DROP TABLE IF EXISTS `mytest_user`;
CREATE TABLE `mytest_user` (
`id` bigint(20) NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
`sex` tinyint(1) default 0,
`address` varchar(255) default '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在實現類的事務標籤那裡修改一下,改為
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
忘記加事務回滾的,不過我測試不加也回滾了。下邊有個文章介紹事務的
http://www.ibm.com/developerworks/cn/java/j-ts1.html?ca=drs-tp4608
跨bundle的事務的測試程式碼也寫好了,有興趣的可以下載跑一下。spring-osgiTest2.rar
做了一個簡單quartz的bundle,使整體不依賴quartz包,bundle的啟動,停止都會啟動停止任務。spring-osgiTest3.rar
到 http://malixxx.javaeye.com/blog/560674 下載程式碼