Java面试题-实用技术

文件上传和下载如何实现?

数据较大时必须用文件上传,文件上传的本质是IO流的从操做;
客户端:
1)必须使用post,post才能携带大数据
2)必须设置type=“file” name=“f”必需要有名字;
3)必需要设置enctype=“multlpart/form-data”
服务器端:
1)经过request.getInputStream()获取字节输入流读取请求正文内容;
将上传内容获得,保存在服务器端,就完成了文件上传;
2)实际使用直接用框架中的api就能够,commons-fileupload是apache提供的一套文件上传工具;
文件上传实现:
导入commons-io包和commons-fileupload包;放在WEB_INF下的lib文件夹下。
文件下载有两种方法:
1.超连接下载:若是文件能被浏览器解析,点击就会打开文件,若是要下载,须要使用右键另存为,不能被浏览器解析的文件,点击就下载;
⒉.经过服务器流回写到浏览器下载;要设置MIME,即设置setcontentType(String mimeType);浏览器能解析的直接显示,不能解析的直接下载;
获取文件的mimeType类型: String mimeType=this.getServletContext().getMimeType(filename);
若是设置响应头respponse.setHeader("content-disposition","attachment;flename=下载的文件名称");无论浏览器能不能解析,都是下载操做;html

第三方的工做流有哪些?如何使用?

image.png
Activiti和JBPM:
JBPM5(Java Business Process Management)和Activiti都支持BPMN2.0规范。
jBPM5推翻了jBPM3和jBPM4的架构,使用了Drools Flow做为工做流的架构,而Activiti更像是jBPM4的延续。
jBPM5采用LGPL开源协议(若是修改LGPL协议的代码或者衍生,则全部修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议,因 此LGPL协议的开源 代码很适合做为第三方类库被商业软件引用,但不适合但愿以LGPL协议代码为基础,经过修改和衍生的方式作二次开发的商业软件采用);
Activiti采用宽松的Apache License2.0协议(鼓励代码共享并尊重原做者的著做权,容许对代码进行修改和发布而无论其用途)。
Git工做流:
Workflow.Net、NetBpm、OSWorkflow前端

对activemq、rabbitmq、kafuka的了解和使用?消息发送失败如何处理?如何预防消息的重复消费?

image.png
image.png
订阅方式:
ActiveMQ:点对点(p2p)、广播(发布-订阅);
RabbitMQ:work queue(工做队列)、Publish/Subscribe(发布订阅模式)、Routing(路由模式)、Topic(通配符模式)、Hreader()、RPC();
Kafka:点对点(p2p);
使用:
1)ActiveMQ:
在项目中,咱们使用的是SpringJMS操做activeMQ,已maven操做为例,首先先引用SpringJMS的依赖 及 activeMQ的依赖,而后在spring的配置中,
若是要配置消息的生产者的话,须要配置springjms的链接工厂,经过链接工厂配置 jmsTemplate实例,咱们可使用jmsTemplate进行消息的相关操做,另外咱们也须要配置消息的目的地,也是在spring的配置文件中配置配置队列 或者 主题。
消息的消费者和生产者配置差很少,不一样的是须要配置一个消息的监听器,监听器里面实现onMessage方法,在这个方法里面处理消息
2)RabbitMQ:
在咱们秒杀抢购商品的时候,系统会提醒咱们稍等排队中,而不是像几年前同样页面卡死或报错给用户。
像这种排队结算就用到了消息队列机制,放入通道里面一个一个结算处理,而不是某个时间断忽然涌入大批量的查询新增把数据库给搞宕机,因此RabbitMQ本质上起到的做用就是削峰填谷,为业务保驾护航。
服务间异步通讯
顺序消费
定时任务
请求削峰
Kafka:
日志收集:一个公司能够用Kafka能够收集各类服务的log,经过kafka以统一接口服务的方式开放给各类consumer,例如hadoop、HBase、Solr等。
消息系统:解耦和生产者和消费者、缓存消息等。
用户活动跟踪:Kafka常常被用来记录web用户或者app用户的各类活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,而后订阅者经过订阅这些topic来作实时的监控分析,或者装载到hadoop、数据仓库中作离线分析和挖掘。
运营指标:Kafka也常常用来记录运营监控数据。包括收集各类分布式应用的数据,生产各类操做的集中反馈,好比报警和报告。
流式处理:好比spark streaming和 Flink
消息发送失败如何处理:
1.自动重发
2.系统预警人工处理等
image.png
如何防止消息的重复消费:
​ 保证消息的惟一性,就算是屡次传输,不要让消息的屡次消费带来影响;保证消息等幂性;
​ 好比:在写入消息队列的数据作惟一标示,消费消息时,根据惟一标识判断是否消费过;java

svn和git冲突如何解决?

SVN解决冲突有三种选择:
​A、放弃本身的更新,使用svn revert(回滚),而后提交。在这种方式下不须要使用svn resolved(解决)
B、放弃本身的更新,使用别人的更新。使用最新获取的版本覆盖目标文件,执行resolved filename并提交(选择文件—右键—解决)。
C、手动解决:冲突发生时,经过和其余用户沟通以后,手动更新目标文件。而后执行resolved filename来解除冲突,最后提交。
Git
1)直接修改文件:
第一步,选择文件鼠标右击选择 Git-commit --提交到本地仓库
第二部,在文件同级空白处鼠标右击选择 tortoisGit --> pull,文件发生改变。
直接修改文件中数据,最后保存文件
第三步,选择文件鼠标右击选择 Git Commit --> 提交 -- >push 发布。
2)经过edit conflicts修改
选中文件,右击菜单选项 tortoiseGit --> Edit conflict
修改编辑区:将Theirs- 或者 Local-中须要的数据添加到Meged中。
保存时 标记冲突解决。linux

如何测试本身的接口?

postman、jmeter、soupUI、java+httpclient、robotframework+httplibrary等nginx

poi导入excel时若是数据溢出如何解决?

image.png
POI官方推荐解决内存溢出的方式使用CSV格式解析git

linux经常使用命令有哪些?

image.png

如何调用第三方的接口?

ajax(会出现跨域问题)
from表单(此方法在Android端不适用),form的提交不存的跨域的问题,因此能够考虑使用form的action方法来解决。)
经过Java代码调用(Android端适用,导入HttpClientUtil这个工具类,或者也可使用Spring框架的restTemplate来调用,上面有调用接口的方法,分为Get和Post方式的有参和无参调用)web

分布式、集群、微服务的理解?

分布式:一个业务分拆多个子业务,部署在不一样的服务器上;
集群:同一个业务,部署在多个服务器上;
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的,经过接口来实现数据的交互。每一个微服务仅关注于完成一件任务并很好地完成该任务。在全部状况下,每一个任务表明着一个小的业务能力。
分布式属于微服务
分布式:分布压力(集群)
微服务:分布能力ajax

事务的特性?分布式如何保证数据一致性?

ACID
数据的一致性协议有:
​1. 两阶段提交协议 2PC
​2. 三阶段提交协议 3PC
​3. RWN协议
​4. raft协议
​5. Paxos协议redis

分布式事务的处理逻辑?怎么实现的?

分布式事务是将各个模块都是单独独立出来的微服务,进行了分布式部署,单系统里的事务将不能保证各个数据库操做的一致性。
基于XA的两阶段提交方案:spring

  1. XA 它包含两个部分:事务管理器和本地资源管理器。其中本地资源管理器每每由数据库实现,而事务管理器做为全局的协调者,负责各个本地资源的提交和回滚。
  2. 两阶段提交方案开发复杂、锁定资源时间长,对性能影响很大,基本不适合解决微服务事务问题。

TCC解决方案:

  1. TCC方案实际上是两阶段提交的一种改进。其将整个业务逻辑的每一个分支显式的分红了Try、Confirm、Cancel三个操做。
  2. Try 阶段主要是对业务系统作检测及资源预留,完成业务的准备工做。
  3. Confirm 阶段主要是对业务系统作确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。即:只要Try成功,Confirm必定成功。
  4. Cancel 阶段主要是在业务执行错误,须要回滚的状态下执行的业务取消,预留资源释放。
  5. TCC方案中不少事务的处理逻辑须要应用本身编码实现,复杂且开发量大。

本地消息表(异步确保)

  1. 严重依赖于数据库的消息表来管理事务,这样在高并发的状况下难以扩展,同时要在数据库中额外添加一个与实际业务无关的消息表来实现分布式事务,繁琐

MQ事务消息:

  1. 直接基于 MQ 来实现事务,再也不用本地的消息表。缺点就是实现难度大,并且主流MQ不支持。

LCN分布式事务框架:

  1. 建立事务组:是指在事务发起方开始执行业务代码以前先调用TxManager建立事务组对象,而后拿到事务标示GroupId的过程。
  2. 添加事务组:添加事务组是指参与方在执行完业务方法之后,将该模块的事务信息添加通知给TxManager的操做。
  3. 关闭事务组:是指在发起方执行完业务代码之后,将发起方执行结果状态通知给TxManager的动做。当执行完关闭事务组的方法之后,TxManager将根据事务组信息来通知相应的参与模块提交或回滚事务。
  4. 使用:搭建tx-manager服务  修改application.properties配置文件,提供本地微服务应用的Eureka注册中心配置、redis配置。配置文件打包,启动微服务,java -jar tx-manager-x.x.x.jar;成功的话,直接在微服务中使用LCN实现分布式事务管理~~~~

其中@Transactional用于管理本地事务,而@TxTransaction管理分布式事务,当须要回滚时,调用本地自带的事务管理器进行回滚。

docker的经常使用命令有哪些?

image.png
image.png

模板引擎的了解和使用?

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它能够生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
模板引擎有哪些:jsp、Velocity、FreeMarker、Thymleaf、Beetl、Enjoy。
FreeMarker:
建立Configuration实例,该实例负责管理FreeMarker的模板加载路径,负责生成模板实例;
使用Configuration实例来生成Template实例,同进须要指定使用的模板文件;
填充数据模型,数据模型就是一个Map对象;
调用Template实例的process方法完成合并。
Thymleaf:
特色:
动静结合:页面采用模板+数据的方式,在前端美工手中,能够展现静态页面。在后台开发人员手中,也能够展现数据返回到页面后的界面。这是由于thymeleaf支持html原型,能够在原型上添加额外的属性,浏览器在解释html时会忽视未定义的属性,当定义的属性有值时就会动态替换静态页面,来实现动态展现。
开箱即用:提供标准和spring标准两种方言,能够直接套用模板实现JSTL、 OGNL表达式效果,
避免天天套模板、改jstl、改标签的困扰。同时开发人员也能够扩展和建立自定义的方言。
多方言支持:
Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,能够快速的实现表单绑定、属性编辑器、国际化等功能。
与springboor完美整合:SpringBoot提供了Thymeleaf的默认配置,而且为Thymeleaf设置了视图解析器,咱们能够像之前操做jsp同样来操做Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。
使用:

  1. 建立一个sprinboot项目
  2. 添加thymeleaf的起步依赖
  3. 添加spring web的起步依赖
  4. 编写html 使用thymleaf的语法获取变量对应后台传递的值
  5. 编写controller 设置变量的值到model中

项目中定时任务怎么写的?

最简单的一种:在线程中执行 Thread.sleep(),休眠挂起线程,等待一段时间后再执行;
借助Timer和TimerTask实现定时任务;
借助调度线程池 Executors.newScheduledThreadPool() 实现定时任务;
借助第三方工具,如spring的定时任务; Quartz;

如何实现邮箱和短信的发送?

短信:阿里云SMS,百度云SMS,七牛云SMS等
邮件:
进入邮箱设置,将其开启POP3/SMTP服务,以容许咱们经过第三方客户端发送邮件。而且获取受权码(不是登陆密码)
使用JavaMail发送邮件很是简单,也是三步曲:
​ 建立链接对象javax.mail.Session
​ 建立邮件对象 javax.mail.Message
​ 发送邮件

两个异构项目之间的实时数据互通会怎么作?

Web Service就能够解决异构系统的通讯的整合。
web Service技术获得了Java的支持,在JDK6之后都给出了相关规范的实现:
JAX-WS(XML web services的Java API)是SOAP方式:简单对象访问协议,他是用于交换XML编码信息的轻量级协议;
JAX-RS即restful方式风格。

nginx的了解和使用?

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务;
主要功能:反向代理,经过配置文件能够实现集群和负载均衡,静态资源虚拟化

maven如何解决jar包冲突?

移除依赖:
用于排除某项依赖的依赖jar包;
能够借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,而后在对应标红版本的jar包上面点击execlude,就能够将该jar包排除出去。
手动排除:
手动在pom.xml中使用<exclusion>标签去排除冲突的jar包(上面利用插件Maven Helper中的execlude方法其实等同于该方法):
mvn dependency:tree
版本锁定原则:
通常用在继承项目的父项目中;
正常项目都是多模块的项目,如moduleA和moduleB共同依赖X这个依赖的话,那么能够将X抽取出来,同时设置其版本号,这样X依赖在升级的时候,不须要分别对moduleA和moduleB模块中的依赖X进行升级,避免太多地方(moduleC、moduleD…)引用X依赖的时候忘记升级形成jar包冲突,这也是实际项目开发中比较常见的方法。

树形结构的表怎么设计?

设计1:邻接表,是最多见的设计,能正确的表达菜单的树状结构且没有冗余数据,但在跨层级查询须要递归处理。优势结构简单;缺点:不使用递归状况下没法查询某节点全部父级,全部子集
设计2:路径枚举;在设计1基础上新增一个父部门id集字段,用来存储全部父集,多个以固定分隔符分隔,好比逗号。优势:方便查询全部的子集;也能够所以经过比较字符串dept_parent_ids长度获取当前节点层级。缺点:新增节点时须要将dept_parent_ids字段值处理好;dept_parent_ids字段的长度很难肯定,不管长度多大,都存在不可以无线扩展的状况;节点移动复杂,须要同时变动全部子集中的dept_parent_ids字段值。
设计3:闭包表 是解决分级存储的一个简单而优雅的解决方案,是一种经过空间换取时间的方式;须要额外建立一张TreePaths表,它记录了树中全部节点间的关系;包含两列,祖先列与后代列,即便这两个节点之间不是直接的父子关系;同时增长一行指向节点本身;优势:非递归查询减小冗余的计算时间;方便非递归查询任意节点全部的父集;方便查询任意节点全部的子集;能够实现无限层级;支持移动节点;缺点:层级太多状况下移动树节点会带来关系表多条操做;须要单独一张表存储对应关系,在新增与编译节点时操做相对复杂;
image.png

如何实现菜单及增删改查的功能权限管理?

SpringSecurity
Shiro

开发程序须要哪些文档?

可行性分析报告;项目开发计划;软件需求说明书(软件规格说明书);概要设计说明书;详细设计说明书;用户操做手册;测试计划;测试分析报告;开发进度月报;软件维护手册;软件问题报告;软件修改报告。

相关文章
相关标签/搜索