【发布时间】:2021-08-30 20:54:52
【问题描述】:
完全更新的代码
我正在使用 Twilio 实现在约会前 3 天发送的文本提醒。我已经在我的后端(java)中实现了它。我在数据库中添加了一些访问,这些访问应该会触发要安排的作业,但我不确定如何检查作业是否已安排发送消息?
我知道访问正在添加到数据库中,因为我可以检查,所以scheduleJob(visit); 应该安排发送文本,但我不确定。
访问控制器.java
@PostMapping()
public ResponseEntity<Object> addVisit(@RequestBody Visit visit){
Result<Visit> result = service.add(visit);
if(result.isSuccess()){
scheduleJob(visit);
return new ResponseEntity<>(result.getPayload(), HttpStatus.CREATED);
}
return ErrorResponse.build(result);
}
private void scheduleJob(Visit visit) {
String visitId = String.valueOf(visit.getVisitId());
ZoneId defaultZoneId = ZoneId.systemDefault();
LocalDate date = visit.getVisitDate().minusDays(3);
Date finalDate = Date.from(date.atStartOfDay(defaultZoneId).plusHours(16).toInstant());
JobDetail job =
newJob(VisitScheduler.class).withIdentity("Appointment_J_" + visitId)
.usingJobData("visitId", visitId).build();
Trigger trigger =
newTrigger().withIdentity("Appointment_T_" + visitId).startAt(finalDate).build();
try {
scheduler.scheduleJob(job, trigger);
} catch (SchedulerException e) {
System.out.println("Unable to schedule the Job");
}
}
访问Scheduler.java
public class VisitScheduler implements Job {
private static Logger logger = LoggerFactory.getLogger(VisitScheduler.class);
public static final String ACCOUNT_SID = "account sid";
public static final String AUTH_TOKEN = "auth token";
public static final String TWILIO_NUMBER = "twilio number";
public static final String TO_NUMBER= "number to send messages to";
private final VisitRepository repository;
public VisitScheduler(VisitRepository repository) {
this.repository = repository;
}
@Override
public void execute(JobExecutionContext context) {
VisitService service = new VisitService(repository);
Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
int visitId = Integer.parseInt(dataMap.getString("visitId"));
Visit visit = service.findByVisitId(visitId);
if (visit != null) {
String date = String.valueOf(visit.getVisitDate());
String time = String.valueOf(visit.getVisitTime());
String messageBody = "This is a reminder about your visit at " + time + " on " + date + " See you then!";
try {
Message message = Message
.creator(new PhoneNumber(TO_NUMBER), new PhoneNumber(TWILIO_NUMBER), messageBody)
.create();
System.out.println("Message sent! Message SID: " + message.getSid());
} catch(TwilioException ex) {
logger.error("An exception occurred trying to send the message \"{}\" to {}." +
" \nTwilio returned: {} \n", messageBody, TO_NUMBER, ex.getMessage());
}
}
}
}
【问题讨论】:
-
这是正确的吗? int visitId = dataMap.getInt("visitId");不应该用getString吗?
-
@NigelSavage 我已经更新了我的代码以使用 getString,但我需要将它解析为一个 int,因为 service.findByVisitId 需要一个 int
标签: java twilio quartz-scheduler