-
Дар ҳама гурӯҳҳое, ки дар базаи мо ҳастанд, мақолаҳои наверо, ки пас аз иҷрои қаблӣ нашр шудаанд, пайдо мекунад.
Ин схема шумораи камтари гурӯҳҳоро муайян мекунад - танҳо онҳое, ки корбарони фаъол доранд. Он вақт ба назари ман мантиқӣ менамуд, аммо ҳоло ман мефаҳмам, ки новобаста аз он ки корбарони фаъол ба гурӯҳи мушаххас обуна шудаанд ё не, шумо ба ҳар ҳол бояд мақолаи охиринеро, ки бот коркард кардааст, нигоҳ доред. Вазъияте метавонад ба миён ояд, ки корбари нав дарҳол тамоми мақолаҳоеро, ки пас аз қатъ шудани ин гурӯҳ нашр шудаанд, мегирад. Ин рафтори интизорӣ нест ва барои пешгирӣ кардани он, мо бояд он гурӯҳҳоро аз пойгоҳи додаамон нигоҳ дорем, ки дар айни замон корбарони фаъоли нав надоранд. -
Агар мақолаҳои нав вуҷуд дошта бошанд, барои ҳамаи корбароне, ки ба ин гурӯҳ фаъолона обуна шудаанд, паёмҳо эҷод кунед. Агар мақолаҳои нав набошанд, мо танҳо корро анҷом медиҳем.
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);
}
}
Дар ин ҷо мо ҳама чизро бо тартиб ҳал хоҳем кард:
-
Бо истифода аз groupService мо ҳамаи гурӯҳҳоеро, ки дар пойгоҳи додаҳо мавҷуданд, пайдо мекунем.
-
Сипас, мо ба ҳама гурӯҳҳо пароканда мешавем ва барои ҳар як мо муштариро меномем, ки дар мақолаи охирин сохта шудааст - javaRushPostClient.findNewPosts .
-
Баъдан, бо истифода аз усули setNewArticleId , мо ID мақолаи мақолаи охирини худро навсозӣ мекунем, то базаи мо донад, ки мо аллакай мақолаҳои навро коркард кардаем.
-
Ва бо истифода аз он, ки 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 ҷудо мекунем - аввал мақолаҳои нав - ва ба мақолаи сеюм аз рӯйхат меравем: Биёед ба мақолаи поён равем ва аз сатри суроғаҳо мо мақолаи Id - 3313 -ро мегирем: Оянда , ба MySQL Workbench гузаред ва арзиши lastArticleId- ро ба 3313 иваз кунед. Биёед бубинем, ки чунин гурӯҳ дар базаи маълумот мавҷуд аст: Ва барои он мо фармонро иҷро мекунем: Ва ҳамин тавр аст, акнун шумо бояд то оғози навбатии кор интизор шавед мақолаҳои навро ҷустуҷӯ кунед. Мо интизорем, ки дар бораи мақолаи нав аз гурӯҳи лоиҳаҳои Java ду паём мегирем. Чунон ки мегуянд, натица дер наомад: Маълум мешавад, ки бот тавре кор мекард, ки мо интизор будем.Анҷом
Мисли ҳамеша, мо versionро дар pom.xml навсозӣ мекунем ва ба RELEASE_NOTES сабт илова мекунем, то таърихи кор захира карда шавад ва шумо ҳамеша метавонед баргардед ва фаҳмед, ки чӣ тағир ёфтааст. Аз ин рӯ, мо versionро як воҳид зиёд мекунем:<version>0.7.0-SNAPSHOT</version>
Ва RELEASE_NOTES-ро навсозӣ кунед:
GO TO FULL VERSION