JavaRush /Java Blog /Random-TK /Bahar meýilnamasyny goşmak - "Java taslamasy A-dan Z-a"

Bahar meýilnamasyny goşmak - "Java taslamasy A-dan Z-a"

Toparda çap edildi
Hemmelere salam, eziz dostlarym. Öňki makalada makalalar üçin JavaRush API bilen işlemek üçin bir müşderi taýýarladyk. Indi her 15 minutdan ýerine ýetiriljek işimiz üçin logika ýazyp bileris. Bu diagrammada görkezilişi ýaly: “Java-dan A-dan Z” taslamasy: Bahar meýilnamasyny goşmak - 1Esasy programmanyň fonunda ýerine ýetirilýän we aşakdakylary ýerine ýetirýän her 15 minutdan bir iş başlar (biziň pikirimizçe, diňe belli bir synpda bir usul).
  1. Maglumatlar bazamyzdaky ähli toparlarda, öňki ýerine ýetirilenden soň çap edilen täze makalalary tapýar.

    Bu shema has az toparlary kesgitleýär - diňe işjeň ulanyjylary bar. Şol döwürde bu meniň üçin mantykly ýalydy, ýöne indi belli bir topara abuna ýazylan işjeň ulanyjylaryň bardygyna ýa-da ýokdugyna garamazdan, botyň iň soňky işlän iň soňky makalasyny saklamalydygyna düşündim. Täze ulanyjy bu toparyň ýapylmagyndan bäri çap edilen makalalaryň sanyny derrew alanda ýagdaý ýüze çykyp biler. Bu garaşylýan özüni alyp barşyna garaşylmaýar we munuň öňüni almak üçin häzirki wagtda işjeň ulanyjylary ýok häzirki zaman maglumatlar bazasyndan saklamaly.
  2. Täze makalalar bar bolsa, bu topara işjeň ýazylan ähli ulanyjylar üçin habar dörediň. Täze makalalar ýok bolsa, işi tamamlaýarys.

Theeri gelende aýtsak, TG kanalymda botyň eýýäm işleýändigini we abuna ýazylmak esasynda täze makalalary iberýändigini aýdypdym. FindNewArtcileService ýazmaga başlalyň . Gözleg we habar ibermek boýunça ähli işler şol ýerde amala aşyrylar we iş diňe şu hyzmat usulyny başlar:

FindNewAr ArticleService:

package com.github.javarushcommunity.jrtb.service;

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

   /**
    * Find new articles and notify subscribers about it.
    */
   void findNewArticles();
}
Örän ýönekeý, şeýlemi? Munuň düýp manysy we durmuşa geçirmekde ähli kynçylyklar bolar:
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);
   }
}
Bu ýerde hemme zady tertipli çözeris:
  1. GroupService ulanyp, maglumatlar bazasyndaky ähli toparlary tapýarys.

  2. Soňra ähli toparlara dargaýarys we her biri üçin soňky makalada döredilen müşderi - javaRushPostClient.findNewPosts diýýäris .

  3. Ondan soň, setNewAr ArticleId usulyny ulanyp , iň täze makalamyzyň makala ID-sini täzeleýäris, maglumatlar bazamyz eýýäm täzelerini gaýtadan işledigimizi biler.

  4. “GroupSub” -yň ulanyjylaryň ýygyndysynyň bardygyny ulanyp, işjeňlerden geçýäris we täze makalalar barada habarnamalary iberýäris.

Habaryň nämedigini ara alyp maslahatlaşmarys, bu biziň üçin gaty möhüm däl. Esasy zat, usulyň işlemegi. Täze makalalary gözlemek we habarnamalary ibermegiň logikasy taýýar, şonuň üçin iş tapmaga geçip bilersiňiz.

FindNewAr ArticleJob dörediň

“SpringScheduler” -iň nämedigi hakda öňem gürleşipdik, ýöne çalt gaýtalalyň: “Bahar” çarçuwasyndaky kesgitli bir wagtda işleýän fon prosesini döretmek üçin mehanizm. Munuň üçin size näme gerek? Birinji ädim, bahar giriş synpymyza @EnableScheduling düşündirişini goşmak:
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);
   }

}
Ikinji ädim, synp döretmek, ony “ApplicationContext” -e goşmak we wagtal-wagtal işlejek usul döretmekdir. Ammar, hyzmat we ş.m. bilen deň derejede iş bukjasyny döredýäris we şol ýerde FindNewAr ArticleJob synpyny döredýäris :
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));
   }
}
Programmanyň mazmunyna bu synpy goşmak üçin @Komponent düşündirişini ulandym . Synpyň içindäki usulyň wagtal-wagtal işlemelidigini bilmek üçin men bu usula düşündiriş goşdum: @Scheduled (fixedRateString = "$ {bot.recountNewAr ArticleFixedRate}") . Emma ony application.properties faýlynda goýduk:
bot.recountNewArticleFixedRate = 900000
Bu ýerde bahasy millisekuntda. 15 minut bolar. Bu usulda hemme zat ýönekeý: Täze makalalaryň gözlegini hasaplamak üçin, iň bolmanda onuň nähili çalt işleýändigine takmynan düşünmek üçin surnallara özüm üçin gaty ýönekeý bir ölçeg goşdum.

Täze işlemegi barlamak

Indi synag botumyzda synag ederis. Emma nähili? Her gezek habarnamalaryň gelendigini görkezmek üçin makalalary pozup bilmerinmi? Elbetde ýok. Maglumatlar bazasyndaky maglumatlary redaktirläris we programmany işe girizeris. Synag serwerimde synap görerin. Munuň üçin käbir topara ýazylyň. Abuna ýazylsa, topara soňky makalanyň häzirki şahsyýetnamasy berler. Maglumatlar bazasyna geçeliň we iki makalanyň bahasyny yzyna üýtgedeliň. Netijede, soňkyAr ArticleId- i öň bellänimiz ýaly köp makala bolar diýip garaşýarys . "Java taslamasy A-dan Z": Bahar meýilnamasyny goşmak - 2Ondan soň, sahypa girýäris, Java taslamalar toparyndaky makalalary tertipleşdirýäris - täzeleri - we sanawdan üçünji makala geçeliň: "Java-проект от А до Я": Добавляем Spring Scheduler - 3Geliň aşaky makala we adres setirinden Id - 3313: "Java-проект от А до Я": Добавляем Spring Scheduler - 4Indiki makalany alarys. , MySQL Workbench-e giriň we iň soňky ArticleId bahasyny 3313-e üýtgediň. Geliň, şeýle toparyň maglumatlar bazasynda bardygyny göreliň: "Java-проект от А до Я": Добавляем Spring Scheduler - 5Munuň üçin buýrugy ýerine ýetireris: "Java-проект от А до Я": Добавляем Spring Scheduler - 6Ine, ine, indi işiň indiki başlamagyna garaşmaly bolarsyňyz täze makalalary gözläň. Java taslamalar toparyndan täze makala hakda iki habar alarys diýip garaşýarys. Aýdyşlary ýaly, netije uzak bolmady: "Java-проект от А до Я": Добавляем Spring Scheduler - 7Botyň garaşyşymyz ýaly işledi.

Soňy

Hemişe bolşy ýaly, pom.xml wersiýasyny täzeleýäris we iş taryhy ýatda saklanar ýaly RELEASE_NOTES-e ýazgy goşýarys we hemişe yza gaýdyp, üýtgän zatlara düşünip bilersiňiz. Şonuň üçin wersiýany bir birlik bilen köpeldýäris:
<version>0.7.0-SNAPSHOT</version>
RELEASE_NOTES-i täzeläň:
## 0.7.0-SNAPSHOT * JRTB-4: täze makalalar barada habarnamalary ibermek ukyby goşuldy * JRTB-8: hereketsiz telegramma ulanyjysyny düzmek ukyby goşuldy * JRTB-9: işjeň ulanyjy bellemek we / ýa-da ulanyp başlamak ukyby goşuldy.
Indi çekmek haýyşyny döredip we täze üýtgeşmeler ýükläp bilersiňiz. Ine, iki bölekdäki ähli üýtgeşmeler bilen çekmek haýyşy: STEP_8 . Indiki näme? Hemme zat taýyn ýaly, aýdyşymyz ýaly önümçilige çykyp biler ýaly, ýöne henizem etjek bolýan zatlarym bar. Mysal üçin, bot üçin adminleriň işini düzüň, goşuň we düzmek ukybyny goşuň. Şeýle hem, gutarmazdan ozal koddan geçip, gaýtadan dikeldip boljak zatlaryň bardygyny ýa-da ýokdugyny görmek gowy pikir. Makalanyň / ýazgynyň adynda desynhronizasiýany görüp bilýärin. Iň soňunda meýilleşdiren zatlarymyza we alan zatlarymyza göz aýlarys. Geljekde näme etmek isleýärsiňiz? Indi siziň bilen günüň ýagtylygyny görüp bilýän we görjek gaty gödek bir pikir bilen paýlaşaryn: telegramma boty bilen işlemek we makala gözlemek üçin ähli funksiýalara eýe bolan bahar paslyny başlamak. Bu çemeleşmäni birleşdirmäge we beýleki telegram botlary üçin ulanmaga mümkinçilik berer. Bu, bu taslamany beýlekiler üçin has elýeterli eder we has köp adama peýdaly bolar. Bu pikirleriň biridir. Başga bir pikir, habarnamanyň ösüşine has çuňňur girmekdir. Emma bu barada biraz soňrak gürleşeris. Hemişe bolşy ýaly üns bereniňiz üçin hemmäňize sag bolsun aýdýaryn: halanmak - ýazylmak - jaň , taslamamyz üçin ýyldyz , makalany teswirläň we baha beriň! Hemmäňize okanyňyz üçin sag boluň.

Tapgyryň ähli materiallarynyň sanawy bu makalanyň başynda.

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION