JFinal 中使用 Dubbo —— 2 部署及運行

1. 部署及運行

1.1. 部署

請參見「JFinal教程1——小白的第一個JFinal程序」(http://my.oschina.net/u/1175852/blog/261235)中的相關章節,部署應用到Tomcat的步驟講得比較詳細。部署後結構以下圖:java

 

能夠看到,ConsumerProvider都依賴Api項目。數據庫

 

1.2. 運行

ConsumerProvider不管誰先啓動均可以,輸入URL後,能夠看到JFinal Demo原裝頁面了:架構

 

查看管制臺,Provider輸出了數據操做的SQLActiveRecordPlugin.setShowSql(true)),app

 

頁面和Provider都作出了指望的響應,整個Demo就此結束了嗎!實際卻不是,筆者在此處遇到好幾個問題,後面將這些問題和解決方案一一道來。ide

 

1.3. Druid監控

經過Provider服務的「/druidaction可打開Druid監控頁面:ui

 

即便能夠經過啓動類將Provider作爲通常Java應用啓動,但仍是將其建成Web項目,緣由就在於只有Web項目能夠打開Druid監控。對於開發者來講,Sql的執行效率數據頗有用。spa

 

1.4. 問題及解決方案

1.4.1. Controller.getModel(class)問題

Demo運行起來後,對Blog進行建立和修改操做時出現了「Html 500」的錯誤,Consumer中報錯以下:.net

 

Blog列表功、建立和修改都沒有問題,惟獨保存功能出現異常。調試

 

經過調試,查到了問題的根源。在TableMapping中,與Blog表對應的Table數據中沒有字段信息。由於字段信息是在ActiveRecordPlugin啓動時經過TableBuilder從數據庫中獲取的。code

此問題在一年前向 @JFinal 提出過,問題地址爲:http://www.oschina.net/question/1175852_149042

解決方案有3種:

1. 寫個APIBlog表手動添加字段信息,也就說ConsumerProvider所有采用Model交互。

2. 建立與Model對應的Java Bean,在Provider與數據庫打交道時經過反射在ModelJava Bean之間轉換,即採用Java Bean交互,但數據庫操做仍是使用ActiveRecordPlugin

3. 放棄ActiveRecordPluginConsumerProvider所有采用Java Bean交互。數據庫操做採用HibernateIbatisORM

 

以上方案各有利弊,筆者爲了修改量小,採用了第一種方案,即寫了個API手動添加Blog表的字段信息。

  • 建立「com.jfinal.plugin.activerecord.TableInitKit.java」,名稱空間是「com.jfinal.plugin.activerecord」,便於訪問JFinalTableMapping的保護方法putTable()

public final class TableInitKit {

	/**
	 * 手動初始化Model對就的Table字段數據
	 * 
	 * @param tableName
	 *            表名
	 * @param modelClass
	 *            model的Class
	 * @param attrTypeMap
	 *            字段類型Map
	 */
	public static void init(String tableName, Class<? extends Model<?>> modelClass,
			Map<String, Class<?>> attrTypeMap) {
		init(tableName, "id", modelClass, attrTypeMap);
	}

	/**
	 * 手動初始化Model對就的Table字段數據
	 * 
	 * @param tableName
	 *            表名
	 * @param primaryKey
	 *            主鍵名
	 * @param modelClass
	 *            model的Class
	 * @param attrTypeMap
	 *            字段類型Map
	 */
	public static void init(String tableName, String primaryKey,
			Class<? extends Model<?>> modelClass, Map<String, Class<?>> attrTypeMapTypeMap) {
		Table blogTable = new Table(tableName, primaryKey, modelClass);
		blogTable.setColumnTypeMap(attrTypeMapTypeMap);

		TableMapping.me().putTable(blogTable);
	}
}
  • ConfigDemoConsumerConfig.afterJFinalStart()方法中添加以下代碼:

@Override
	public void afterJFinalStart() {
		Map<String, Class<?>> blogColumnMap = new HashMap<String, Class<?>>();
		blogColumnMap.put("id", Integer.class);
		blogColumnMap.put("title", String.class);
		blogColumnMap.put("content", String.class);

		TableInitKit.init("blog", Blog.class, blogColumnMap);
		
		System.out.println("Blog表字段模擬完成。");
		
		System.out.println("Demo consumer for Dubbo啓動完成。");
	}

重啓Consumer以後,保存功能正常。至此,初步功能和架構已經徹底能正常工做。



源碼地址:

JFinalDubboDemoApi.zip

JFinalDubboDemoConsumer.zip

JFinalDubboDemoProvider.zip


Dubbo文檔:

Dubbo 的文檔鏡像


系列文章:

JFinal 中使用 Dubbo —— 1 改造JFinal Demo

JFinal 中使用 Dubbo —— 3 集羣

相關文章
相關標籤/搜索