#初めに
SpringBootでwebアプリ作成していた際に、特定の情報を定期的に通知したい!!!と考え方法を調べた結果、意外にもあっさり実装できたのでまとめてみました。
実行環境
- java : 11
- Spring Boot : 2.4.0
- Maven : 3.6.3
##①LINE Notify公式ページでアクセストークンを取得
下記URLにアクセスし、表示されているQRコードを読み取りLINE Notifyを友達追加します。
その後同ページで自身のLINEアカウントでログイン後に「マイページ」→「アクセストークンを発行」と進みます。トークン名(LINEで実際にメッセージが通知される際に、そのメッセージの一番上に表示される)を入力し、任意のトークルームを選択するとトークンが表示されます。
なおトークンが表示されるのは一回こっきりなので注意が必要です。
とはいえ発行自体はいくらでも出来るのでその点はご安心を。
##②通知を送るためのクラスを作成
LINEに通知を飛ばすためにDIコンテナに登録するBeanを作成します。
必要となる特別な依存性はありません。
@Component
public class LineNotify {
public void executeNotification() {
String message = "送りたいメッセージ";
String token = "取得してきたトークン";
sendNotification(message,token);
}
public void sendNotification(String message, String token) {
HttpURLConnection connection = null;
try {
URL url = new URL("https://notify-api.line.me/api/notify");
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.addRequestProperty("Authorization", "Bearer " + token);
try (OutputStream outputStream = connection.getOutputStream();
PrintWriter writer = new PrintWriter(outputStream)) {
writer.append("message=").append(URLEncoder.encode(message, "UTF-8")).flush();
}
} catch (Exception e) {
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
}
sendNotificationメソッドの引数に送りたいメッセージとトークンを渡し、指定のURLにPOST通信を走らせてます。LINE Notifyで通知を送るためにはOAuth認証が必須となりますが、メソッド内でリクエストヘッダに Authorization: Bearer <access_token>
を付与してアクセスすることで、認証が実行されています。
##③通知を定期的に送るための設定
スケジュールされたタスク実行機能を有効にするため
メインクラスに@EnableScheduling
アノテーションを使用します。
@SpringBootApplication
@EnableScheduling //・・・追加
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
これにより@Scheduled
アノテーションが使用されているDIコンテナ内の任意のBeanを検出できます。
ということで先ほど通知機能を実装したクラスに戻り、実際に定期実行したいメソッドにアノテーションを追加します。
@Component
public class LineNotify {
@Scheduled(cron = "0 * * * * *", zone = "Asia/Tokyo") //・・・追加
public void executeNotification() {
String message = "送りたいメッセージ";
String token = "取得してきたトークン";
sendNotification(message,token);
}
...
ここまで出来たら、後はサーバーを起動するだけでタスクが実行され、通知が届くようになります。
cron
でタスクを実行する周期を、zone
ではタイムゾーンをそれぞれ指定しています。
cron
は左から「秒・分・時・月・日・曜日」のトリガーを設定でき、上記のサンプルコードでは毎分0秒にタスクを実行するよう設定されています。例えば毎日9時0分0秒にタスクを実行したいという場合は
「cron = "0 0 9 * * *"
」といったように設定します。
他にもアプリケーションの起動からn秒後の実行を指定させるinitialDelay
や、メソッド処理の実行完了からn秒後の実行を指定させるfixedDelay
などのオプションもあるため、比較的自由にカスタマイズすることができます。
#参考
・5分で実装するJavaからLINE Notifyによる通知
・Spring Bootでtaskを定期実行する方法