最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

/**

  • Batch domain object representing a job. Job is an explicit abstraction

  • representing the configuration of a job specified by a developer. It should

  • be noted that restart policy is applied to the job as a whole and not to a

  • step.
    */
    public interface Job {

    String getName();

    boolean isRestartable();

    void execute(JobExecution execution);

    JobParametersIncrementer getJobParametersIncrementer();

    JobParametersValidator getJobParametersValidator();

}


在Job这个接口当中定义了五个方法,它的实现类主要有两种类型的job,一个是simplejob,另一个是flowjob。在spring batch当中,job是最顶层的抽象,除job之外我们还有JobInstance以及JobExecution这两个更加底层的抽象。


一个job是我们运行的基本单位,它内部由step组成。job本质上可以看成step的一个容器。一个job可以按照指定的逻辑顺序组合step,并提供了我们给所有step设置相同属性的方法,例如一些事件监听,跳过策略。


Spring Batch以SimpleJob类的形式提供了Job接口的默认简单实现,它在Job之上创建了一些标准功能。一个使用java config的例子代码如下:



@Bean
public Job footballJob() {
return this.jobBuilderFactory.get(“footballJob”)
.start(playerLoad())
.next(gameLoad())
.next(playerSummarization())
.end()
.build();
}


这个配置的意思是:首先给这个job起了一个名字叫footballJob,接着指定了这个job的三个step,他们分别由方法,playerLoad,gameLoad, playerSummarization实现。


#### 什么是JobInstance


我们在上文已经提到了JobInstance,他是Job的更加底层的一个抽象,他的定义如下:



public interface JobInstance {
/**
* Get unique id for this JobInstance.
* @return instance id
/
public long getInstanceId();
/
*
* Get job name.
* @return value of ‘id’ attribute from
*/
public String getJobName();
}


他的方法很简单,一个是返回Job的id,另一个是返回Job的名字。


JobInstance指的是job运行当中,作业执行过程当中的概念。Instance本就是实例的意思。


比如说现在有一个批处理的job,它的功能是在一天结束时执行行一次。我们假定这个批处理job的名字为'EndOfDay'。在这个情况下,那么每天就会有一个逻辑意义上的JobInstance, 而我们必须记录job的每次运行的情况。


#### 什么是JobParameters


在上文当中我们提到了,同一个job每天运行一次的话,那么每天都有一个jobIntsance,但他们的job定义都是一样的,那么我们怎么来区别一个job的不同jobinstance了。 不妨先做个猜想,虽然jobinstance的job定义一样,但是他们有的东西就不一样,例如运行时间。


spring batch中提供的用来标识一个jobinstance的东西是:JobParameters。 JobParameters对象包含一组用于启动批处理作业的参数,它可以在运行期间用于识别或甚至用作参考数据。我们假设的运行时间,就可以作为一个JobParameters。


例如, 我们前面的'EndOfDay'的job现在已经有了两个实例,一个产生于1月1日,另一个产生于1月2日,那么我们就可以定义两个JobParameter对象:一个的参数是01-01, 另一个的参数是01-02。 因此,识别一个JobInstance的方法可以定义为:


![](https://img-blog.csdnimg.cn/20190314165849701.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvcGRldmVsb3BlcnI=,size_16,color_FFFFFF,t_70)


因此,我么可以通过Jobparameter来操作正确的JobInstance


####  什么是JobExecution


JobExecution指的是单次尝试运行一个我们定义好的Job的代码层面的概念。 job的一次执行可能以失败也可能成功。只有当执行成功完成时,给定的与执行相对应的JobInstance才也被视为完成。


还是以前面描述的EndOfDay的job作为示例,假设第一次运行01-01-2019的JobInstance结果是失败。 那么此时如果使用与第一次运行相同的Jobparameter参数(即01-01-2019)作业参数再次运行,那么就会创建一个对应于之前jobInstance的一个新的JobExecution实例,JobInstance仍然只有一个。


JobExecution的接口定义如下:



public interface JobExecution {
/**
* Get unique id for this JobExecution.
* @return execution id
/
public long getExecutionId();
/
*
* Get job name.
* @return value of ‘id’ attribute from
/
public String getJobName();
/
*
* Get batch status of this execution.
* @return batch status value.
/
public BatchStatus getBatchStatus();
/
*
* Get time execution entered STARTED status.
* @return date (time)
/
public Date getStartTime();
/
*
* Get time execution entered end status: COMPLETED, STOPPED, FAILED
* @return date (time)
/
public Date getEndTime();
/
*
* Get execution exit status.
* @return exit status.
/
public String getExitStatus();
/
*
* Get time execution was created.
* @return date (time)
/
public Date getCreateTime();
/
*
* Get time execution was last updated updated.
* @return date (time)
/
public Date getLastUpdatedTime();
/
*
* Get job parameters for this execution.
* @return job parameters
*/
public Properties getJobParameters();

}


每一个方法的注释已经解释的很清楚,这里不再多做解释。只提一下BatchStatus,JobExecution当中提供了一个方法getBatchStatus用于获取一个job某一次特地执行的一个状态。BatchStatus是一个代表job状态的枚举类,其定义如下:



public enum BatchStatus {STARTING, STARTED, STOPPING,
STOPPED, FAILED, COMPLETED, ABANDONED }


这些属性对于一个job的执行来说是非常关键的信息,并且spring batch会将他们持久到数据库当中. 在使用Spring batch的过程当中spring batch会自动创建一些表用于存储一些job相关的信息,用于存储JobExecution的表为batch\_job\_execution,下面是一个从数据库当中截图的实例:


![](https://img-blog.csdnimg.cn/201903141714519.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvcGRldmVsb3BlcnI=,size_16,color_FFFFFF,t_70)


#### 什么是Step


每一个Step对象都封装了批处理作业的一个独立的阶段。 事实上,每一个Job本质上都是由一个或多个步骤组成。 每一个step包含定义和控制实际批处理所需的所有信息。 任何特定的内容都由编写Job的开发人员自行决定。 一个step可以非常简单也可以非常复杂。 例如,一个step的功能是将文件中的数据加载到数据库中,那么基于现在spring batch的支持则几乎不需要写代码。 更复杂的step可能具有复杂的业务逻辑,这些逻辑作为处理的一部分。 与Job一样,Step具有与JobExecution类似的StepExecution,如下图所示:


![](https://img-blog.csdnimg.cn/20200805112120460.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvcGRldmVsb3BlcnI=,size_16,color_FFFFFF,t_70)


 


#### 什么是StepExecution


StepExecution表示一次执行Step, 每次运行一个Step时都会创建一个新的StepExecution,类似于JobExecution。 但是,某个步骤可能由于其之前的步骤失败而无法执行。 且仅当Step实际启动时才会创建StepExecution。


一次step执行的实例由StepExecution类的对象表示。 每个StepExecution都包含对其相应步骤的引用以及JobExecution和事务相关的数据,例如提交和回滚计数以及开始和结束时间。 此外,每个步骤执行都包含一个ExecutionContext,其中包含开发人员需要在批处理运行中保留的任何数据,例如重新启动所需的统计信息或状态信息。下面是一个从数据库当中截图的实例:


![](https://img-blog.csdnimg.cn/20190315110037893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvcGRldmVsb3BlcnI=,size_16,color_FFFFFF,t_70)


#### 什么是ExecutionContext


ExecutionContext即每一个`StepExecution` 的执行环境。它包含一系列的键值对。我们可以用如下代码获取ExecutionContext



ExecutionContext ecStep = stepExecution.getExecutionContext();
ExecutionContext ecJob = jobExecution.getExecutionContext();


####  什么是JobRepository


JobRepository是一个用于将上述job,step等概念进行持久化的一个类。 它同时给Job和Step以及下文会提到的JobLauncher实现提供CRUD操作。 首次启动Job时,将从repository中获取JobExecution,并且在执行批处理的过程中,StepExecution和JobExecution将被存储到repository当中。


@EnableBatchProcessing注解可以为JobRepository提供自动配置。


#### 什么是JobLauncher


JobLauncher这个接口的功能非常简单,它是用于启动指定了JobParameters的Job,为什么这里要强调指定了JobParameter,原因其实我们在前面已经提到了,jobparameter和job一起才能组成一次job的执行。下面是代码实例:



public interface JobLauncher {

public JobExecution run(Job job, JobParameters jobParameters)
throws JobExecutionAlreadyRunningException, JobRestartException,
JobInstanceAlreadyCompleteException, JobParametersInvalidException;
}


上面run方法实现的功能是根据传入的job以及jobparamaters从JobRepository获取一个JobExecution并执行Job。


#### 什么是Item Reader


ItemReader是一个读数据的抽象,它的功能是为每一个Step提供数据输入。 当ItemReader以及读完所有数据时,它会返回null来告诉后续操作数据已经读完。Spring Batch为ItemReader提供了非常多的有用的实现类,比如`JdbcPagingItemReader,`JdbcCursorItemReader等等。


ItemReader支持的读入的数据源也是非常丰富的,包括各种类型的数据库,文件,数据流,等等。几乎涵盖了我们的所有场景。


下面是一个`JdbcPagingItemReader的例子代码:`



@Bean
public JdbcPagingItemReader itemReader(DataSource dataSource, PagingQueryProvider queryProvider) {
Map<String, Object> parameterValues = new HashMap<>();
parameterValues.put(“status”, “NEW”);

    return new JdbcPagingItemReaderBuilder<CustomerCredit>()
                                       .name("creditReader")
                                       .dataSource(dataSource)
                                       .queryProvider(queryProvider)
                                       .parameterValues(parameterValues)
                                       .rowMapper(customerCreditMapper())
                                       .pageSize(1000)
                                       .build();

}

@Bean
public SqlPagingQueryProviderFactoryBean queryProvider() {
SqlPagingQueryProviderFactoryBean provider = new SqlPagingQueryProviderFactoryBean();

    provider.setSelectClause("select id, name, credit");
    provider.setFromClause("from customer");
    provider.setWhereClause("where status=:status");
    provider.setSortKey("id");

    return provider;

}


JdbcPagingItemReader必须指定一个PagingQueryProvider,负责提供SQL查询语句来按分页返回数据。


下面是一个JdbcCursorItemReader的例子代码:



private JdbcCursorItemReader<Map<String, Object>> buildItemReader(final DataSource dataSource, String tableName,
String tenant) {

    JdbcCursorItemReader<Map<String, Object>> itemReader = new JdbcCursorItemReader<>();
    itemReader.setDataSource(dataSource);
    itemReader.setSql("sql here");
    itemReader.setRowMapper(new RowMapper());
    return itemReader;
}

 


#### 什么是Item Writer


既然ItemReader是读数据的一个抽象,那么ItemWriter自然就是一个写数据的抽象,它是为每一个step提供数据写出的功能。写的单位是可以配置的,我们可以一次写一条数据,也可以一次写一个chunk的数据,关于chunk下文会有专门的介绍。ItemWriter对于读入的数据是不能做任何操作的。


Spring Batch为ItemWriter也提供了非常多的有用的实现类,当然我们也可以去实现自己的writer功能。


#### 什么是Item Processor


ItemProcessor对项目的业务逻辑处理的一个抽象, 当ItemReader读取到一条记录之后,ItemWriter还未写入这条记录之前,I我们可以借助temProcessor提供一个处理业务逻辑的功能,并对数据进行相应操作。如果我们在ItemProcessor发现一条数据不应该被写入,可以通过返回null来表示。ItemProcessor和ItemReader以及ItemWriter可以非常好的结合在一起工作,他们之间的数据传输也非常方便。我们直接使用即可。


 


### chunk 处理流程


spring batch提供了让我们按照chunk处理数据的能力,一个chunk的示意图如下:


![](https://img-blog.csdnimg.cn/20190110100140602.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvcGRldmVsb3BlcnI=,size_16,color_FFFFFF,t_70)


它的意思就和图示的一样,由于我们一次batch的任务可能会有很多的数据读写操作,因此一条一条的处理并向数据库提交的话效率不会很高,因此spring batch提供了chunk这个概念,我们可以设定一个chunk size,spring batch 将一条一条处理数据,但不提交到数据库,只有当处理的数据数量达到chunk size设定的值得时候,才一起去commit.


java的实例定义代码如下:


![](https://img-blog.csdnimg.cn/20190110101409172.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvcGRldmVsb3BlcnI=,size_16,color_FFFFFF,t_70)


在上面这个step里面,chunk size被设为了10,当ItemReader读的数据数量达到10的时候,这一批次的数据就一起被传到itemWriter,同时transaction被提交。


#### skip策略和失败处理



# 最后的内容

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)

**如何准备面试?**

**1、前期铺垫(技术沉积)**

程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问

> 这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!

*   Java程序员必看《Java开发核心笔记(华山版)》

![](https://img-blog.csdnimg.cn/img_convert/92fda08d92750b732e26a1f30415209e.webp?x-oss-process=image/format,png)

*   Redis学习笔记

![](https://img-blog.csdnimg.cn/img_convert/7913a4f22195af2bfd0fa1f8b43d2be8.webp?x-oss-process=image/format,png)

*   Java并发编程学习笔记

四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇

![](https://img-blog.csdnimg.cn/img_convert/fe5a56df5f514c31ed0f5d141e67219f.webp?x-oss-process=image/format,png)

*   Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)

![](https://img-blog.csdnimg.cn/img_convert/3c83e832dcfe3c97603de698d10bbef3.webp?x-oss-process=image/format,png)

*   大厂面试必问——数据结构与算法汇集笔记

![](https://img-blog.csdnimg.cn/img_convert/ab4ba25f02fc21a4b2c2586920a99aaf.webp?x-oss-process=image/format,png)

其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。

![](https://img-blog.csdnimg.cn/img_convert/38325315234dc576d7779c8bfdd0d651.webp?x-oss-process=image/format,png)

**2、狂刷面试题**

技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。

①大厂高频45道笔试题(智商题)

![](https://img-blog.csdnimg.cn/img_convert/c3325db510811a5b049c192c6c5ed5fd.webp?x-oss-process=image/format,png)

②BAT大厂面试总结(部分内容截图)

![](https://img-blog.csdnimg.cn/img_convert/708366ac289766c8e5bf8d452085e675.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/4938c45a0924ad272dc1175ece497d14.webp?x-oss-process=image/format,png)

③面试总结

![](https://img-blog.csdnimg.cn/img_convert/dde65cae6ce0f5b29e8793e79689595f.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/de5650e68c538eb3642b44d0db0aed67.webp?x-oss-process=image/format,png)

**3、结合实际,修改简历**

程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

![](https://img-blog.csdnimg.cn/img_convert/d0bd0df636a2e5f6815953fce9ed42a5.webp?x-oss-process=image/format,png)

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。


> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

..(img-XWk20vLu-1715064725918)]

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。


> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐