文档章节

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

 糊搞
发布于 2015/04/20 23:59
字数 926
阅读 2359
收藏 20

1. 部署及运行

1.1. 部署

请参见“JFinal教程1——小白的第一个JFinal程序”(http://my.oschina.net/u/1175852/blog/261235)中的相关章节,部署应用到Tomcat的步骤讲得比较详细。部署后结构如下图:

 

可以看到,ConsumerProvider都依赖Api项目。

 

1.2. 运行

ConsumerProvider无论谁先启动都可以,输入URL后,可以看到JFinal Demo原装页面了:

 

查看管制台,Provider输出了数据操作的SQLActiveRecordPlugin.setShowSql(true)),

 

页面和Provider都做出了期望的响应,整个Demo就此结束了吗!实际却不是,笔者在此处遇到好几个问题,后面将这些问题和解决方案一一道来。

 

1.3. Druid监控

通过Provider服务的“/druidaction可打开Druid监控页面:

 

即使可以通过启动类将Provider做为一般Java应用启动,但还是将其建成Web项目,原因就在于只有Web项目可以打开Druid监控。对于开发者来说,Sql的执行效率数据很有用。

 

1.4. 问题及解决方案

1.4.1. Controller.getModel(class)问题

Demo运行起来后,对Blog进行创建和修改操作时出现了“Html 500”的错误,Consumer中报错如下:

 

Blog列表功、创建和修改都没有问题,唯独保存功能出现异常。

 

通过调试,查到了问题的根源。在TableMapping中,与Blog表对应的Table数据中没有字段信息。因为字段信息是在ActiveRecordPlugin启动时通过TableBuilder从数据库中获取的。

此问题在一年前向 @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 集群


     

© 著作权归作者所有

共有 人打赏支持
粉丝 82
博文 5
码字总数 10741
作品 0
深圳
程序员
加载中

评论(4)

h
hypocrite11
JFinal 2.2应该不用这么麻烦做的吧。能做个2.2的demo吗
糊搞

引用来自“唐阳”的评论

比如说仍然用dubbo将service 端的table 信息传入consumer 端?
真实业务下不现实,因为它会暴露服务端机密。 其实Model就不适合当成Dto,还是用Java Bean靠谱。。。后端用Model转Java Bean,性能也还可以的。
五杀联盟
五杀联盟
比如说仍然用dubbo将service 端的table 信息传入consumer 端?
五杀联盟
五杀联盟
能不能自动注册?
JFinal 中使用 Dubbo —— 1 改造JFinal Demo

Dubbo Demo概述 此Demo实际在2014年上半年就已经完成了,只是到最近才有时间和心情写完此文。同时,将JFinal升级到了1.9,并采用Maven构建项目。 另外,仔细想了想,Provider其实可以不依托T...

糊搞
2015/04/20
0
16
JFinal 中使用 Dubbo —— 3 集群

集群 1.1. 部署结构 下面是一个简单的Cunsumer端服务器和Provider端服务器分别集群的部署图: 在个人开发机上,实现Cunsumer端服务器集群难以实现,所以此Demo中只实现Provider端服务器集群,...

糊搞
2015/04/21
0
25
JFinal-Beetl-Shiro(JdbcRealm)-例子

JFinal-Shiro-JDBC-Demo http://git.oschina.net/yinjun622/JFinal-Shiro-JDBC-Demo 简单实现@JFinal与Shiro整合例子 1、工程通过Eclipse直接导入,部署到tomcat中; 2、新建jfinalshiro数据......

leon_rock
2014/02/27
0
12
SAE 部署java web 框架 Jfinal 全过程

刚刚通过SAE高级开发者认证于是准备在sae 部署我的web应用 应用使用了jfinal框架 了解了一下 似乎部署过程可能有一些问题 百度一下也没有太多的资料只好自己探索了 第一个问题 503 - 连接池问...

12叔
2014/03/17
0
9
OSC上关于Jfinal的提问整理(一)

看见Jfinal很火,就手痒痒了,想学一下,无奈入门较慢,没有找到比较全的文档。于是就经常看讨论区大家的提问与解答。后来就忽然萌生了整理下来的想法。其中的问题如果是@Jfinal 回答的,那我...

木川瓦兹
2013/04/23
0
21

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
4
2
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
1
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
1
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
1
0
麒麟AI首席科学家现世

8月31日,华为发布了新一代顶级人工智能手机芯片麒麟980,成为全球首款7nm工艺手机芯片,AI方面也实现飞跃,支持人脸识别、物体识别、物体检测、图像分割、智能翻译等。 虽然如今人人都在热议...

问题终结者
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部