3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LineNotify+SpringBootで定期的に通知を送る

Last updated at Posted at 2020-07-17

#初めに
SpringBootでwebアプリ作成していた際に、特定の情報を定期的に通知したい!!!と考え方法を調べた結果、意外にもあっさり実装できたのでまとめてみました。

実行環境

  • java : 11
  • Spring Boot : 2.4.0
  • Maven : 3.6.3

##①LINE Notify公式ページでアクセストークンを取得
下記URLにアクセスし、表示されているQRコードを読み取りLINE Notifyを友達追加します。

その後同ページで自身のLINEアカウントでログイン後に「マイページ」→「アクセストークンを発行」と進みます。トークン名(LINEで実際にメッセージが通知される際に、そのメッセージの一番上に表示される)を入力し、任意のトークルームを選択するとトークンが表示されます。

なおトークンが表示されるのは一回こっきりなので注意が必要です。
とはいえ発行自体はいくらでも出来るのでその点はご安心を。

##②通知を送るためのクラスを作成
LINEに通知を飛ばすためにDIコンテナに登録するBeanを作成します。
必要となる特別な依存性はありません。

LineNotify.java

@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アノテーションを使用します。

Application.java

@SpringBootApplication
@EnableScheduling //・・・追加
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

これにより@Scheduledアノテーションが使用されているDIコンテナ内の任意のBeanを検出できます。
ということで先ほど通知機能を実装したクラスに戻り、実際に定期実行したいメソッドにアノテーションを追加します。

LineNotify.java

@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を定期実行する方法

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?