我们组有一个优良传统——借鉴于“冰桶挑战赛”的形式,采取点名的方式,促进团队成员每天利用一小段时间,不断的完善团队 wiki 的小游戏。

但有时候忙于业务,可能会忘记,所以我写了一个小应用,提示大家【记得写 wiki 啦】。

项目使用的环境和技术选型如下:

  • 服务器环境:centos, java 7
  • 开发环境:window 10,java 7,IDEA
  • 框架:spring-boot 1.5.21.RELEASE

项目需求

  1. 如果被点名人下午5点还没更新wiki,发送一条企业微信消息,提醒他写wiki
  2. 如果被点名人第二天早上9点还没写,发送一条企业微信消息,提醒他补充,并且要点名。
  3. 如果被点名人第三天早上9点还没写,发送一条企业微信消息给管理员

设计实现

分析需求,要实现上面的功能,需要:

  • 爬取网页信息,分析每个人写 wiki 的时间
  • 判断是否完成 wiki
  • 设置定时任务,发送消息给对应的人
  • 需要人员姓名和企业微信账号的映射表

针对以上功能,spring boot 官方有对应的实现,scheduling-tasksconsuming-rest

基本的功能点已经明确,然而在实现的过程中还有一些小坑。在文章最后会有补充,这里暂且不表。

异常与日志

使用 spring boot 自带的日志 logback,简单的配置如下:

server.port=8916

logging.level.root=warn
logging.level.org.springframework.web=ERROR
logging.level.com.hbgj=warn
logging.file=logs/happy-wiki.log

关于异常,很多地方用 try...catch 进行捕获,感觉有点 low,看后面有没有想法优化一下。

简单的部署上线

打包

在项目的根目录下执行:

$ mvn clean package

会在 target/ 文件夹下生成 jar 包,假设我们生成的包名为:happy-dog-0.0.1.jar。

发布到线上

在项目根目录下打开 shell,输入:

$ scp target/happy-dog-0.0.1.jar root@192.0.0.1:/home/web/happy-dog-0.0.1.jar

然后输入密码,等待上传结束。

note:root 是服务器用户名,@192.0.0.1是服务器地址,/home/web/happy-dog-0.0.1.jar 表示 jar 包在服务器上的位置。

运行项目

使用 ssh 登录服务器,进入对应的文件夹内,在本项目中,依次执行:

$ ssh root@192.0.0.1

$ cd /home/web

运行项目有两种方法,一种临时,一种后台。

方法一:

$ java -jar happy-dog-0.0.1.jar

这种方式特点是ssh窗口关闭时,程序中止运行。或者是运行时没法切出去执行其他任务。但一般我们想要程序一直在后台运行,所以有方法二:

$ nohup java -jar happy-dog-0.0.1.jar >/dev/null 2>&1 &

查看和停止

输入下面的命令,查看 java 运行的进程。

$ ps -ef | grep java

可以看到我们项目运行的进程 id。

杀死进程:

$ kill -9 29382

查看日志

$ cat logs/happy-wiki.log

一些小坑

上面提到,我们使用的 java 版本为 java7,在爬取网页时,会出现 Connetion reset 错误,导致无法获取网页信息。

这是由于 C/S 两端TLS版本不适配导致,具体原因可参考这篇文章CS两端TLS版本不适配导致Connection reset问题

需要开启 java7 的 TLSv1.2,

  private static RestTemplate restTemplate =  new RestTemplate();

  static {
try {
// java 7 use TLSv1.2
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null, null, null); CloseableHttpClient httpClient = HttpClientBuilder.create().setSSLContext(context)
.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
restTemplate = new RestTemplate(factory);
} catch (Exception e) {
e.printStackTrace();
}
}

第二,需要判断某天是否是工作日,简单起见,写了个配置文件来记录一年中的节假日。

引用

在linux云服务器上运行Jar文件

linux下如何部署(执行)java jar包,并关闭此jar的进程

spring boot 从开发到部署上线(简明版)的更多相关文章

  1. spring boot 从开发到部署(二)—重启服务

    上篇中,我们开发并部署上线了一个 spring boot 项目.现在需要编写服务重启脚本,保证服务器重启后能够自动的运行我们的项目. /home/web/sprint-web/restart-happ ...

  2. spring boot本地开发与docker容器化部署的差异

    spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...

  3. Spring Boot框架开发的Java项目在CentOS7上的部署

    需求:上级拿来一份Spring Boot框架开发的Java项目代码让我在服务器上运行起来,只说了一句该框架是自带了Tomcat(不用重新安装Tomcat),一份代码下有两个项目(一个管理端项目,一个用 ...

  4. (转)Spring Boot(十二):Spring Boot 如何测试打包部署

    http://www.ityouknow.com/springboot/2017/05/09/spring-boot-deploy.html 有很多网友会时不时的问我, Spring Boot 项目如 ...

  5. Spring Boot(十二):spring boot如何测试打包部署

    Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...

  6. spring boot(十二)打包部署

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...

  7. Spring Boot(十二):Spring Boot 如何测试打包部署

    有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...

  8. 10个Spring Boot快速开发的项目,接私活利器(快速、高效)

    本文为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架.文件文档系统.秒杀系统.微服务化系统.后台管理系统等,希望能够给大家带来一点帮助:) 1.项目名称:分布式 ...

  9. Spring boot+CXF开发WebService

    最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的w ...

随机推荐

  1. .Net Core 给WebApi接口返回值添加全局的日期格式化

    public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddJsonOptions(option ...

  2. ES6 Class(类)(九)

    一.Class类1.构造函数 constructor(){} 说明:a.如果没有重新定义带参数的构造函数,类会默认为我们提供一个不带参数的隐式构造函数b.在创建类的实例时会自动调用类中的构造函数 2. ...

  3. error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用

    出现如下错误: error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 解决办法:

  4. WorkFlow三:配BO对象,事件触发工作流

    1.新建个BO对象的字段. 2.新建取数函数: 3.运行事物代码SWO1新建BO对象. 4.新建关键字段: 5.新建BO对象的事件: 6.添加处理方法: 6.调整对象状态,这里是本地对象,不需要释放, ...

  5. ta和夏天一起来了

    目录 ta和夏天一起来了 上半年,过去的就让去过去,遗憾的也别再遗憾. 下半年,拥有的请好好珍惜,想要的请努力去追. ta和夏天一起来了 ​ 转眼结束了2019的上半年,在这个月末, 季度末, 周末, ...

  6. java-log4j配置

    引入依赖: <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId ...

  7. JavaScript正则表达式进阶指南

    摘要:正则表达式是程序员的必备技能,想不想多学几招呢? 本文用JavaScript的exec方法来测试正则表达式. 例如,正则表达式**/F.*g/会匹配"以F开头,以g结尾的字符串&quo ...

  8. CAS 集群部署

    业务场景 单点登录服务器如果压力过大的情况,那么可以使用集群分担压力,但是cas 默认不支持session同步. 所以可以需要做session同步,可以使用j2cache 实现session同步.另外 ...

  9. 目标检测论文解读9——R-FCN

    背景 基于ResNet 101的Faster RCNN速度很慢,本文通过提出Position-sensitive score maps(位置敏感分值图)来给模型加速. 方法 首先分析一下,为什么基于R ...

  10. POJ 3155Hard Life(最大密度子图)

    论文出处:最小割模型在信息学竞赛终的应用 #include <iostream> #include <cstdio> #include <cstring> #inc ...