Skip to content

Commit

Permalink
feat/#294 : 스케줄링 설정
Browse files Browse the repository at this point in the history
  • Loading branch information
LJH098 committed Jun 5, 2024
1 parent bd7a71e commit 07de2be
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 1 deletion.
3 changes: 3 additions & 0 deletions BE/exceed/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ dependencies {

// Prometheus
implementation 'io.micrometer:micrometer-registry-prometheus'

// quartz
implementation group: 'org.quartz-scheduler', name: 'quartz', version: '2.3.2'
}

tasks.named('bootBuildImage') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.gaebaljip.exceed.common.event;

import java.time.LocalDateTime;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class UpdateWeightEvent extends InfraEvent {
private Long memberId;
private String url;
private LocalDateTime localDateTime;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.gaebaljip.exceed.infrastructure.quartz;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

import com.gaebaljip.exceed.common.event.UpdateWeightEvent;
import com.gaebaljip.exceed.infrastructure.quartz.job.UpdateWeightEmitterJob;
import com.gaebaljip.exceed.infrastructure.sse.adapter.out.NotificationType;

import lombok.extern.log4j.Log4j2;

@Component
@Log4j2
public class UpdateWeightEventListener {
@TransactionalEventListener(
classes = UpdateWeightEvent.class,
phase = TransactionPhase.AFTER_COMMIT)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void handle(UpdateWeightEvent event) {
Long memberId = event.getMemberId();
String url = event.getUrl();
JobDetail jobDetail = createJobDetail(memberId, url);
Trigger trigger = createTrigger(event, jobDetail);
createSchedule(jobDetail, trigger);
}

private void createSchedule(JobDetail jobDetail, Trigger trigger) {
try {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
log.info(">>>>>>>>>>>>>>>>> SSE 전송 스케줄링 시작");
scheduler.scheduleJob(jobDetail, trigger);
log.info(">>>>>>>>>>>>>>>>> SSE 전송 스케줄링 등록");
} catch (SchedulerException e) {
log.error(">>>>>>>>>>>>>>>>> SSE 전송 스케줄링 실패");
}
}

private JobDetail createJobDetail(Long memberId, String url) {
String content = "몸무게 수정하신지 7일이 지났습니다. 몸무게를 수정해주세요";
NotificationType type = NotificationType.NOTICE;
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("memberId", memberId);
jobDataMap.put("url", url);
jobDataMap.put("content", content);
jobDataMap.put("type", type);
return JobBuilder.newJob(UpdateWeightEmitterJob.class)
.withIdentity("UPDATE_WEIGHT_JOB", "group1")
.setJobData(jobDataMap)
.build();
}

private Trigger createTrigger(UpdateWeightEvent event, JobDetail jobDetail) {
LocalDateTime triggerDateTime = event.getLocalDateTime().plusDays(7);
Date triggerDate = Date.from(triggerDateTime.atZone(ZoneId.of("Asia/Seoul")).toInstant());
TriggerBuilder<Trigger> triggerTriggerBuilder = TriggerBuilder.newTrigger();
triggerTriggerBuilder.withIdentity("UPDATE_WEIGHT_TRIGGER", "group1");
triggerTriggerBuilder.startAt(triggerDate);
triggerTriggerBuilder.forJob(jobDetail);
return triggerTriggerBuilder.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.gaebaljip.exceed.infrastructure.quartz.job;

import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.gaebaljip.exceed.infrastructure.sse.adapter.out.NotificationType;
import com.gaebaljip.exceed.infrastructure.sse.application.port.in.SendEmitterUseCase;
import com.gaebaljip.exceed.member.adapter.out.persistence.MemberEntity;
import com.gaebaljip.exceed.member.application.port.out.MemberPort;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

@Log4j2
@RequiredArgsConstructor
// Application Context에 Bean 등록되있는 것을 DI 하기 위해 QuartzJobBean을 상속함
public class UpdateWeightEmitterJob extends QuartzJobBean {
private final SendEmitterUseCase sendEmitterUseCase;
private final MemberPort memberPort;

@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getMergedJobDataMap();
Long memberId = jobDataMap.getLong("memberId");
MemberEntity receiver = memberPort.query(memberId);
String url = jobDataMap.getString("url");
String content = jobDataMap.getString("content");
NotificationType notificationType = (NotificationType) jobDataMap.get("type");
sendEmitterUseCase.send(receiver, content, url, notificationType);
}
}
29 changes: 29 additions & 0 deletions BE/exceed/src/main/resources/application-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,32 @@ logging:
type:
descriptor:
sql: trace

org:
quartz:
scheduler:
instanceName: gaebaljip
instanceId: AUTO
rmi:
export: false
proxy: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 5
context:
key:
QuartzTopic: QuartzPorperties
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
isClustered: true
dataSource: gaebaljip
dataSource:
gaebaljip:
provider: hikaricp
driver: org.mariadb.jdbc.Driver
URL: ${SPRING_DATASOURCE_URL}
user: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
maxConnections: 30
30 changes: 29 additions & 1 deletion BE/exceed/src/main/resources/application-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,32 @@ logging:
hibernate:
type:
descriptor:
sql: trace
sql: trace
org:
quartz:
scheduler:
instanceName: gaebaljip
instanceId: AUTO
rmi:
export: false
proxy: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 5
context:
key:
QuartzTopic: QuartzPorperties
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
isClustered: true
dataSource: gaebaljip
dataSource:
gaebaljip:
provider: hikaricp
driver: org.mariadb.jdbc.Driver
URL: jdbc:mariadb://localhost:3306/gaebaljip?serverTimezone=Asia/Seoul
user: root
password: root
maxConnections: 30

0 comments on commit 07de2be

Please sign in to comment.