初めに
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などのオプションもあるため、比較的自由にカスタマイズすることができます。