H5W3
当前位置:H5W3 > java > 正文

【Java】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=下载的文件名称”);不管浏览器能不能解析,都是下载操作;

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

【Java】Java面试题-实用技术
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的了解和使用?消息发送失败如何处理?如何预防消息的重复消费?

【Java】Java面试题-实用技术
【Java】Java面试题-实用技术
订阅方式:
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.系统预警人工处理等
【Java】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中。
保存时 标记冲突解决。

如何测试自己的接口?

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

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

【Java】Java面试题-实用技术
POI官方推荐解决内存溢出的方式使用CSV格式解析

linux常用命令有哪些?

【Java】Java面试题-实用技术

如何调用第三方的接口?

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

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

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

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

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

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

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

  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的常用命令有哪些?

【Java】Java面试题-实用技术
【Java】Java面试题-实用技术

模板引擎的了解和使用?

模板引擎(这里特指用于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表,它记录了树中所有节点间的关系;包含两列,祖先列与后代列,即使这两个节点之间不是直接的父子关系;同时增加一行指向节点自己;优点:非递归查询减少冗余的计算时间;方便非递归查询任意节点所有的父集;方便查询任意节点所有的子集;可以实现无限层级;支持移动节点;缺点:层级太多情况下移动树节点会带来关系表多条操作;需要单独一张表存储对应关系,在新增与编译节点时操作相对复杂;
【Java】Java面试题-实用技术

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

SpringSecurity
Shiro

开发程序需要哪些文档?

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

本文地址:H5W3 » 【Java】Java面试题-实用技术

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址