Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.glaf.batch.service.impl; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.glaf.batch.domain.JobExecution; import com.glaf.batch.domain.JobExecutionContext; import com.glaf.batch.domain.JobExecutionParam; import com.glaf.batch.domain.JobInstance; import com.glaf.batch.domain.JobParam; import com.glaf.batch.domain.StepExecution; import com.glaf.batch.mapper.JobExecutionContextMapper; import com.glaf.batch.mapper.JobExecutionMapper; import com.glaf.batch.mapper.JobExecutionParamMapper; import com.glaf.batch.mapper.JobInstanceMapper; import com.glaf.batch.mapper.JobParamMapper; import com.glaf.batch.mapper.StepExecutionContextMapper; import com.glaf.batch.mapper.StepExecutionMapper; import com.glaf.batch.query.JobInstanceQuery; import com.glaf.batch.service.IJobService; import com.glaf.batch.util.BatchStatus; import com.glaf.core.dao.EntityDAO; import com.glaf.core.id.IdGenerator; @Service("jobService") @Transactional(readOnly = true) public class MxJobServiceImpl implements IJobService { protected static final Log logger = LogFactory.getLog(MxJobServiceImpl.class); protected volatile EntityDAO entityDAO; protected volatile IdGenerator idGenerator; protected volatile SqlSession sqlSession; protected volatile JobInstanceMapper jobInstanceMapper; protected volatile JobParamMapper jobParamMapper; protected volatile JobExecutionMapper jobExecutionMapper; protected volatile JobExecutionParamMapper jobExecutionParamMapper; protected JobExecutionContextMapper jobExecutionContextMapper; protected StepExecutionMapper stepExecutionMapper; protected StepExecutionContextMapper stepExecutionContextMapper; public MxJobServiceImpl() { } @Transactional public void completeStepExecution(String jobStepKey) { StepExecution step = this.getStepExecutionByKey(jobStepKey); if (step != null && step.getStatus() != null) { step.setExitCode(BatchStatus.COMPLETED.toString()); step.setStatus(BatchStatus.COMPLETED.toString()); step.setEndTime(new Date()); stepExecutionMapper.updateStepExecution(step); } } public int count(JobInstanceQuery query) { return jobInstanceMapper.getJobInstanceCountByQueryCriteria(query); } @Transactional public void deleteJobInstanceById(long jobInstanceId) { stepExecutionMapper.deleteStepExecutionByJobInstanceId(jobInstanceId); jobExecutionMapper.deleteJobExecutionByJobInstanceId(jobInstanceId); jobParamMapper.deleteJobParamsByJobInstanceId(jobInstanceId); jobInstanceMapper.deleteJobInstanceById(jobInstanceId); } @Transactional public void deleteJobInstanceByJobKey(String jobKey) { JobInstance jobInstance = jobInstanceMapper.getJobInstanceByJobKey(jobKey); if (jobInstance != null) { this.deleteJobInstanceById(jobInstance.getJobInstanceId()); } } public JobExecution getJobExecutionById(long jobExecutionId) { JobExecution jobExecution = jobExecutionMapper.getJobExecutionById(jobExecutionId); return jobExecution; } public JobExecutionContext getJobExecutionContextById(long id) { JobExecutionContext jobExecutionContext = jobExecutionContextMapper.getJobExecutionContextById(id); return jobExecutionContext; } public List<JobExecution> getJobExecutions(long jobInstanceId) { return jobExecutionMapper.getJobExecutionByJobInstanceId(jobInstanceId); } public JobInstance getJobInstanceById(long jobInstanceId) { JobInstance jobInstance = jobInstanceMapper.getJobInstanceById(jobInstanceId); if (jobInstance != null) { List<JobParam> params = jobParamMapper.getJobParamsByJobInstanceId(jobInstance.getJobInstanceId()); jobInstance.setParams(params); } return jobInstance; } public JobInstance getJobInstanceByIdWithAll(long jobInstanceId) { JobInstance jobInstance = jobInstanceMapper.getJobInstanceById(jobInstanceId); if (jobInstance != null) { List<JobParam> params = jobParamMapper.getJobParamsByJobInstanceId(jobInstanceId); jobInstance.setParams(params); List<JobExecution> executions = jobExecutionMapper.getJobExecutionByJobInstanceId(jobInstanceId); jobInstance.setExecutions(executions); } return jobInstance; } public JobInstance getJobInstanceByJobKey(String jobKey) { JobInstance jobInstance = jobInstanceMapper.getJobInstanceByJobKey(jobKey); if (jobInstance != null) { List<JobParam> params = jobParamMapper.getJobParamsByJobInstanceId(jobInstance.getJobInstanceId()); jobInstance.setParams(params); } return jobInstance; } /** * ??? * * @return */ public int getJobInstanceCount(Map<String, Object> parameter) { return jobInstanceMapper.getJobInstanceCount(parameter); } /** * ??? * * @return */ public int getJobInstanceCountByQueryCriteria(JobInstanceQuery query) { return jobInstanceMapper.getJobInstanceCountByQueryCriteria(query); } /** * ??? * * @return */ public List<JobInstance> getJobInstances(Map<String, Object> parameter) { return jobInstanceMapper.getJobInstances(parameter); } public List<JobInstance> getJobInstances(String jobName, int start, int limit) { JobInstanceQuery query = new JobInstanceQuery(); query.jobName(jobName); RowBounds rowBounds = new RowBounds(start, limit); List<JobInstance> rows = sqlSession.selectList("getJobInstances", query, rowBounds); return rows; } /** * ???? * * @return */ public List<JobInstance> getJobInstancesByQueryCriteria(int start, int pageSize, JobInstanceQuery query) { RowBounds rowBounds = new RowBounds(start, pageSize); List<JobInstance> rows = sqlSession.selectList("getJobInstances", query, rowBounds); return rows; } public StepExecution getStepExecutionById(long stepExecutionId) { StepExecution stepExecution = stepExecutionMapper.getStepExecutionById(stepExecutionId); return stepExecution; } public StepExecution getStepExecutionByKey(String jobStepKey) { StepExecution stepExecution = stepExecutionMapper.getStepExecutionByKey(jobStepKey); return stepExecution; } public List<StepExecution> getStepExecutions(long jobInstanceId) { return stepExecutionMapper.getStepExecutionsByJobInstanceId(jobInstanceId); } /** * ?Job?? * * @param jobKey * @return */ public boolean jobCompleted(String jobKey) { JobInstance jobInstance = this.getJobInstanceByJobKey(jobKey); if (jobInstance == null) { return false; } List<StepExecution> steps = this.getStepExecutions(jobInstance.getJobInstanceId()); if (steps != null && !steps.isEmpty()) { for (StepExecution step : steps) { if (step.getStatus() != null && BatchStatus.match(step.getStatus()) != BatchStatus.COMPLETED) { return false; } } } return true; } public List<JobInstance> list(JobInstanceQuery query) { List<JobInstance> list = jobInstanceMapper.getJobInstancesByQueryCriteria(query); return list; } @Transactional public void saveJobContext(JobExecutionContext jobExecutionContext) { if (jobExecutionContext.getJobExecutionId() == null) { jobExecutionContext.setJobExecutionId(idGenerator.nextId()); jobExecutionContextMapper.insertJobExecutionContext(jobExecutionContext); } else { JobExecutionContext model = this.getJobExecutionContextById(jobExecutionContext.getJobExecutionId()); if (model != null) { if (jobExecutionContext.getShortContext() != null) { model.setShortContext(jobExecutionContext.getShortContext()); } model.setSerializedContext(jobExecutionContext.getSerializedContext()); jobExecutionContextMapper.updateJobExecutionContext(model); } } } @Transactional public void saveJobExecution(JobExecution jobExecution) { if (jobExecution.getJobExecutionId() == null) { jobExecution.setJobExecutionId(idGenerator.nextId()); jobExecutionMapper.insertJobExecution(jobExecution); if (jobExecution.getSteps() != null && !jobExecution.getSteps().isEmpty()) { for (StepExecution stepExecution : jobExecution.getSteps()) { stepExecution.setJobExecutionId(jobExecution.getJobExecutionId()); stepExecution.setJobInstanceId(jobExecution.getJobInstanceId()); this.saveStepExecution(stepExecution); } } } else { JobExecution model = this.getJobExecutionById(jobExecution.getJobExecutionId()); if (model != null) { model.setVersion(jobExecution.getVersion()); if (jobExecution.getStartTime() != null) { model.setStartTime(jobExecution.getStartTime()); } if (jobExecution.getEndTime() != null) { model.setEndTime(jobExecution.getEndTime()); } if (jobExecution.getStatus() != null) { model.setStatus(jobExecution.getStatus()); } if (jobExecution.getExitCode() != null) { model.setExitCode(jobExecution.getExitCode()); } if (jobExecution.getExitMessage() != null) { model.setExitMessage(jobExecution.getExitMessage()); } if (jobExecution.getLastUpdated() != null) { model.setLastUpdated(jobExecution.getLastUpdated()); } jobExecutionMapper.updateJobExecution(model); } } if (jobExecution.getJobExecutionId() != null) { jobExecutionParamMapper.deleteJobExecutionParamsByJobExecutionId(jobExecution.getJobExecutionId()); if (jobExecution.getParams() != null && !jobExecution.getParams().isEmpty()) { for (JobExecutionParam param : jobExecution.getParams()) { param.setId(idGenerator.nextId()); param.setJobExecutionId(jobExecution.getJobExecutionId()); param.setJobInstanceId(jobExecution.getJobInstanceId()); jobExecutionParamMapper.insertJobExecutionParam(param); } } } } @Transactional public void saveJobInstance(JobInstance jobInstance) { if (jobInstance.getJobInstanceId() == null) { jobInstance.setJobInstanceId(idGenerator.nextId()); jobInstanceMapper.insertJobInstance(jobInstance); if (jobInstance.getParams() != null && !jobInstance.getParams().isEmpty()) { for (JobParam param : jobInstance.getParams()) { param.setId(idGenerator.nextId()); param.setJobInstanceId(jobInstance.getJobInstanceId()); jobParamMapper.insertJobParam(param); } } if (jobInstance.getExecutions() != null && !jobInstance.getExecutions().isEmpty()) { for (JobExecution jobExecution : jobInstance.getExecutions()) { jobExecution.setJobInstanceId(jobInstance.getJobInstanceId()); this.saveJobExecution(jobExecution); } } } else { JobInstance model = this.getJobInstanceById(jobInstance.getJobInstanceId()); if (model != null) { model.setVersion(jobInstance.getVersion()); if (jobInstance.getJobName() != null) { model.setJobName(jobInstance.getJobName()); } jobInstanceMapper.updateJobInstance(model); jobParamMapper.deleteJobParamsByJobInstanceId(model.getJobInstanceId()); if (jobInstance.getParams() != null && !jobInstance.getParams().isEmpty()) { for (JobParam param : jobInstance.getParams()) { param.setId(idGenerator.nextId()); param.setJobInstanceId(model.getJobInstanceId()); jobParamMapper.insertJobParam(param); } } } } } @Transactional public void saveStepExecution(StepExecution stepExecution) { if (stepExecution.getStepExecutionId() == null) { stepExecution.setStepExecutionId(idGenerator.nextId()); stepExecutionMapper.insertStepExecution(stepExecution); } else { StepExecution model = this.getStepExecutionById(stepExecution.getStepExecutionId()); if (model != null) { model.setVersion(stepExecution.getVersion()); if (stepExecution.getStepKey() != null) { model.setStepKey(stepExecution.getStepKey()); } if (stepExecution.getStepName() != null) { model.setStepName(stepExecution.getStepName()); } if (stepExecution.getStartTime() != null) { model.setStartTime(stepExecution.getStartTime()); } if (stepExecution.getEndTime() != null) { model.setEndTime(stepExecution.getEndTime()); } if (stepExecution.getStatus() != null) { model.setStatus(stepExecution.getStatus()); } model.setCommitCount(stepExecution.getCommitCount()); model.setReadCount(stepExecution.getReadCount()); model.setFilterCount(stepExecution.getFilterCount()); model.setWriteCount(stepExecution.getWriteCount()); model.setReadSkipCount(stepExecution.getReadSkipCount()); model.setWriteSkipCount(stepExecution.getWriteSkipCount()); model.setProcessSkipCount(stepExecution.getProcessSkipCount()); model.setRollbackCount(stepExecution.getRollbackCount()); if (stepExecution.getExitCode() != null) { model.setExitCode(stepExecution.getExitCode()); } if (stepExecution.getExitMessage() != null) { model.setExitMessage(stepExecution.getExitMessage()); } if (stepExecution.getLastUpdated() != null) { model.setLastUpdated(stepExecution.getLastUpdated()); } stepExecutionMapper.updateStepExecution(model); } } } @javax.annotation.Resource public void setEntityDAO(EntityDAO entityDAO) { this.entityDAO = entityDAO; } @javax.annotation.Resource public void setIdGenerator(IdGenerator idGenerator) { this.idGenerator = idGenerator; } @javax.annotation.Resource public void setJobExecutionContextMapper(JobExecutionContextMapper jobExecutionContextMapper) { this.jobExecutionContextMapper = jobExecutionContextMapper; } @javax.annotation.Resource public void setJobExecutionMapper(JobExecutionMapper jobExecutionMapper) { this.jobExecutionMapper = jobExecutionMapper; } @javax.annotation.Resource public void setJobExecutionParamMapper(JobExecutionParamMapper jobExecutionParamMapper) { this.jobExecutionParamMapper = jobExecutionParamMapper; } @javax.annotation.Resource public void setJobInstanceMapper(JobInstanceMapper jobInstanceMapper) { this.jobInstanceMapper = jobInstanceMapper; } @javax.annotation.Resource public void setJobParamMapper(JobParamMapper jobParamMapper) { this.jobParamMapper = jobParamMapper; } @javax.annotation.Resource public void setSqlSession(SqlSession sqlSession) { this.sqlSession = sqlSession; } @javax.annotation.Resource public void setStepExecutionContextMapper(StepExecutionContextMapper stepExecutionContextMapper) { this.stepExecutionContextMapper = stepExecutionContextMapper; } @javax.annotation.Resource public void setStepExecutionMapper(StepExecutionMapper stepExecutionMapper) { this.stepExecutionMapper = stepExecutionMapper; } @Transactional public void startStepExecution(String jobStepKey) { StepExecution step = this.getStepExecutionByKey(jobStepKey); if (step != null) { step.setStartTime(new Date()); step.setStatus(BatchStatus.STARTED.toString()); step.setEndTime(null); stepExecutionMapper.updateStepExecution(step); } } @Override public boolean stepExecutionCompleted(String jobStepKey) { StepExecution step = this.getStepExecutionByKey(jobStepKey); if (step != null && step.getStatus() != null) { if (BatchStatus.match(step.getStatus()) == BatchStatus.COMPLETED) { return true; } } return false; } }