Отправка автоматического сообщения в заданную дату

#java #sms #quartz-scheduler #sinch

#java #sms #quartz-планировщик #sinch

Вопрос:

Я создал SMS-приложение на Java, которое работает как шарм. Я хочу, чтобы приложение отправляло SMS в заданную дату. Для этого я использую Quartz Job Scheduling. Сначала мне нужно, чтобы эти два приложения были подключены друг к другу. Затем мне нужно, чтобы Quartz собрал дату и время из списка (может быть списком Excel) и отправил сообщение. Возможно ли это? Ценю любую помощь.

Вот приложение для отправки сообщений:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.commons.codec.binary.Base64;

public class SMSApplication {

    public static void main(String[] args) {

        try {
            String phoneNumber = " XXXXXXXXX";
            String appKey = "XXXXXXX";
            String appSecret = "XXXXXXXX";
            String message = "Hello world!";

            URL url = new URL("https://messagingapi.sinch.com/v1/sms/"   phoneNumber);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");

            String userCredentials = "application\"   appKey   ":"   appSecret;
            byte[] encoded = Base64.encodeBase64(userCredentials.getBytes());
            String basicAuth = "Basic "   new String(encoded);
            connection.setRequestProperty("Authorization", basicAuth);

            String postData = "{"Message":""   message   ""}";
            OutputStream os = connection.getOutputStream();
            os.write(postData.getBytes());

            StringBuilder response = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));

            String line;
            while ( (line = br.readLine()) != null)
                response.append(line);

            br.close();
            os.close();

            System.out.println(response.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
  

Вот класс задания Quartz:

 import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class QuartzJob implements Job{

    @Override
    public void execute(JobExecutionContext jec) throws JobExecutionException {

            System.out.println("Hello");
            System.out.println(new Date())
    }
   }
  

А вот и основной класс Quartz:

 import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.ScheduleBuilder;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;


public class QuartzMain {

    public static void main(String[] args) throws SchedulerException {

        JobDetail job = JobBuilder.newJob(QuartzJob.class).build();

        Trigger tl = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger").startNow().build();

        Scheduler sc = StdSchedulerFactory.getDefaultScheduler();

        sc.start();
        sc.scheduleJob(job, tl);

    }}
  

Комментарии:

1. «Возможно ли это? Ценю любую помощь.», это очень широко и расплывчато — не могли бы вы уточнить в своем вопросе, о чем вы спрашиваете, и как это связано с опубликованным кодом?

2. Мне очень жаль. Я совсем новичок на этом форуме и совсем новичок в программировании. Я в принципе не знаю, как подключить SMS-приложение и Quartz? Я видел пару примеров с электронными письмами вместо SMS, но я все еще не понял, какая часть кода их соединяла. Я просто хочу сказать приложению Quartz отправить сообщение с помощью приложения SMS.

3. Эй, почему бы тебе просто не переместить код (или не создать класс, который не является основным из функциональности sms, и не переместить его в yoru job, где ты печатаешь hello world

4. Это отличная идея. Какой метод лучше? Переместить код или создать класс? Вы также знаете, как я могу включить класс SMS для выполнения действий при активации Quartz?

Ответ №1:

Для запуска в заданную дату:

В триггере замените .startNow() на .startAt(date) , где date является java.util.Date , представляющим дату и время, когда оно должно начаться.

Для подключения:

В вашем классе заданий Quartz вызовите свой метод sendSMS() (в настоящее время ваш основной метод в SMSApplication) любые переменные (такие как номер телефона) должны быть переданы классу job в сборщике заданий с помощью .usingJobData("key","value") . Смотрите http://www.quartz-scheduler.org/documentation/quartz-2.3.0 и прочитайте руководства и кулинарную книгу для получения дополнительной информации.

Комментарии:

1. Большое вам спасибо. Это мне очень помогает.