JavaRush /Блоги Java /Random-TG /Илова кардани ҷадвали баҳор - "Лоиҳаи Java аз A то Я"
Roman Beekeeper
Сатҳи

Илова кардани ҷадвали баҳор - "Лоиҳаи Java аз A то Я"

Дар гурӯҳ нашр шудааст
Салом ба хама, дустони азизам. Дар мақолаи қаблӣ , мо муштариро барои кор бо JavaRush API барои мақолаҳо омода кардем. Акнун мо метавонем мантиқи кори худро нависем, ки ҳар 15 дақиқа иҷро карда мешавад. Маҳз ҳамон тавре ки дар ин диаграмма нишон дода шудааст: "Лоиҳаи Java аз A то Я": Илова кардани ҷадвали баҳор - 1Ҳар 15 дақиқа кор оғоз мешавад (ба андешаи мо, танҳо як усул дар синфи мушаххас), ки дар заминаи барномаи асосӣ иҷро карда мешавад ва корҳои зеринро иҷро мекунад:
  1. Дар ҳама гурӯҳҳое, ки дар базаи мо ҳастанд, мақолаҳои наверо, ки пас аз иҷрои қаблӣ нашр шудаанд, пайдо мекунад.

    Ин схема шумораи камтари гурӯҳҳоро муайян мекунад - танҳо онҳое, ки корбарони фаъол доранд. Он вақт ба назари ман мантиқӣ менамуд, аммо ҳоло ман мефаҳмам, ки новобаста аз он ки корбарони фаъол ба гурӯҳи мушаххас обуна шудаанд ё не, шумо ба ҳар ҳол бояд мақолаи охиринеро, ки бот коркард кардааст, нигоҳ доред. Вазъияте метавонад ба миён ояд, ки корбари нав дарҳол тамоми мақолаҳоеро, ки пас аз қатъ шудани ин гурӯҳ нашр шудаанд, мегирад. Ин рафтори интизорӣ нест ва барои пешгирӣ кардани он, мо бояд он гурӯҳҳоро аз пойгоҳи додаамон нигоҳ дорем, ки дар айни замон корбарони фаъоли нав надоранд.
  2. Агар мақолаҳои нав вуҷуд дошта бошанд, барои ҳамаи корбароне, ки ба ин гурӯҳ фаъолона обуна шудаанд, паёмҳо эҷод кунед. Агар мақолаҳои нав набошанд, мо танҳо корро анҷом медиҳем.

Дар омади гап, ман аллакай дар канали TG-и худ гуфта будам , ки бот аллакай кор мекунад ва мақолаҳои навро дар асоси обуна мефиристад. Биёед ба навиштани FindNewArtcileService оғоз кунем . Тамоми кори ҷустуҷӯ ва фиристодани паёмҳо дар он ҷо сурат мегирад ва кор танҳо усули ин хидматро оғоз мекунад:

FindNewArticleService:

package com.github.javarushcommunity.jrtb.service;

/**
* Service for finding new articles.
*/
public interface FindNewArticleService {

   /**
    * Find new articles and notify subscribers about it.
    */
   void findNewArticles();
}
Хеле оддӣ, дуруст? Ин моҳияти он аст ва тамоми мушкилот дар татбиқи он хоҳад буд:
package com.github.javarushcommunity.jrtb.service;

import com.github.javarushcommunity.jrtb.javarushclient.JavaRushPostClient;
import com.github.javarushcommunity.jrtb.javarushclient.dto.PostInfo;
import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
import com.github.javarushcommunity.jrtb.repository.entity.TelegramUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class FindNewArticleServiceImpl implements FindNewArticleService {

   public static final String JAVARUSH_WEB_POST_FORMAT = "https://javarush.com/groups/posts/%s";

   private final GroupSubService groupSubService;
   private final JavaRushPostClient javaRushPostClient;
   private final SendBotMessageService sendMessageService;

   @Autowired
   public FindNewArticleServiceImpl(GroupSubService groupSubService,
                                    JavaRushPostClient javaRushPostClient,
                                    SendBotMessageService sendMessageService) {
       this.groupSubService = groupSubService;
       this.javaRushPostClient = javaRushPostClient;
       this.sendMessageService = sendMessageService;
   }


   @Override
   public void findNewArticles() {
       groupSubService.findAll().forEach(gSub -> {
           List<PostInfo> newPosts = javaRushPostClient.findNewPosts(gSub.getId(), gSub.getLastArticleId());

           setNewLastArticleId(gSub, newPosts);

           notifySubscribersAboutNewArticles(gSub, newPosts);
       });
   }

   private void notifySubscribersAboutNewArticles(GroupSub gSub, List<PostInfo> newPosts) {
       Collections.reverse(newPosts);
       List<String> messagesWithNewArticles = newPosts.stream()
               .map(post -> String.format("✨Вышла новая статья <b>%s</b> в группе <b>%s</b>.✨\n\n" +
                               "<b>Описание:</b> %s\n\n" +
                               "<b>Ссылка:</b> %s\n",
                       post.getTitle(), gSub.getTitle(), post.getDescription(), getPostUrl(post.getKey())))
               .collect(Collectors.toList());

       gSub.getUsers().stream()
               .filter(TelegramUser::isActive)
               .forEach(it -> sendMessageService.sendMessage(it.getChatId(), messagesWithNewArticles));
   }

   private void setNewLastArticleId(GroupSub gSub, List<PostInfo> newPosts) {
       newPosts.stream().mapToInt(PostInfo::getId).max()
               .ifPresent(id -> {
                   gSub.setLastArticleId(id);
                   groupSubService.save(gSub);
               });
   }

   private String getPostUrl(String key) {
       return String.format(JAVARUSH_WEB_POST_FORMAT, key);
   }
}
Дар ин ҷо мо ҳама чизро бо тартиб ҳал хоҳем кард:
  1. Бо истифода аз groupService мо ҳамаи гурӯҳҳоеро, ки дар пойгоҳи додаҳо мавҷуданд, пайдо мекунем.

  2. Сипас, мо ба ҳама гурӯҳҳо пароканда мешавем ва барои ҳар як мо муштариро меномем, ки дар мақолаи охирин сохта шудааст - javaRushPostClient.findNewPosts .

  3. Баъдан, бо истифода аз усули setNewArticleId , мо ID мақолаи мақолаи охирини худро навсозӣ мекунем, то базаи мо донад, ки мо аллакай мақолаҳои навро коркард кардаем.

  4. Ва бо истифода аз он, ки GroupSub дорои маҷмӯи корбарон аст, мо фаъолонро мегузарем ва дар бораи мақолаҳои нав огоҳинома мефиристем.

Мо ҳоло муҳокима намекунем, ки ин паём чист, ин барои мо чандон муҳим нест. Чизи асосй он аст, ки усул кор мекунад. Мантиқи ҷустуҷӯи мақолаҳои нав ва фиристодани огоҳиҳо омода аст, бинобар ин шумо метавонед ба эҷоди кор гузаред.

FindNewArticleJob эҷод кунед

Мо аллакай дар бораи чӣ будани SpringScheduler сӯҳбат кардем, аммо биёед онро зуд такрор кунем: ин механизм дар чаҳорчӯбаи баҳор барои эҷоди як раванди замина аст, ки дар вақти муайяне, ки мо муқаррар кардаем, кор мекунад. Барои ин ба шумо чӣ лозим аст? Қадами аввал ин илова кардани шарҳи @EnableScheduling ба синфи вуруди баҳори мо мебошад:
package com.github.javarushcommunity.jrtb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class JavarushTelegramBotApplication {

   public static void main(String[] args) {
       SpringApplication.run(JavarushTelegramBotApplication.class, args);
   }

}
Қадами дуюм ин эҷод кардани синф, илова кардани он ба ApplicationContext ва эҷод кардани усул дар он аст, ки давра ба давра иҷро карда мешавад. Мо як бастаи кориро дар ҳамон сатҳ бо анбор, хидмат ва ғайра эҷод мекунем ва дар он ҷо синфи FindNewArticleJob -ро эҷод мекунем :
package com.github.javarushcommunity.jrtb.job;

import com.github.javarushcommunity.jrtb.service.FindNewArticleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;

/**
* Job for finding new articles.
*/
@Slf4j
@Component
public class FindNewArticlesJob {

   private final FindNewArticleService findNewArticleService;

   @Autowired
   public FindNewArticlesJob(FindNewArticleService findNewArticleService) {
       this.findNewArticleService = findNewArticleService;
   }

   @Scheduled(fixedRateString = "${bot.recountNewArticleFixedRate}")
   public void findNewArticles() {
       LocalDateTime start = LocalDateTime.now();

       log.info("Find new article job started.");

       findNewArticleService.findNewArticles();

       LocalDateTime end = LocalDateTime.now();

       log.info("Find new articles job finished. Took seconds: {}",
               end.toEpochSecond(ZoneOffset.UTC) - start.toEpochSecond(ZoneOffset.UTC));
   }
}
Барои илова кардани ин синф ба контексти барнома ман шарҳи @Component -ро истифода кардам . Ва ба тавре ки метод дар дохor синф донад, ки онро давра ба давра иҷро кардан лозим аст, ман ба усул эзоҳ илова кардам: @Scheduled(fixedRateString = "${bot.recountNewArticleFixedRate}") . Аммо мо онро дар файли application.properties насб кардем:
bot.recountNewArticleFixedRate = 900000
Дар ин ҷо арзиш дар миллисонияҳо аст. 15 дақиқа мешавад. Дар ин усул, ҳама чиз оддӣ аст: ман дар гузоришҳо барои худ як метрикаи оддиро илова кардам, то ҷустуҷӯи мақолаҳои навро ҳисоб кунад, то ҳадди аққал фаҳмам, ки он чӣ гуна зуд кор мекунад.

Санҷиши функсияҳои нав

Ҳоло мо дар боти озмоишии худ озмоиш хоҳем кард. Аммо чи тавр? Ман ҳар дафъа мақолаҳоро нест намекунам, то нишон диҳам, ки огоҳиномаҳо расидаанд? Албатта на. Мо танҳо маълумотро дар пойгоҳи дода таҳрир мекунем ва барномаро оғоз мекунем. Ман онро дар serverи санҷишии худ санҷидаам. Барои ин, биёед ба ягон гурӯҳ обуна шавем. Вақте ки обуна ба итмом мерасад, ба гурӯҳ ID-и ҷории мақолаи охирин дода мешавад. Биёед ба пойгоҳи додаҳо равем ва арзиши ду мақоларо тағир диҳем. Дар натиҷа, мо интизорем, ки ҳамон қадар мақолаҳо хоҳанд буд, ки мо lastArticleId-ро ба пештар муқаррар кардем . "Лоиҳаи Java аз A то Я": Илова кардани ҷадвали баҳор - 2Баъдан, мо ба сайт меравем, мақолаҳоро дар гурӯҳи лоиҳаҳои Java ҷудо мекунем - аввал мақолаҳои нав - ва ба мақолаи сеюм аз рӯйхат меравем: "Лоиҳаи Java аз А то Я": Илова кардани ҷадвали баҳор - 3Биёед ба мақолаи поён равем ва аз сатри суроғаҳо мо мақолаи Id - 3313 -ро мегирем: "Лоиҳаи Java аз A то Я": Илова кардани ҷадвали баҳор - 4Оянда , ба MySQL Workbench гузаред ва арзиши lastArticleId- ро ба 3313 иваз кунед. Биёед бубинем, ки чунин гурӯҳ дар базаи маълумот мавҷуд аст: "Лоиҳаи Java аз А то Я": Илова кардани ҷадвали баҳор - 5Ва барои он мо фармонро иҷро мекунем: "Лоиҳаи Java аз А то Я": Илова кардани ҷадвали баҳор - 6Ва ҳамин тавр аст, акнун шумо бояд то оғози навбатии кор интизор шавед мақолаҳои навро ҷустуҷӯ кунед. Мо интизорем, ки дар бораи мақолаи нав аз гурӯҳи лоиҳаҳои Java ду паём мегирем. Чунон ки мегуянд, натица дер наомад: "Лоиҳаи Java аз A то Я": Илова кардани ҷадвали баҳор - 7Маълум мешавад, ки бот тавре кор мекард, ки мо интизор будем.

Анҷом

Мисли ҳамеша, мо versionро дар pom.xml навсозӣ мекунем ва ба RELEASE_NOTES сабт илова мекунем, то таърихи кор захира карда шавад ва шумо ҳамеша метавонед баргардед ва фаҳмед, ки чӣ тағир ёфтааст. Аз ин рӯ, мо versionро як воҳид зиёд мекунем:
<version>0.7.0-SNAPSHOT</version>
Ва RELEASE_NOTES-ро навсозӣ кунед:
## 0.7.0-SNAPSHOT * JRTB-4: қобorяти иловагии фиристодани огоҳиномаҳо дар бораи мақолаҳои нав * JRTB-8: қобorяти илова кардани корбари телеграммаи ғайрифаъол * JRTB-9: қобorяти илова кардани корбари фаъол ва/ё оғози истифодаи он.
Акнун шумо метавонед дархости ҷалб эҷод кунед ва тағиротҳои навро бор кунед. Дар ин ҷо дархости кашидан бо тамоми тағйирот дар ду қисм аст: STEP_8 . Баъд чӣ? Чунин ба назар мерасад, ки ҳама чиз омода аст ва тавре ки мо мегӯем, он метавонад ба истеҳсолот ворид шавад, аммо ҳанӯз баъзе корҳое ҳастанд, ки ман мехоҳам иҷро кунам. Масалан, кори администраторҳоро барои бот танзим кунед, онҳоро илова кунед ва қобorяти насб кардани онҳоро илова кунед. Инчунин фикри хуб аст, ки пеш аз ба итмом расонидани codeро аз назар гузаронед ва бубинед, ки оё чизҳое ҳастанд, ки метавонанд аз нав ислоҳ шаванд. Ман аллакай метавонам десинхронизатсияро дар номи мақола/пост бубинам. Дар ниҳоят, мо он чизеро, ки ба нақша гирифта будем ва он чизе ки гирифтаем, як ретроспективӣ мекунем. Ва шумо дар оянда чӣ кор кардан мехоҳед? Ҳоло ман бо шумо як идеяи хеле хомро мубодила мекунам, ки метавонад ва равшании рӯзро бубинад: сохтани стартери пружина, ки тамоми функсияҳои кор бо боти телеграмма ва ҷустуҷӯи мақолаҳоро дошта бошад. Ин имкон медиҳад, ки равиш ягона карда шавад ва он барои ботҳои дигари телеграмма истифода шавад. Ин ин лоиҳаро барои дигарон дастрастар мекунад ва метавонад ба бештари одамон манфиат расонад. Ин яке аз ғояҳост. Идеяи дигар ин аст, ки ба рушди огоҳинома амиқтар равед. Аммо мо дар ин бора каме дертар гап мезанем. Ташаккур ба ҳама барои таваҷҷуҳ, чун маъмул: лайк - обуна - занг занед , ситораи лоиҳаи мо , шарҳ диҳед ва мақоларо баҳо диҳед! Ташаккур ба ҳама барои хондан.

Рӯйхати ҳамаи маводҳои силсила дар аввали ин мақола аст.

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION