javascript
stackexchange_通过Spring Social发推StackExchange问题
stackexchange
1.簡介
這是有關(guān)小型輔助項目的第三篇也是最后一篇文章-該機器人自動在專用帳戶上發(fā)布來自各個Q&A StackExchange網(wǎng)站上的問題的推文(文章末尾的完整列表)。
第一篇文章討論了為StackExchange REST API構(gòu)建簡單的客戶端 。 在第二篇文章中,我們使用Spring Social建立了與Twitter的交互。
本文將描述實現(xiàn)的最后一部分-負責(zé)Stackexchange客戶端與TwitterTemplate之間的交互的部分。
2. Tweet Stackexchange服務(wù)
Stackexchange客戶端(暴露原始問題)與TwitterTemplate (完全設(shè)置并可以鳴叫)之間的交互是一個非常簡單的服務(wù),即TweetStackexchangeService 。 由此發(fā)布的API是:
public void tweetTopQuestionBySite(String site, String twitterAccount){ ... } public void tweetTopQuestionBySiteAndTag(String site, String twitterAccount, String tag){ ... }功能很簡單–這些API將繼續(xù)(通過客戶端)從Stackexchange REST API中讀取“問題”,直到在該特定帳戶上發(fā)現(xiàn)之前從未發(fā)布過任何Twitter消息為止。
找到該問題后,將通過與該帳戶相對應(yīng)的TwitterTemplate在Twitter上發(fā)布該消息,并將一個非常簡單的Question實體保存在本地。 該實體僅存儲問題的ID和發(fā)過該消息的Twitter帳戶。
例如以下問題: 在@RequestParam中綁定列表 已在SpringAtSO帳戶上發(fā)布。
Question實體僅包含:
- 問題的編號 –在這種情況下為4596351
- 問題已在其上發(fā)布的Twitter帳戶 – SpringAtSO
- 問題源自的Stackexcange網(wǎng)站 – stackoverflow
我們需要跟蹤此信息,以便我們知道哪些問題已被發(fā)布,哪些問題尚未被發(fā)布。
3.調(diào)度程序
調(diào)度程序利用了Spring的調(diào)度任務(wù)功能-通過Java配置啟用了這些功能:
@Configuration @EnableScheduling public class ContextConfig {// }實際的調(diào)度程序相對簡單:
@Component @Profile(SpringProfileUtil.DEPLOYED) public class TweetStackexchangeScheduler {@Autowiredprivate TweetStackexchangeService service;// API@Scheduled(cron = "0 0 1,5 * * *")public void tweetStackExchangeTopQuestion() throws JsonProcessingException, IOException {service.tweetTopQuestionBySiteAndTag("StackOverflow", Tag.clojure.name(), "BestClojure", 1);String randomSite = StackexchangeUtil.pickOne("SuperUser", "StackOverflow");service.tweetTopQuestionBySiteAndTag(randomSite, Tag.bash.name(), "BestBash", 1);} }上面配置了兩個推文操作–來自StackOverflow問題的一個推文,在Best Of Clojure Twitter帳戶上標有“ clojure”。
其他操作將推文標記為“ bash”的問題–由于這類問題實際上出現(xiàn)在Stackexchange網(wǎng)絡(luò)上的多個站點上: StackOverflow , SuperUser和AskUbuntu ,因此首先有一個快速選擇過程來選擇這些站點之一,然后問題已發(fā)布。
最后, 計劃cron作業(yè)每天在凌晨1點和凌晨5點運行 。
4.設(shè)定
這是一個寵物項目,它以非常簡單的數(shù)據(jù)庫結(jié)構(gòu)開始 -現(xiàn)在仍然很簡單,但情況更是如此。 因此,主要目標之一是能夠輕松更改數(shù)據(jù)庫結(jié)構(gòu)-當然,有幾種用于數(shù)據(jù)庫遷移的工具 ,但是對于這樣一個簡單的項目,它們都是過大的。
因此,我決定將設(shè)置數(shù)據(jù)保留為簡單的文本格式 -將以半自動方式進行更新。
安裝程序有兩個主要步驟:
- 檢索每個Twitter帳戶上的推文問題的ID,并將其存儲在文本文件中
- 刪除數(shù)據(jù)庫架構(gòu)并重新啟動應(yīng)用程序–這將再次創(chuàng)建架構(gòu),并將所有數(shù)據(jù)從文本文件設(shè)置回新數(shù)據(jù)庫
4.1。 原始設(shè)置數(shù)據(jù)
使用JDBC檢索現(xiàn)有數(shù)據(jù)庫中的數(shù)據(jù)的過程非常簡單; 首先我們定義一個RowMapper:
class TweetRowMapper implements RowMapper<String> {private Map<String, List<Long>> accountToQuestions;public TweetRowMapper(Map<String, List<Long>> accountToQuestions) {super();this.accountToQuestions = accountToQuestions;}public String mapRow(ResultSet rs, int line) throws SQLException {String questionIdAsString = rs.getString("question_id");long questionId = Long.parseLong(questionIdAsString);String account = rs.getString("account");if (accountToQuestions.get(account) == null) {accountToQuestions.put(account, Lists.<Long> newArrayList());}accountToQuestions.get(account).add(questionId);return "";} }這將為每個Twitter帳戶建立一個問題列表。
接下來,我們將在一個簡單的測試中使用它:
@Test public void whenQuestionsAreRetrievedFromTheDB_thenNoExceptions() {Map<String, List<Long>> accountToQuestionsMap = Maps.newHashMap();jdbcTemplate.query("SELECT * FROM question_tweet;", new TweetRowMapper(accountToQuestionsMap));for (String accountName : accountToQuestionsMap.keySet()) {System.out.println(accountName + "=" + valuesAsCsv(accountToQuestionsMap.get(accountName)));} }檢索帳戶問題后,測試將簡單地列出問題; 例如:
SpringAtSO=3652090,1079114,5908466,...4.2。 恢復(fù)設(shè)置數(shù)據(jù)
上一步生成的數(shù)據(jù)行存儲在setup.properties文件中 ,該文件可用于Spring:
@Configuration @PropertySource({ "classpath:setup.properties" }) public class PersistenceJPAConfig {// }當應(yīng)用程序啟動時,將執(zhí)行設(shè)置過程。 這個簡單的過程使用Spring ApplicationListener,監(jiān)聽ContextRefreshedEvent :
@Component public class StackexchangeSetup implements ApplicationListener<ContextRefreshedEvent> {private boolean setupDone;public void onApplicationEvent(ContextRefreshedEvent event) {if (!setupDone) {recreateAllQuestionsOnAllTwitterAccounts();setupDone = true;}} }最后,從setup.properties文件中檢索問題并重新創(chuàng)建:
private void recreateAllQuestionsOnTwitterAccount(String twitterAccount) {String tweetedQuestions = env.getProperty(twitterAccount.name();String[] questionIds = tweetedQuestions.split(",");recreateQuestions(questionIds, twitterAccount); } void recreateQuestions(String[] questionIds, String twitterAccount) {List<String> stackSitesForTwitterAccount = twitterAccountToStackSites(twitterAccount);String site = stackSitesForTwitterAccount.get(0);for (String questionId : questionIds) {QuestionTweet questionTweet = new QuestionTweet(questionId, twitterAccount, site);questionTweetDao.save(questionTweet);} }這個簡單的過程可以輕松地更新數(shù)據(jù)庫結(jié)構(gòu)-由于完全擦除了數(shù)據(jù)并完全重新創(chuàng)建了數(shù)據(jù),因此無需進行任何實際的遷移 。
5.帳戶完整清單
Twitter帳戶的完整列表是:
- SpringAtSO –來自StackOverflow的Spring問題
- JavaTopSO –來自StackOverflow的Java問題
- RESTDaily –來自StackOverflow的REST問題
- BestJPA –來自StackOverflow的JPA問題
- BestMaven –來自StackOverflow的Maven問題
- BestGit –來自StackOverflow的Git問題
- AskUbuntuBest – AskUbuntu最佳總體問題(所有主題)
- ServerFaultBest – ServerFault最佳問題(所有主題)
- BestBash –來自StackOverflow,ServerFault和AskUbuntu的最佳Bash問題
- BestClojure –來自StackOverflow的Clojure問題
- BestScala –來自StackOverflow的Scala問題
- BestEclipse –來自StackOverflow的Eclipse問題
- jQueryDaily –來自StackOverflow的jQuery問題
- BestAlgorithms –來自StackOverflow的算法問題
這些帳戶中的每個帳戶每天都會創(chuàng)建2條推文,其特定主題的問題評分最高。
六,結(jié)論
第三篇文章完成了與StackOverflow和其他StackExchange站點集成以通過其REST API檢索問題,以及與Twitter和Spring Social集成以發(fā)布這些問題的系列。 可能值得探索的潛在方向與Google Plus相同(可能使用Pages,而不是帳戶)。
14這個項目的結(jié)果是Twitter帳戶已經(jīng)建立并開始運行-專注于各種主題,并產(chǎn)生少量且希望高質(zhì)量的內(nèi)容(在評論中歡迎其他標記自己Twitter帳戶的標記的想法)。
參考:在baeldung博客上,我們的JCG合作伙伴 Eugen Paraschiv 與Spring Social一起發(fā)布了StackExchange Questions 。翻譯自: https://www.javacodegeeks.com/2013/05/tweeting-stackexchange-questions-with-spring-social.html
stackexchange
總結(jié)
以上是生活随笔為你收集整理的stackexchange_通过Spring Social发推StackExchange问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hp惠普笔记本电脑如何系统还原hp电脑如
- 下一篇: jsr250-api_JSON处理的Ja