1. 移动设备和后台服务之间的交互协议对比:
(1) http协议:同步,无状态协议,不支持推送。单向通信,要获得信息必须由设备端自己发起请求。基于TCP/IP提供网络连接。
缺点在于: Http方式的通信,都是由客户端发起的,缺乏服务器主动通知客户端的机制,在需要通知的场景下,需要客户端不断轮询服务器,反复的轮询需要耗费额外的资源。
(2) mqtt协议:基于消息传递,异步,可以保持设备和服务之间的长连接,避免反复轮询,减少资源消耗,所以更加省电。
mqtt协议可以建立双向连接,所以可以使用推送。
(3) mqtt协议优势:使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。使用TCP/IP提供网络连接,更加安全可靠。
(4) WebSocket协议:基于TCP的协议,可以实现服务器和客户端全双工通信,即允许服务器主动发送消息给客户端。WebSocket使用的是Http端口,由服务器判断该协议是http还是Websocket协议,但是WebSocket的数据传输和http没有任何关系。
(5)mqtt和WebSocket的区别:两者不是一个东西,需要分清楚,mqtt主要做原生设备的通信,即手机,手台等。但是WebSocket是浏览器(html5)和后台通信。解决的问题也不同。
(6) mq的缺陷:消息传递路劲变长,延时增加,消息发送者和接收者无法直接通信,发送者无法知道接收者的执行结果,这一点很致命。
2. Mq可以理解为一个服务器,MQ和app之间的通讯方式采用mqtt,双向连接,MQ消息可以直接推送到app端,采用发布/订阅模式。mq是基于TCP/IP存在的。
3. java注解:用于代替配置文件
(1)Java JDK自带注解分为三类: @Override @Deprecated @Suppvisewarnings
@Override 是用来表示子类覆盖父类的方法
@Deprecated 是用来表示该方法已经过时
对于已经过时的方法,在使用的时候,编译器会给我们一个警告信息。
对于已经过时的方法,如果我们还想使用,就用@SuppressWarning("deprecation")来标注,表示忽略此警告。
(2)Java 第三方注解:包括 Spring的注解和 Mybatis的注解,以下我们详细解释一下:
Spring注解,主要包括 @Autowired @Service @Repository
Mybatis注解,主要包括 @InsertProvider @UpdateProvider @Options
(3)自定义注解:这个我们之后进行解释。
注意:注解按照运行机制,可以分为 源码注解---编译是注解----运行时注解
(1)源码注解:只在源码中存在的注解,编译成.class文件就不存在了
(2)编译时注解: 在源码和.class文件中都存在,像 @Override @Deprecated @Suppvisewarnings都是编译时注解
(3)运行时注解:运行阶段才会起作用,会影响运行逻辑。像 @Autowired这种自动注入的注解就是运行时注解。
我们来具体讨论下Spring注解和Mybatis注解:
Spring注解详解:
Spring常用的注解分为以下两类:
第一类:@Autowired @Qualifier @Resource
第二类: @Repository @Service @Controller @Component(不常用)
先来分析第一类 :
(1) @Autowired 用于注入属性,属性包括(成员变量,方法或者构造函数),当有多个bean的时候,通过@Qualifier("name")进行标识。
(2) @Resource 和 @Autowired 作用相同,区别在于 @Autowired是通过 byType 自动注入, @Resource是通过 byName自动注入(默认),也可以选择通过byType自动注入,需要配置。
再来分析第二类: 第二类是装配好自己,供第一类使用的。这一类注解主要是对类进行注释,对接口无要求,一般不注释接口。
(1) @Repository 存储层使用,即dao层。
(2) @Service 业务层使用,即service层。
(3) @Controller 控制层,表现层使用。用于前台页面和service(业务)层进行数据交互的时候使用。一般配合@RequestMapping("/user")指定调用service的父路径。
(4) @RequestMapping("/user")是前端页面传递数据到后台的第一层,通过父路径找到处理业务逻辑的Service.
第二类装配好自己,将自己变成一个bean的形式,供第一类在程序中进行调用,利用spring直接装配,免去了重新new对象,变得简单方便使用。
2018/6/7更。
3. wcf:
(1) 可以将wcf理解成一个服务,后台将接口写完之后,封装成wcf服务的形式,进行发布。
其他平台可以直接调用该wcf服务,间接调用该服务中的接口,实现参数的传递。
我们用于生成wcf服务的接口代码全部是用c#写的,可以在客户端用java进行调用,用wcf的优势在于,跨平台跨语言,将耦合性降到最低。
使用wcf发布的web服务可以被各种技术平台远程调用,关键是wcf发布了符合业界标准的WSDL,各种技术平台利用各自的工具将这种WSDL解释成自身所能接受的语言,自己再直接进行调用即可。
(2)调用WSDL生成想要的客户端代码,比如要生成java客户端代码,最常用的方式是 axis2 和 xFire,也可以在命令行直接执行,还有一种是eclipse插件的方式(Code Generator Wizard).
(3)客户端调用wcf接口的时候,经常配合 Retrofit 一起使用.
Retrofit是一种开源的,类型安全的http客户端,需要配置maven依赖和Gradle依赖
Retrofit可以定义http接口和接口实现,每一个call都可以向远程服务器发起同步或者异步请求
Retrofit有5种注释:GET,POST,PUT,DELETE,and HEAD
@path表示替代函数 @Query表示查询参数 @FormUrlEncode指的是以表单键值对的形式传递, @Field指的是方法内部的参数,注解内的是key值,传递的形参是value值。
4. java多线程和回调:
(1)同步调用:类A的方法调用类B的方法,等待B方法执行完之后,A方法接着执行,适用于B方法执行时间不长的情况下,如果B方法执行时间过长,A就会被阻塞
(2)异步调用:为了解决同步调用可能会出现阻塞的情况,导致整个流程卡住,所使用的一种调用方式,做法是类A的方法通过新启一个线程的方式调用类B的方法,代码接着往下执行,所以需要对B结果的方法进行监听。
(3)所以产生了回调方法,回调方法是对异步调用的一种具体实现,即就是类A调用类B的方法,在A中还有一个Callback()回调方法,当B执行完之后,主动调用A的callback()方法通知A,即实现了监听,是一种双向的调用方式。
(4)将回调方法做成接口的形式,在类B中通过传参的方式去调用该回调方法。
5. 文件的监控:
通过java去监测某个目录下(目录A)文件的变动,JDK7中增加的API: File Watch Service
(1)这种做法是操作系统原生的文件系统监控器,这种监控无需遍历无需比较,基于信号收发,效率高。 jdk7对其进行了包装,可以同时开多个监控器(多个线程)。
(2)做法是在后台开启一个后台线程,用WatchService去监控该目录下的文件变化
(3)具体做法是创建一个监控器,获取监控服务兵指定需要监控的文件夹,new 一个刚才的监控器,实现ServletContextListener接口,控制该线程的启动和销毁(伴随着tomcat),在配置文件中进行配置。
以上是第一种解决思路,第二种解决思路是:使用commons-io包,区别如下
(1)watchService是采用扫描式的,效率低,commons-io是使用事件驱动的,效率高
(2)watchService不能对子文件夹进行监控,只能提示目录被修改,无法对文件类型进行过滤。commons-io可以对文件类型进行过滤。
(3)commons-io可以监控文件夹以及文件的创建,删除和修改,采用线程去定时刷新监测文件的变化情况。
(4)commons-io主要分为三部分:FileUtils, IOUtils 和 目录和文件监听。