【问题标题】:Quartz Scheduler - Is the job correctly scheduled?Quartz Scheduler - 作业是否正确安排?
【发布时间】: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


【解决方案1】:

这里是 Twilio 开发者宣传员。

在这一行中,您存储作业数据:

JobDetail job = newJob(VisitScheduler.class).withIdentity("Appointment_J_" + visitId)
                .usingJobData("appointmentId", visitId).build();

您将"appointmentId" 设置为visitId

VisitScheduler 中,然后尝试通过以下方式获取visitId

int visitId = Integer.parseInt(dataMap.getString("visitId"));

这应该是"appointmentId" 以匹配您之前设置的字段吗?

【讨论】:

  • 好的,谢谢。我没有抓住那个。我已更新我的代码以反映该更改
  • 解决了吗?究竟出了什么问题?
  • 我的回购和服务以及日期格式还有一些其他问题,但现在可以正常工作了!
猜你喜欢
  • 2020-08-30
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多