Springboot+Slake botで地下鉄のお知らせを送ります


特定の時間帯に同じ地下鉄に乗るので、乗る時間内に地下鉄情報は便乗でお知らせします.

1.依存性の追加


依存性を追加して、devtoolsで以前に作成したクエリーに従ってインポートします.
	implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client'
	implementation 'co.elastic.clients:elasticsearch-java:7.16.3'

2.弾性接続


application.ymlファイルにurl、portを指定し、@Valueをインポートします.また,フレックスコネクション方式では,HighLevelClientを用いてコネクションを行う.
    @Value(value = "${elasticsearch.host}")
    String url;
    @Value(value = "${elasticsearch.port}")
    int port;
    static RestHighLevelClient client;

    public void init()
    {
        client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost(url, port, "http")));
    }

3.クエリーの作成

    public Map<String,Object> search_one(String name,String text)throws IOException {

        init();

        Map<String, Object> result = null;
        //조회 할 인덱스 지정
        SearchRequest searchRequest = new SearchRequest("realtime-subway");
        //쿼리 지정
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery(name, text))
                .sort(new FieldSortBuilder("realtimeArrivalList.recptnDt").order(SortOrder.DESC));

        searchSourceBuilder.from(0);
        searchSourceBuilder.size(1);

        //searchRequset에 빌더 지정
        searchRequest.source(searchSourceBuilder);

        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            for (SearchHit s : searchResponse.getHits().getHits()) {
                result = s.getSourceAsMap();
            }
            return result;
        } catch (IOException e) {
            System.err.println("Elastic search fail");
        }
        return null;
    }
以前devtoolsで作成したクエリーに従ってインポートします.matchQueryを使用して特定の態様を検索し、recptnDt規格を使用して降順ソートして最新のデータを取得します.

4.スプリングスケジューラ


スケジューラを使用して、特定の時間に通知を発行します.固定されたcron正規表現を使用して時間を指定できます.今回はログステータスと同様にcron正規表現を使用します.
@RequiredArgsConstructor
@Configuration
@EnableScheduling
public class SlackScheduler {
    private final SlackService slackService;
    private final ElasticService elasticService;

    @Scheduled(cron="0/60 * * * * *") //1분에 한 번씩
    public void slackScheduler() throws IOException {
        String responseMessage = subway();
		//슬랙 메시지 전송
        slackService.postSlackMessage(responseMessage);
    }

    private String subway() throws IOException {
        Map<String, Object> result = elasticService.search_one("realtimeArrivalList.trainLineNm", "이수");

        String responseMessage = "🚊 지하철 알림 🚊"+ "\n";

		//메시지 파싱
        String[] results = result.get("realtimeArrivalList").toString()
                .replace("{","").replace("}","")
                .split(",");

        for (String s : results) {
            String[] split = s.split("=");
            System.out.println(split[0]);
            responseMessage += split[1] +"\n";
        }
        return responseMessage;
    }
}
Elasticから持ってきたデータを適切にグループ化してパンツにメッセージを送る.テストは1分おきに行われ、以下のクローン@Scheduled(cron = "0 0 18 ? * MON-FRI")を使用して平日18時に通知を送信できます.
🙌 ゆとり伝送結果