文档章节

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

 糊搞
发布于 2015/04/20 23:59
字数 926
阅读 2254
收藏 20
点赞 4
评论 4

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


     

© 著作权归作者所有

共有 人打赏支持
粉丝 80
博文 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-admin 3.2 发布,beetl 模板升级到 2.7.14

jfinal-admin 3.2 版本正式发布啦。 基于JFinal的后台管理系统,采用了简洁强大的JFinal作为web框架,模板引擎用的是beetl,数据库用mysql,前端bootstrap框架。 演示地址 http://jad.yxyun...

IT小香猪 ⋅ 04/19 ⋅ 0

Jboot v1.4.9 发布,核心 JFinal 升级到 3.4 最新版本

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 05/03 ⋅ 0

JFinal 3.4 发布,将极速贯彻到 UI 层

jfinal 的终极目标是全面实现软件开发整个过程的极速开发,极大提升开发效率,极大降低学习成本,极大提升开发体验 jfinal 诞生头五年,已实现 WEB + ORM + AOP 层面的极速开发,赢得了大量开...

JFinal ⋅ 04/28 ⋅ 129

JAVA 极速WEB+ORM框架 - JFinal

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、p...

JFinal ⋅ 2012/03/18 ⋅ 496

JFinal 1.6可以无缝升级到最高哪个版本?

大约在JFinal 1.6的时候做了一个项目,一直运行至今。中途没升级也没做功能扩展,时至今日,需要做功能升级了,但是时隔太久远,基本不记得JFinal这个框架一路过来的升级过程了。所以想请求帮...

车开源 ⋅ 05/11 ⋅ 0

Jboot v1.5.3 发布,修复 bug 和优化缓存

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 05/17 ⋅ 0

kiplinglee/jfinal-ioc-plugin

jfinal-ioc-plugin JFinal 依赖注入插件 1.在JFinalConfig文件中配置IOC插件 @Overridepublic void configConstant(Constants me) { // 创建controller实现依赖注入me.setControllerFactory......

kiplinglee ⋅ 04/13 ⋅ 0

JFinal如何使用JNDI连接数据库

想用JNDI的方式连接数据库,但是JFinal中用的是DruidPlugin和ActiveRecordPlugin,没有看到用DataSource的地方?请问JFinal支持JNDI连接方式吗?怎么具体实现?...

zqq3436 ⋅ 06/11 ⋅ 0

JFinal(1.6)在Validator里执行过getFile,在Controller里取不到文件

JFinal在Validator里执行过getFile之后Validator中是可以取到文件及有关信息,但是在Controller里取不到文件,是不是我的姿势不正确?@JFinal

车开源 ⋅ 05/15 ⋅ 0

jfinal兼容oracle integer字段

为什么oracle integer字段用了number(3,0),jfinal生成的字段还是BigDecimal @jfinal

tianxia007 ⋅ 05/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 16分钟前 ⋅ 0

Spring mvc DispatchServlet 实现原理

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherSer...

轨迹_ ⋅ 27分钟前 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 35分钟前 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 42分钟前 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 51分钟前 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部