Skip to content

Commit

Permalink
Merge pull request #283 from WE-ARE-RACCOONS/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
ywj9811 authored Jun 5, 2024
2 parents c8795dc + 4acdf4b commit 448ef16
Show file tree
Hide file tree
Showing 9 changed files with 138 additions and 152 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ configurations {

repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}

dependencies {
Expand Down Expand Up @@ -82,6 +83,8 @@ dependencies {

// https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter
implementation 'org.redisson:redisson-spring-boot-starter:3.18.0'

implementation 'com.github.ywj9811:QueryDslItemReader:v1.0.0'
}

tasks.named('test') {
Expand Down
68 changes: 33 additions & 35 deletions src/main/java/com/postgraduate/batch/cancel/CancelJobConfig.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
package com.postgraduate.batch.cancel;

import com.postgraduate.domain.mentoring.domain.entity.Mentoring;
import com.querydslitemreader.core.pagingitemreader.expression.Expression;
import com.querydslitemreader.core.pagingitemreader.options.QueryDslNoOffsetNumberOptions;
import com.querydslitemreader.core.pagingitemreader.options.QueryDslNoOffsetPagingItemReader;
import jakarta.persistence.EntityManagerFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.item.database.JdbcPagingItemReader;
import org.springframework.batch.item.database.PagingQueryProvider;
import org.springframework.batch.item.database.builder.JdbcPagingItemReaderBuilder;
import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

import static com.postgraduate.domain.mentoring.domain.entity.QMentoring.mentoring;
import static com.postgraduate.domain.mentoring.domain.entity.constant.Status.WAITING;
import static com.postgraduate.domain.payment.domain.entity.QPayment.payment;
import static com.postgraduate.domain.senior.domain.entity.QSenior.senior;
import static com.postgraduate.domain.user.domain.entity.QUser.user;
import static java.time.LocalDateTime.now;

@Configuration
Expand All @@ -29,23 +31,25 @@
public class CancelJobConfig {
private final JobRepository jobRepository;
private final PlatformTransactionManager transactionManager;
private final CancelMentoringProcessor cancelMentoringProcessor;
private final CancelMentoringWriter cancelMentoringWriter;
private final DataSource dataSource;
private final EntityManagerFactory entityManagerFactory;

private static final int CHUNK_SIZE = 50;

@Bean(name = "cancelJob")
public Job cancelJob() throws Exception {
public Job cancelJob() {
return new JobBuilder("cancelJob", jobRepository)
.start(cancelStep())
.build();
}

@Bean(name = "cancelStep")
public Step cancelStep() throws Exception {
public Step cancelStep() {
return new StepBuilder("cancelStep", jobRepository)
.<CancelMentoring, CancelMentoring>chunk(CHUNK_SIZE, transactionManager)
.<Mentoring, CancelMentoring>chunk(CHUNK_SIZE, transactionManager)
.reader(itemReader())
.processor(cancelMentoringProcessor)
.writer(cancelMentoringWriter)
.faultTolerant()
.skip(Exception.class)
Expand All @@ -54,33 +58,27 @@ public Step cancelStep() throws Exception {
}

@Bean(name = "cancelReader")
public JdbcPagingItemReader<CancelMentoring> itemReader() throws Exception {
Map<String, Object> parameter = new HashMap<>();
public QueryDslNoOffsetPagingItemReader<Mentoring> itemReader() {
QueryDslNoOffsetNumberOptions<Mentoring, Long> options = new QueryDslNoOffsetNumberOptions<>(mentoring.mentoringId, Expression.DESC);

LocalDateTime now = now()
.toLocalDate()
.atStartOfDay();
parameter.put("date", Timestamp.valueOf(now));

return new JdbcPagingItemReaderBuilder<CancelMentoring>()
.pageSize(CHUNK_SIZE)
.fetchSize(CHUNK_SIZE)
.dataSource(dataSource)
.rowMapper(new CancelMentoringRowMapper())
.queryProvider(cancelQueryProvider())
.parameterValues(parameter)
.name("cancelReader")
.build();
}

@Bean(name = "cancelQuery")
public PagingQueryProvider cancelQueryProvider() throws Exception {
SqlPagingQueryProviderFactoryBean queryProvider = new SqlPagingQueryProviderFactoryBean();
queryProvider.setDataSource(dataSource);
queryProvider.setSelectClause("select mentoring_id, user_user_id, senior_senior_id, payment_payment_id");
queryProvider.setFromClause("from mentoring");
queryProvider.setWhereClause("where status = 'WAITING' and created_at < :date");
queryProvider.setSortKey("mentoring_id");
return queryProvider.getObject();
return new QueryDslNoOffsetPagingItemReader<>(entityManagerFactory, CHUNK_SIZE, options, queryFactory ->
queryFactory.selectFrom(mentoring)
.distinct()
.join(payment)
.on(mentoring.payment.eq(payment))
.fetchJoin()
.join(user)
.on(mentoring.user.eq(user))
.fetchJoin()
.join(senior)
.on(mentoring.senior.eq(senior))
.fetchJoin()
.where(mentoring.status.eq(WAITING).and(mentoring.createdAt.before(now)))
);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.postgraduate.batch.cancel;

import com.postgraduate.domain.mentoring.domain.entity.Mentoring;
import com.postgraduate.domain.payment.domain.entity.Payment;
import com.postgraduate.domain.senior.domain.entity.Senior;
import com.postgraduate.domain.user.domain.entity.User;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;

@Component
public class CancelMentoringProcessor implements ItemProcessor<Mentoring, CancelMentoring> {
@Override
public CancelMentoring process(Mentoring mentoring) throws Exception {
User user = mentoring.getUser();
Senior senior = mentoring.getSenior();
Payment payment = mentoring.getPayment();
return new CancelMentoring(mentoring.getMentoringId(), user.getUserId(), senior.getSeniorId(), payment.getPaymentId());
}
}

This file was deleted.

61 changes: 33 additions & 28 deletions src/main/java/com/postgraduate/batch/done/DoneJobConfig.java
Original file line number Diff line number Diff line change
@@ -1,44 +1,51 @@
package com.postgraduate.batch.done;

import com.postgraduate.domain.mentoring.domain.entity.Mentoring;
import com.postgraduate.domain.mentoring.domain.entity.constant.Status;
import com.querydslitemreader.core.pagingitemreader.expression.Expression;
import com.querydslitemreader.core.pagingitemreader.options.QueryDslNoOffsetNumberOptions;
import com.querydslitemreader.core.pagingitemreader.options.QueryDslNoOffsetPagingItemReader;
import jakarta.persistence.EntityManagerFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.item.database.JdbcPagingItemReader;
import org.springframework.batch.item.database.PagingQueryProvider;
import org.springframework.batch.item.database.builder.JdbcPagingItemReaderBuilder;
import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import static com.postgraduate.domain.mentoring.domain.entity.QMentoring.mentoring;
import static com.postgraduate.domain.payment.domain.entity.QPayment.payment;
import static com.postgraduate.domain.salary.domain.entity.QSalary.salary;
import static com.postgraduate.domain.senior.domain.entity.QSenior.senior;

@Configuration
@RequiredArgsConstructor
@Slf4j
public class DoneJobConfig {
private final JobRepository jobRepository;
private final PlatformTransactionManager transactionManager;
private final DataSource dataSource;
private final DoneMentoringProcessor doneMentoringProcessor;
private final DoneMentoringWriter doneMentoringWriter;
private final DoneMentoringSkipListener doneMentoringSkipListener;
private final EntityManagerFactory entityManagerFactory;

private static final int CHUNK_SIZE = 50;

@Bean(name = "doneJob")
public Job doneJob() throws Exception {
public Job doneJob() {
return new JobBuilder("doneJob", jobRepository)
.start(doneStep())
.build();
}

@Bean(name = "doneStep")
public Step doneStep() throws Exception {
public Step doneStep() {
return new StepBuilder("doneStep", jobRepository)
.<DoneMentoring, DoneMentoring>chunk(CHUNK_SIZE, transactionManager)
.<Mentoring, DoneMentoring>chunk(CHUNK_SIZE, transactionManager)
.reader(doneReader())
.processor(doneMentoringProcessor)
.writer(doneMentoringWriter)
Expand All @@ -50,25 +57,23 @@ public Step doneStep() throws Exception {
}

@Bean(name = "doneReader")
public JdbcPagingItemReader<DoneMentoring> doneReader() throws Exception {
return new JdbcPagingItemReaderBuilder<DoneMentoring>()
.pageSize(CHUNK_SIZE)
.fetchSize(CHUNK_SIZE)
.dataSource(dataSource)
.rowMapper(new DoneMentoringRowMapper())
.queryProvider(doneQueryProvider())
.name("doneReader")
.build();
}
public QueryDslNoOffsetPagingItemReader<Mentoring> doneReader() {
QueryDslNoOffsetNumberOptions<Mentoring, Long> options =
new QueryDslNoOffsetNumberOptions(mentoring.mentoringId, Expression.DESC);

@Bean(name = "doneQuery")
public PagingQueryProvider doneQueryProvider() throws Exception {
SqlPagingQueryProviderFactoryBean queryProvider = new SqlPagingQueryProviderFactoryBean();
queryProvider.setDataSource(dataSource);
queryProvider.setSelectClause("select m.mentoring_id, m.senior_senior_id, m.salary_salary_id, m.date, p.pay");
queryProvider.setFromClause("from mentoring m join payment p on m.payment_payment_id = p.payment_id");
queryProvider.setWhereClause("where m.status = 'EXPECTED'");
queryProvider.setSortKey("mentoring_id");
return queryProvider.getObject();
return new QueryDslNoOffsetPagingItemReader<>(entityManagerFactory, CHUNK_SIZE, options, queryFactory ->
queryFactory.selectFrom(mentoring)
.distinct()
.join(payment)
.on(mentoring.payment.eq(payment))
.fetchJoin()
.join(senior)
.on(mentoring.senior.eq(senior))
.fetchJoin()
.join(salary)
.on(mentoring.salary.eq(salary))
.fetchJoin()
.where(mentoring.status.eq(Status.EXPECTED))
);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.postgraduate.batch.done;

import com.postgraduate.domain.mentoring.domain.entity.Mentoring;
import com.postgraduate.domain.payment.domain.entity.Payment;
import com.postgraduate.domain.salary.domain.entity.Salary;
import com.postgraduate.domain.senior.domain.entity.Senior;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;

Expand All @@ -11,14 +15,17 @@
import static java.time.format.DateTimeFormatter.ofPattern;

@Component
public class DoneMentoringProcessor implements ItemProcessor<DoneMentoring, DoneMentoring> {
public class DoneMentoringProcessor implements ItemProcessor<Mentoring, DoneMentoring> {
@Override
public DoneMentoring process(DoneMentoring doneMentoring) {
public DoneMentoring process(Mentoring mentoring) {
DateTimeFormatter formatter = ofPattern("yyyy-MM-dd-HH-mm");
LocalDateTime doneDate = parse(doneMentoring.date(), formatter);
if (now().minusDays(3)
.isAfter(doneDate))
return doneMentoring;
LocalDateTime doneDate = parse(mentoring.getDate(), formatter);
if (now().minusDays(3).isAfter(doneDate)) {
Senior senior = mentoring.getSenior();
Salary salary = mentoring.getSalary();
Payment payment = mentoring.getPayment();
return new DoneMentoring(mentoring.getMentoringId(), senior.getSeniorId(), salary.getSalaryId(), mentoring.getDate(), payment.getPay());
}
return null;
}
}
Loading

0 comments on commit 448ef16

Please sign in to comment.