开发框架
临时状态(Transient)
当new一个实体对象后, 这个对象处于临时状态, 即这个对象只是一个保存临时数据的内存区域, 如果没有变量引用这个对象, 则会被jre垃圾回收机制回收. 这个对象所保存的数据与数据库没有任何关系, 除非通过Session的save或者SaveOrUpdate把临时对象与数据库关联, 并把数据插入或者更新到数据库, 这个对象才转换为持久对象.
Coding changes the world
当new一个实体对象后, 这个对象处于临时状态, 即这个对象只是一个保存临时数据的内存区域, 如果没有变量引用这个对象, 则会被jre垃圾回收机制回收. 这个对象所保存的数据与数据库没有任何关系, 除非通过Session的save或者SaveOrUpdate把临时对象与数据库关联, 并把数据插入或者更新到数据库, 这个对象才转换为持久对象.
后端建立websocket 前端连接上来,后台会主动推送agent脚本执行信息,由于采用netty框架,保证并发性,执行的结果是多线程处理的,通过websocket返回前端居然报错了,很是费解。症状见下图。
集群的Quartz 应用比起非集群环境,能提供两个关键的好处
*高可用性
*伸缩性
*负载均衡
高可用性的应用是指能以高百分率的时间服务于客户。在某些情况下,可能就是一周 7 天,一天 24 小时。对于其他的应用,可能只是“尽量多的时间”。
伸缩性意味着为增进应用自身能力,可以动态增加新的资源(如硬件) 到应用环境中的能力。在一个可伸缩的应用中,为达到增进能力的做法不涉及到改变代码或是设计。
获得伸缩性可不是变魔术那样。一个程序必须从一开始就要有合理的设计;支撑额外的能力通常要耗费管理上的努力来增加新的硬件(如内存) 或是启动程序更多的实例。
shadowsock可以说是目前最稳定的健康(bypass the firewall)上网方式,由clowwindy大神分享并开源了他的解决方案 github(master分支已被约谈删除,release还有),其原理导致firewall无法根据特殊关键字和连接方式屏蔽它, 具体的可以自行google
pip是 python 的包管理工具。在本文中使用 python 版本的 shadowsocks,此版本的 shadowsocks 已发布到 pip 上,因此我们需要通过 pip 命令来安装。1
2yum -y update
yum install -y python-setuptools && easy_install pip
1 | pip install shadowsocks |
安装完成后,需要创建配置文件/etc/shadowsocks/shadowsocks.json
1 | vi /etc/shadowsocks/shadowsocks.json |
[TOC]
去年就把这本javaer必读书——effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新。
我用的是Xshell客户端,有上传功能,但是linux必须先装lrzsz,也可以通过其他方式传到linux上1
yum -y install lrzsz
安装完成后,在终端输入rz,弹出上传窗口,上传文件即可
1 | mkdir /home/IntellijIdea |
先简单介绍一下quartz,Quartz是一个功能丰富的开源作业调度库,可以集成到几乎任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统。quartz可用于创建执行数十,数百甚至数十万个作业的简单或复杂的计划; 任务定义为标准Java组件的任务,可以执行任何可以对其进行编程的任何内容。Quartz Scheduler包含许多企业级功能,例如支持JTA事务和集群。
以上内容来自quartz官网。
我们会针对quartz的几个主要类进行分析,看一下quartz是如何实现定时调度功能
来自官方实例的example1
在写实体类时,经常会对域增加校验,例如@NotNull表示哪个字段不能为空,昨天晚上调试代码,就遇到了问题,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24@Entity
public class ApplicationCategory implements Serializable {
private static final long serialVersionUID = -8018302345969463947L;
@Id
@GeneratedValue
private Integer id;
@NotNull(message = "应用分类名称不能为空")
private String name;
private String remark;
@Override
public int hashCode() {
int result = id.hashCode();
result = 31 * result + name.hashCode();
result = 31 * result + (remark != null ? remark.hashCode() : 0);
return result;
}
.....
.....
//省略其他方法
}
springboot
在利用websocket主动推送信息给客户端的过程中,经常会遇到一个普遍需求,就是推送的消息要定向推送给不同的用户,或者解释的再普通一点,不同的消息推送给不同的session。例如一个用户admin,可以在多台设备登录,此时就有多个session,当一个设备向后台发起一个请求,处理时间较长(未采用客户端进行ajax轮训或者long poll时),采用websocket协议时,要针对不同session的操作定向返回操作结果。
下面来具体看看如何实现上述需求。
springboot对websocket支持很友好,只需要继承webSocketHandler类,重写几个方法就可以了1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class ResultHandler extends TextWebSocketHandler {
private static final Logger logger = LoggerFactory.getLogger(ResultHandler.class);
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
}
@Override
public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
}
@Override
public void afterConnectionClosed(WebSocketSession webSocketsession, CloseStatus status) throws Exception {
}
}
然后写一个简单的配置类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15@EnableWebSocket
@Configuration
public class WebSocketConfig implements WebSocketConfigurer{
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(resultHandler (), "/getResult").withSockJS();
}
@Bean
public ResultHandler resultHandler(){
return new ResultHandler();
}
}