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 集群

相关文章
相关标签/搜索