【面试实战】Java面试的时候,你能这么回答,就基本都可以过了!

ActiveMQ

1. 这个技术是干什么的?

MQ 全称为 Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。

消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

MQ 是消费 - 生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。

2. 它在你的项目中什么地方用到了?

在用户注册模块和订单运单管理模块使用到了该技术, 主要是在后台通过阿里大鱼向客户或快递员发送短信时, 为了增加系统并发处理量, 解决消息拥堵问题,提高系统性能。

3. 用的时候出现过什么 BUG?

在使用时,控制台报出了一个错误: javax.jms.JMSException: Unknown data type:

4. 你是怎么解决的?

后来经过分析, 是在配置连接工厂时, 将连接端口写错了, 默认的连接端口是 61616.

5. 有没有类似的技术,谈谈它们区别和优劣?

类似的消息队列技术有 RabbitMQ 和 ZeroMQ.

RabbitMQ 是 AMQP 协议领先的一个实现,它实现了代理 (Broker) 架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得 RabbitMQ 易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。

ZeroMQ 是一个非常轻量级的消息系统,专门为高吞吐量 / 低延迟的场景开发,在金融界的应用中经常可以发现它。与 RabbitMQ 相比,ZeroMQ 支持许多高级消息场景,但是你必须实现 ZeroMQ 框架中的各个块(比如 Socket 或 Device 等)。ZeroMQ 非常灵活,但是你必须学习它的 80 页的手册, 学习成本较大。

6. ActiveMQ 如果消息发送失败怎么办?怎么防止消息丢失?

Activemq 有两种通信方式,点到点形式和发布订阅模式。

如果是点到点模式的话,如果消息发送不成功,此消息默认会保存到 activemq 服务端直到有消费者将其消费,所以此时消息是不会丢失的。

如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个 id,在订阅时向 activemq 注册。发布消息和接收消息时需要配置发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。(确认机制,重发机制)

redis

1. 这个技术是干什么的?

redis 是完全开源免费的,用 C 语言编写的,遵循 BSD 协议,是一个高性能的 (KEY/value) 分布式内存数据库,基于内存运行并支持持久化的 NoSQL 数据库,是当前最热门的 NoSQL 数据库之一,也被称为数据结构服务器。

2. 它在你的项目中什么地方用到了?

用户注册时,要求用户填写注册邮箱,然后后台向用户的注册邮箱中发送绑定邮件,并将激活码保存到 redis 中。手机短信验证码因为时效期短,只需要将短信验证码存储到 session 中即可,session 的默认有效期是 30 分钟,但邮箱激活码要保存 24 小时,所以要使用到 redis。

在客户注册 action 中,要实现将邮件激活码保存到 redis 中的功能,有以下几个要点:

① 调用 MailUtils 工具类发送一封激活邮件;
② 生成邮箱激活码;
③ 将邮箱激活码保存到 redis 中,设置有效期为 24 小时。

3. 用的时候出现过什么 BUG?

1.SocketTimeoutException 连接超时

2. 业务并发量大,连接池 maxTotal 设置得过小了,Jedis 连接阻塞

4. 你是怎么解决的?

  1. 这种情况先排除是否开启了 redis,或者 ip 地址和端口是否书写正确。如果没有以上问题,那必定是防火墙未允许 Redis 的默认端口 6379。编辑防火墙配置文件 :vim /etc/sysconfig/iptables

  2. Redis 发生了阻塞(例如慢查询等原因),所有连接在超时时间范围内等待,并发量较大时,会造成连接池资源不足。Jedis 连接被拒绝,从池子里拿连接,由于没有空闲连接,需要重新生成一个 Jedis 连接,但是连接被拒绝

5. 有没有类似的技术,谈谈它们区别和优劣?

类似的技术有 memcached

redis 相比 memcached 有哪些优势:

  1. memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型

  2. redis 的速度比 memcached 快很多

  3. redis 可以持久化其数据

Memcache 与 Redis 的区别

  1. 存储方式 Memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis 有部份存在硬盘上,这样能保证数据的持久性。

  2. 数据支持类型 Memcache 对数据类型支持相对简单。Redis 有复杂的数据类型。

  3. 使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

Redis 与其他的可以 key-value 缓存产品有三个特点:

  1. Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,

重启的时候可以再次加载进行使用。(持久化的两种方式)

  1. Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list、set、Zset、hash

等数据结构的存储。(常用的是 hash 和 string)

  1. Redis 支持数据的备份,即 master-slave 模式的数据备份。

Redis 能做什么:

  1. 内存存储和持久化:Redis 支持异步将内存中的数据写到硬盘上,同时不影响继续服务,取最新的 N 个数据的操作,如:可以将最新的 10 条评论的 ID 放在 Redis 的 list 集合里面。

  2. 模拟类似于 HttpSession 这种需要设定过期时间的功能。

  3. 发布、订阅消息系统

  4. 定时器、计算器。

  5. 队列,相当于消息系统的 ActiveMQ,RocketMQ

  6. 位操作,大数据处理

  7. 分布式锁与单线程机制

  8. 排行榜 / 计数器 / 最近浏览 / 验证码 / 最近热门等

WebService

1. 这个技术是干什么的?

WebService 是一种跨编程语言和跨操作系统平台的远程调用技术,是多系统之间的通信技术 (核心式架构)。jax-ws 和 jax-rs 是 CXF 的两种服务方式。

2. 它在你的项目中什么地方用到了?

各个系统之间跨系统传输数据使用到了 Webservice。

比如:

在客户注册登录的时候,使用 WebService 实现前台系统与 CRM 数据传输

在定区关联客户时,使用 WebService 实现后台系统与 CRM 数据传输

在前台分页显示宣传任务时,使用 WebService 实现前台系统与后台系统数据传输

取派员取件任务单。通过 WebService 服务调用 CRM 查询当前客户的信息.

3. 用的时候出现过什么 BUG?

运行时出现:org.apache.cxf.interceptor.Fault: No binding operation info while invoking unknown method with params unknown(错误:在调用未知方法时没有绑定操作信息)

4. 你是怎么解决的?

wsdl 文件上需要参数,但是路径没有给定参数,所以报错,路径后加上? wsdl 即可

5. 有没有类似的技术,谈谈它们区别和优劣?

与 Webservice 类似的技术还有 RMI,Hessian,Burlap,Httpinvoker 等。

RMI 是 java 语言本身提供的远程通讯协议,稳定高效,是 EJB 的基础。但它只能用于 JAVA 程序之间的通讯。

Hessian 和 Burlap 是 caucho 公司提供的开源协议,基于 HTTP 传输,服务端不用开防火墙端口。协议的规范公开,可以用于任意语言。

Httpinvoker 是 SpringFramework 提供的远程通讯协议,只能用于 JAVA 程序间的通讯,且服务端和客户端必须使用 SpringFramework。Web service 是连接异构系统或异构语言的首选协议,它使用 SOAP 形式通讯,可以用于任何语言,目前的许多开发工具对其的支持也很好。

jax-ws 与 jax-rs 的区别

1、采用协议不一样

jax-ws 采用 SOAP 协议

jax-rs 采用 HTTP 协议

2、支持数据格式不一样

jax-ws 只支持 xml 格式

jax-rs 支持 xml、json 格式

Restful 风格

1、一种代码编写风格,基于 URI (Universal Resource Identifier)

2、你告诉我你用什么请求方式,我就知道你要做什么操作

POST 请求方式访问 保存操作(增,英文:Create)

DELETE 请求方式访问 删除操作(删,英文:Delete)

PUT 请求方式访问 修改操作(改,英文:Update)

GET 请求方式访问 查询操作(查,英文:Retrieve)

Quartz

1. 这个技术是干什么的?

Quartz 是一个优秀的开源调度框架,有强大的调度功能,支持立即调度、定时调度、周期调度、并发调度;灵活的应用方式,支持 job 间通过 listener 实现依赖调度,可以方便的进行调度组合。

2. 它在你的项目中什么地方用到了?

宣传任务有一个活动期限,过期了需要自动改变这个活动的状态为已过期,这就需要每隔一个小时就要查询下数据库对比时间是否已过期,过期就修改它的状态,这时就用到了 Quartz。

3. 用的时候出现过什么 BUG?

用的时候出现了一个提示唯一的标识已经存在的错误,我出现这个错误是发生在:把项目打包放在一个 tomcat 下启动正常 ,当把项目放在第二个 tomcat 下同时启动时,就出现了这个错误。

4. 你是怎么解决的?

在初始化调度的时候 clean 一下

5. 有没有类似的技术,谈谈它们区别和优劣?

类似的技术就了解过 APScheduler,但是 APScheduler 是基于 Quartz 的 一个 Python 定时任务框架,实现了 Quartz 的所有功能,但是对于 Java 来说现在主流的还是 Quartz

quartz 和 spring 自带的定时器 Timer Task 的比较

精确度和功能 :

Quartz 可以通过 cron 表达式精确到特定时间执行,而 TimerTask 不能。

Quartz 拥有 TimerTask 所有的功能,而 TimerTask 则没有。

任务类的数量 :

Quartz 每次执行都创建一个新的任务类对象。

TimerTask 则每次使用同一个任务类对象。

对异常的处理 :

Quartz 的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务。

TimerTask 不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务。

总结: quartz 作为第三方插件考虑的比较周全,东西比较多,加上 quartz 配置简单,maven 也就是多加一个 jar 包,所以一般情况下还是使用 Quartz。

聊聊cron表达式

cron 的表达式被用来配置 CronTrigger 实例。

cron 的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。这些子表达式是分开的空白,代表:

1. Seconds

2. Minutes

3. Hours

4. Day-of-Month

5. Month

6. Day-of-Week

7. Year (可选字段)

例 "0 0 12 ? * WED" 在每星期三下午 12:00 执行,

Freemarker

1. 这个技术是干什么的?

FreeMarker 是 java 的免费模板引擎, 主要用于 MVC 中的 view 层, 生成 html 展示数据给客户端, 可以完全替代 jsp。FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写, 模板中没有业务逻辑, 外部 java 程序通过数据库操作等生成数据传入 template 中, 然后输出页面。它能够生成各种文本:HTML、XML、JSP、RTF、Java 源代码等等,而且不需要 Servlet 环境,并且可以从任何源载入模板,如本地文件、数据库等等。

优点:

  1. 可以彻底分离表现层和业务逻辑层,从而实现解耦的功能。

  2. 可以提高开发效率,页面在数据处理之前早已存在,只需要获取数据便可响应给表现层

缺点:

  1. 不是官方标准

  2. 用户群体和第三方标签库没有 jsp 多

2. 它在你的项目中什么地方用到了?

在宣传活动展示模块有用到 freemarker 模板技术, 用户点击宣传活动的详情链接, 页面跳转到详情信息页, 此处使用 freemarker 模板技术使得宣传活动详情展示页面静态化, 减少了与数据库的交互, 提高了程序效率, 大大减少网站访问时页面的响应时间,提高用户的访问体验。

3. 用的时候出现过什么 BUG?

在初次生成 html 静态页面的时候, 图片无法展示。

4. 你是怎么解决的?

当第一次访问某个详情页时, freemarker 会生成一个 xx.html 的静态页面, 之后再访问相同的详情页, 就直接从本地获取已生成的静态页面返回, 如果本地已经生成错误的静态页面, 我们需要先删除它, 然后才能重新生成正确的静态页面。

解决方法: 从数据库查询到模板所需的数据后, 先对图片 src 路径处理, 确保能访问得到图片, 然后删除本地已生成的错误 html 页面, 重新生成页面后图片即可显示。

5. 有没有类似的技术,谈谈它们区别和优劣?

模板技术在现代的软件开发中有着重要的地位,而目前最流行的两种模板技术就是 freemarker 和 velocity.

freemarker 在功能上要比 velocity 强大.

  1. 在 view 层的时候, 有时候需要使用 format 日期和数字的功能, 而 freemarker 很贴心的提供了 formmat 日期和数据的功能

  2. freemarker 的插件除了支持 freemarker 语法也支持 html 语句,而 velocity 的插件只支持 velocity 的语法3. freemarker 对 jsptag 的支持很好

ElasticSearch

1. 这个技术是干什么的?

Elasticsearch 简称 es, 是一个高扩展、开源的全文检索和分析引擎的技术, 用来准确实时快速存储,搜索,分析海量数据。elasticSearch 解决大数据量字段模糊查询,建立数据索引库,全文检索方式查询。

2. 它在你的项目中什么地方用到了?

运单模块,对运单进行条件搜索,用户只需要输入关键词就可以查询对应记录,因为运单的数据量较大使用全文检索技术 elasticSearch。保存运单的同时, 保存索引。

3. 用的时候出现过什么 BUG?

先启动 es 在项目报错

4. 你是怎么解决的?

先启动项目再启动 es

5. 有没有类似的技术,谈谈它们区别和优劣?

类似的技术有 Solr

1.Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;

2.Solr 支持更多格式的数据,而 Elasticsearch 仅支持 json 文件格式;

3.Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;

4.Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。

5.Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。

POI

1. 这个技术是干什么的?

Apach POI 是一种文件解析的 API,它能够使 java 程序对 excel、word 文档进行文件的读与写,它提供了五种解析方式

HSSF - 提供读写 Microsoft Excel 格式档案的功能。HSSF 解析 Excel 97-2007 格式 (.xls 类型)

XSSF - 提供读写 MicrosoftExcel OOXML 格式档案的功能。XSSF 解析 Excel 2007 格式 (.xlsx 类型)

HWPF - 提供读写 Microsoft Word 格式档案的功能。

HSLF - 提供读写 Microsoft PowerPoint 格式档案的功能。

HDGF - 提供读写 Microsoft Visio 格式档案的功能。

2. 它在你的项目中什么地方用到了?

在项目中主要是在文件上传时用到了这个功能,比如用户上传了一个 excel 文档,需要对文档的内容进行读取,然后保存数据到数据库中,此时就需要使用到 POI 提供的 HSSF 和 XSSF 功能(针对不同后缀的 excel 采用不同的解析方式)

3. 用的时候出现过什么 BUG?

1.HSSF 和 XSSF 读取的文件类型不一致,HSSF 只能解析 (.xls) 格式的 excel 文件;XSSF 只能读取 (.xlsx) 格式的 excel 文件

2.excel 不一定只有一页,也就是说有的 excel 里面可能会有多页数据,多个 sheet,容易判断失误

1. 你是怎么解决的?

1. 第一个问题就是采用后缀名判断,首先读取文件的后缀名采用 lastIndexOf(.),然后通过 if 判断属于哪个后缀名,再使用根据文件类型选择对应的解析格式。

2. 第二个问题我是采用的一个 foreache 循环,只要有 sheet,就进行读取。

2. 有没有类似的技术,谈谈它们区别和优劣?

类似的技术有 jxl,但是只支持 Excel 95-2000 的版本,支持的版本比较低。效率低,图片支持不完善,对格式的支持不如 POI 强大。

常用的 java 解析 excel 就是 apach 推荐的 POI 了,其他的自己也在网上搜过,但是都比较复杂,解析非常麻烦,甚至需要自己一步步解析判断,所以我还是使用的官方推荐的 POI

POI 技术生成 Excel 格式报表

一、导出 Excel 文档(xls、xlsx)/ 导入 Excel 类似,最后一步为 get

1. 根据类型创建 Workbook

2. 用 Workbook 创建 Sheet

3. 用 Sheet 创建 Row

用 Row 创建 Cell,setCellValue(..)去设置表头和遍历设置表格

Shiro

shiro 是一款开源的安全框架

拥有不同权限的人员登陆后会看到不同的菜单和按钮

常见的权限控制的方式:

  1. url 拦截进行权限控制 ---- 框架提供了很多过滤器进行 url 拦截

  2. 方法注解方式权限控制 ---- 框架提供了在方法上使用的注解,为 Action 创建代理对象,进行权限控制

主要功能有四个 认证 授权

shiro 框架有三个核心概念,subject、securityManager、realms

Subject:当前用户

SecurityManager:安全管理器,管理所有的用户,认证、授权等。

Realm:安全数据桥,类似于 Dao,负责访问安全数据

subject

是与程序进行交互的对象,可以理解为用户,与用户有关的一切处理信息操作都可以

通过 subject 从 shiro 的会话信息中提取,比如当前用户名、主机名等, 我们可以在任何需要的

地方获得 subject 来进行安全操作,需要绑定 securityManager

securityManager

管理所有用户的安全操作,是 shrio 的核心,我们与一个 Subject 交互,

运行时 shiro 会自动转化为与 SecurityManager 交互的特定 subject 的交互

realm 充当 shiro 与安全数据之间的桥梁,相当于 dao,比如当执行认证 和授权操作的时候 shiro 会

从配置的 realm 中查找相应数据

以登录认证 和 授权为例 来讲讲 shiro 的应用逻辑

首先需要几张表 用户表,角色表,用户角色关系表,权限表,权限角色关系表

认证:系统提供的用于识别用户身份的功能(通常就是登录功能)----- 你是谁????

授权:系统中提供很多功能,需要为不同的用户根据其对应的权限,授予用户操作某些功能的能力 ------ 你能做什么???

登录认证时 调用 subject.login 方法 将输入的账号密码传入,安全管理器调用 realm 查询用户表中

信息交给 shiro 认证,判断通过则登录成功,

授权: 则是通过登录成功的用户 id 查询关联的角色和权限表内容,将权限或角色赋给 subject

程序中可以通过注解或 subject 判断当前用户是否具有 角色或权限 来限制操作

也可以在页面中使用 shiro 标签来控制页面元素的 权限显示, 没有权限不显示

在 jsp 页面上使用 Shiro 标签,实现不同权限的用户给他显示不同的点击按钮

粗粒度和细粒度例子:

系统有一个用户列表查询页面,对用户列表查询分权限,如果粗颗粒管理,张三和李四都有用户列表查询的权限,张三和李四都可以访问用户列表查询。

进一步进行细颗粒管理,张三(行政部)和李四 (开发部) 只可以查询自己本部门的用户信息。张三只能查看行政部 的用户信息,李四只能查看开发部门的用户信息。细粒度权限管理就是数据级别的权限管理

Ehcache 缓存管理器

1、Shiro 默认对 ehcache 的支持

2、在后台管理系统中 ehcache 使用非常普遍

配置 shiro 整合 ehcache 完成对授权数据缓存

第一步:在 common_parent 导入 ehcache maven 坐标 Ehcache 开发包

第二步:使用 ehcache ,导入 ehcache.xml 配置文件

第三步:配置 spring 整合 ehcache 将 ehcacheManager 交给 spring 管理

第四步:配置 shiro 封装缓存管理器

第五步:将 shiro 的缓存管理器,注入到安全管理器中 ,

第六步:对认证数据、授权数据 哪些进行缓存 ?配置 realm

注意:使需要缓存对象,实现 Serializable 接口


作者:YuHang-与你

链接:

https://zhuanlan.zhihu.com/p/85511571

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值