2019独角兽企业重金招聘Python工程师标准>>>

开发前准备

  • 在本机配置好快嘉框架,参考快嘉框架v1.3更新及使用手册
  • 开发工具及安装规划,参考开发工具及安装规划

将快嘉demo导入eclipse,调试demo-Rest和demo-batch

eclipse导入快嘉框架代码

选择existing maven projects

选择快嘉框架源码目录,不要导入base和bundle模块

导入eclipse后,项目视图大概如下所示,maven工程需要时间较长,请等待

maven工程全部导入后,整个eclipse视图大概如下所示


有个插件用法的错误提示,不用管它,点“resovled all later” 按钮,弹出界面如下,点“OK”按钮关闭掉。

eclipse调试demo-Rest



如果没啥问题,正常显示如下
有可能会出如下问题

这个是eclipse工作空间下的demo-Rest部署目录(一般是${eclipseWorkspace}.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\demo-Rest\WEB-INF)没有同步更新web.xml导致,我理解是eclipse的maven插件对profile的支持还没有很完善,按照以下方法处理就可以了,处理完后能持续用好长一段时间,这个问题在调试的过程中可能还会出现,出现一次处理一次就好了。
源码目录demo/Rest/Main下执行“mvn clean package -Pnocheck,local”后,target目录下会生成demo-Rest目录,将demo-Rest\WEB-INF\web.xml替换掉${eclipseWorkspace}.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\demo-Rest\WEB-INF\web.xml后,重启eclipse中的tomcat即可。

eclipse调试demo-batch


在demo-batch工程里打开com.fastjrun.demo.BatchInit类,该参数提供了main函数
配置运行参数

点“Run”按钮

确保两个任务正常执行

用法:接口变化

#### 在demo_user.xml中新增退出接口定义,在name为userServiceRest的节点下新增名为logout的method节点

2、logout的method节点定义如下

<method name="logout" version="" path="logout" remark="登出"><request><object name="head" new="false"class="com.fastjrun.packet.BaseRestRequestHead"></object><object name="body" new="true"class="packet.user.LogoutRestRequestBody"><field name="uuid" dataType="java.lang.String" length="64"canBeNull="false" remark="登录凭证" /></object></request><response><object name="head" new="false"class="com.fastjrun.packet.BaseRestResponseHead"></object></response>
</method>

3、在快嘉源码目录下执行如下命令,重新生成Bundle代码,并发布demo-bundle.jar到本地仓库

cd demo
mvn clean install -Pnocheck -pl Bundle

4、在demo-service-impl工程上执行Maven->>update project…

5、执行完后,demo-service-impl工程下的UserServiceImpl报错,出错信息和解决方法如截图所示
6、我们在UserServiceImpl重载logout方法如下

@Override
public BaseRestResponse<BaseRestDefaultResponseBody> logout(BaseRestRequest<LogoutRestRequestBody> request) {String uuid=request.getBody().getUuid();
String deviceId = request.getHead().getDeviceId();this.coreUserService.logOut(uuid, deviceId);
return RestResponseHelper.getSuccessResult();
}

7、做单元测试,单元测试类(src/test/java/com/fastjrun/demo/service/impl/UserServiceRestImplTeset.java)
先执行登录的单元测试用例testLogin

记录下成功后的uuid:1b633c6889ec451eb0f00d63c7244177 再执行登出的单元测试用例testlogout

@Test
public void testLogout() {BaseRestRequest<LogoutRestRequestBody> request = new BaseRestRequest<LogoutRestRequestBody>();BaseRestRequestHead head = new BaseRestRequestHead();LogoutRestRequestBody body = new LogoutRestRequestBody();body.setUuid("1b633c6889ec451eb0f00d63c7244177");String deviceId = "servicetest";head.setDeviceId(deviceId);request.setHead(head);request.setBody(body);BaseRestResponse<BaseRestDefaultResponseBody> result = userServiceRest.logout(request);JSONObject jsonObject = JSONObject.fromObject(result);log.info(jsonObject);}

执行结果如下

8、单元测试完成后,参考快嘉框架v1.3使用手册重新生成demo-Rest.war,新的war中提供了这次将提供了退出接口的服务,这里笔者不再赘述如何用postman来测试验证,请读者自行实践。

至此,一个接口如何增加的例子就讲完了,这个接口确实复用了自动登录接口中用到的核心服务CoreUserService提供的logout方法,所以实现起来很快;但即使没有这个可复用的方法,重头写起工作量应该也不会很大,总之,接口新增、修改、版本升级我们都可以在这个demo_user.xml文件进行,然后再去调整因为调整这个文件后导致的实现类的变化即可。

用法二:表结构变化

这里需要维护的是pdm文件,pdm文件变化后,在快嘉源码目录下执行如下命令,将会重新生成Base代码,并发布demo-base.jar到本地仓库

cd demo
mvn clean install -Pnocheck -pl Base

Base模块中的代码都是对应于数据库单表的实体bean和基于该实体bean的增删改查的基本操作类,这里贴一份BaseUserDaoTest.java代码,大家可以参考这份代码研究一下Base中实体bean的基本操作类的相关用法

public class BaseUserDaoTest extends BaseSpringTestNGTest {@AutowiredBaseUserDao baseUserDao;@Testpublic void testInsert() {User user = new User();String curTime = TimeHelper.getCurrentTime(TimeHelper.DF17);Timestamp curDate = new Timestamp(System.currentTimeMillis());user.setCreateTime(curDate);user.setEmail("sa4@fastjrun.org");user.setLastLoginTime(curTime);user.setLastModifyTime(curDate);user.setLoginErrCount(0);user.setLoginName("sa3");user.setLoginPwd("1234566777");user.setMobileNo("03211111112");user.setNickName("sa3");user.setSex(2);user.setStatus("1");baseUserDao.insert(user);}@Testpublic void testSelectById() {User user = baseUserDao.selectById(38);log.info(user);}@Testpublic void testUpdateById() {User user = baseUserDao.selectById(38);log.info(user);Timestamp curDate = new Timestamp(System.currentTimeMillis());user.setCreateTime(curDate);user.setLastModifyTime(curDate);baseUserDao.updateById(user);User user2 = baseUserDao.selectById(38);log.info(user2);}@Testpublic void testDeleteById() {User user = baseUserDao.selectById(38);log.info(user);int res = baseUserDao.deleteById(1);log.info(res);User user2 = baseUserDao.selectById(1);log.info(user2);}@Testpublic void testTotalCount() {int res = baseUserDao.totalCount();log.info(res);}@Testpublic void testQueryForList() {List<User> list = baseUserDao.queryForList();if (list != null) {Iterator<User> itera = list.iterator();while (itera.hasNext()) {log.info(itera.next());}}}@Testpublic void testQueryForLimitList() {RowBounds rowBounds = new RowBounds(2, 4);List<User> list = baseUserDao.queryForLimitList(rowBounds);if (list != null) {Iterator<User> itera = list.iterator();while (itera.hasNext()) {log.info(itera.next());}}}@Testpublic void testTotalCountCondition() {int res = baseUserDao.totalCountCondition(" and sex =1");log.info(res);}@Testpublic void testQueryForListCondition() {List<User> list = baseUserDao.queryForListCondition(" and sex =0");if (list != null) {Iterator<User> itera = list.iterator();while (itera.hasNext()) {log.info(itera.next());}}}@Testpublic void testQueryForLimitListCondition() {RowBounds rowBounds = new RowBounds(2, 4);List<User> list = baseUserDao.queryForLimitListCondition(" and sex =1",rowBounds);if (list != null) {Iterator<User> itera = list.iterator();while (itera.hasNext()) {log.info(itera.next());}}list = baseUserDao.queryForLimitListCondition(" and sex =0",rowBounds);if (list != null) {Iterator<User> itera = list.iterator();while (itera.hasNext()) {log.info(itera.next());}}}@Testpublic void testQueryForListConditionMul() {final RowBounds rowBounds = new RowBounds(2, 4);final Semaphore semaphore = new Semaphore(3);ExecutorService executorService = Executors.newCachedThreadPool();List<Future<Boolean>> resultList = new ArrayList<Future<Boolean>>();for (int i = 0; i < 1000; i++) {try {semaphore.acquire();} catch (InterruptedException e1) {log.warn("can't acquire semaphore", e1);continue;}Callable<Boolean> run = new Callable<Boolean>() {public Boolean call() {try {testCondition(rowBounds);} catch (Exception e) {log.warn("BatchInsert Task for", e);} finally {// 访问完后,释放semaphore.release();}return true;}};Future<Boolean> future = executorService.submit(run);resultList.add(future);}Boolean isFinished = false;while (!isFinished) {for (Future<Boolean> fs : resultList) {try {isFinished = !isFinished && fs.get();log.debug(isFinished);if (!isFinished) {resultList.remove(fs);break;}} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}}}private void testCondition(RowBounds rowBounds) {List<User> list = baseUserDao.queryForLimitListCondition(" and sex =0",rowBounds);if (list != null) {Iterator<User> itera = list.iterator();while (itera.hasNext()) {log.info(itera.next());}}}}

转载于:https://my.oschina.net/fastjrun/blog/888222

使用快嘉框架开发项目示例相关推荐

  1. easyui框架前后端交互_Vue+ElementUI+.netcore前后端分离框架开发项目实战

    点击上方"前端教程",选择"星标" 每天前端开发干货第一时间送达! 转自:我心依旧.cnblogs.com/-clouds/p/11633786.html 框架 ...

  2. Vue+ElementUI+.netcore前后端分离框架开发项目实战

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Smile and stop complaining about th ...

  3. G0第25章:Gin框架进阶项目实战

    1 Gin框架源码解析 通过阅读gin框架的源码来探究gin框架路由与中间件的秘密. 1.1 Gin框架路由详解 gin框架使用的是定制版本的httprouter,其路由的原理是大量使用公共前缀的树结 ...

  4. Android:理想的框架开发母板——高焕堂

    前言 依据<第三智慧>一书作者Danah Zohar的研究,东方人头脑思维偏向模拟(如Neural-network)模型,而西方人偏向牛顿的推里(如Rule-based)思维习惯.根据笔者 ...

  5. 快嘉开发框架1.0和示例介绍及使用说明

    2019独角兽企业重金招聘Python工程师标准>>> 快嘉开发框架1.0和示例介绍 快嘉开发框架将一个标准的J2EE项目拆分为基础组件(Base).持久层组件(Persistenc ...

  6. 急如闪电快如风,彩虹女神跃长空,Go语言高性能Web框架Iris项目实战-初始化项目ep00

    在Golang Web编程的世界里,君不言高性能则已,言高性能必称Iris.彩虹女神的名号响彻寰宇.名动江湖,单论一个快字,无人能出其右,就连以简洁轻量著称于世的Gin也难以望其项背,只见彩虹女神Ir ...

  7. 客快物流大数据项目(一百零七):物流信息查询服务接口开发解决方案

    文章目录 物流信息查询服务接口开发解决方案 一.业务需求 二.系统架构演变 1.​​​​​​​集中式架构 2.​​​​​​​​​​​​​​垂直拆分 3.分布式服务 ​​​​​​​4.面向服务架构(SO ...

  8. Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)

    Java框架JSON-RPC项目demo代码实战 备注  JAVA WEB配置虚拟目录(转自21天java web开发) https://blog.csdn.net/wjxbj/article/det ...

  9. dotnet 是 前30个增长最快速度的开源项目中排名第一的开发平台

    CNCF 的博客 发了一篇文章 <Update on CNCF and Open Source Project Velocity 2020>,中文翻译参见 2020年CNCF和开源项目开发 ...

最新文章

  1. DbVisualizer Personal 7.0 数据库连接工具免安装版本获取,直接解压即可使用!
  2. java-io之RandomAccessFile
  3. AUTOSAR专业知识篇(八)-ID.3 和大众的电气化平台
  4. php如何获取服务器时间_php如何获取当前日期
  5. 微信web-view 开发_在不到7个月的时间里我如何成为一名Web开发人员-以及如何
  6. mysql xmlhttp_php_xmlhttp 乱码问题解决方法
  7. NB-IoT 基于蜂窝的窄带物联网
  8. 打麻将 - 基于R语言
  9. ubuntu右上角没有网的问题解决
  10. 微信小程序代码大于2M的一种解决方法
  11. 屏幕录制视频时有杂音怎么办?
  12. 准备春招 CSDN博客不定期脱更 见谅
  13. android商城demo,3 分钟快速 Demo(Android)
  14. 自动驾驶决策控制及运动规划史上最详细最接地气综述
  15. B2B企业供应链协同系统解决方案:搭建在线采购交易、数据网络化的协同办公系统
  16. 前端三件套系例之CSS——CSS3基础样式
  17. 人生就像一场旅行,前进的过程也在不断的完善自我,现列出自己的缺点,今后用来反思自我。
  18. excel打开csv文件乱码解决办法
  19. 闪迪u盘适合装linux,闪迪给U盘加了一个接头,解决了iPhone用户最大烦恼
  20. 家庭支出系统c语言,家庭支出管理系统—c语言程序设计讲述.doc

热门文章

  1. 达梦数据库的基本使用
  2. TSQL编写存储过程计算1!+2!+3!+…+N!
  3. 如何用VC++新建一个项目
  4. 超图 for javascript 版本入门程序讲解
  5. 【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈)
  6. CMD命令行下载文件
  7. 使用CXF开发WebService程序的总结(一):什么是webservice
  8. Oracle中根据表明获取对应表触发器名称
  9. 在O(N)时间内求解 正数数组中 两个数相加的 最大值
  10. 安装ubuntu时将boot目录单独挂载的意义