javascript
通过Spring Social发推StackExchange问题
1.簡介
這是有關小型附屬項目的第三篇也是最后一篇文章-該機器人自動在專用帳戶上鳴叫來自各個Q&A StackExchange網站上的問題(文章末尾的完整列表)。
第一篇文章討論了為StackExchange REST API構建一個簡單的客戶端 。 在第二篇文章中,我們使用Spring Social建立了與Twitter的交互。
本文將描述實現的最后一部分-負責Stackexchange客戶端與TwitterTemplate之間的交互的部分。
2. Tweet Stackexchange服務
Stackexchange Client(公開原始問題)與TwitterTemplate (完全設置并可以鳴叫)之間的交互是一個非常簡單的服務TweetStackexchangeService 。 由此發布的API是:
public void tweetTopQuestionBySite(String site, String twitterAccount){ ... } public void tweetTopQuestionBySiteAndTag(String site, String twitterAccount, String tag){ ... }功能很簡單–這些API將繼續(通過客戶端)從Stackexchange REST API中讀取“問題”,直到在該特定帳戶上找到之前從未發過任何推文的為止。
找到該問題后,將通過與該帳戶相對應的TwitterTemplate在Twitter上發布該消息,并將一個非常簡單的Question實體保存在本地。 該實體僅存儲問題的ID和已在其上發布的Twitter帳戶。
例如以下問題: 在@RequestParam中綁定列表 已在SpringAtSO帳戶上發布。
Question實體僅包含:
- 問題的編號 –在這種情況下為4596351
- 問題已在其上發布的Twitter帳戶 – SpringAtSO
- 問題源自的Stackexcange網站 – stackoverflow
我們需要跟蹤此信息,以便我們知道哪些問題已被發布,哪些問題尚未被發布。
3.調度程序
調度程序利用了Spring的調度任務功能-通過Java配置啟用了這些功能:
@Configuration @EnableScheduling public class ContextConfig {// }實際的調度程序相對簡單:
@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”的問題–由于這類問題實際上出現在Stackexchange網絡上的多個站點上: StackOverflow , SuperUser和AskUbuntu ,因此首先有一個快速選擇過程來選擇這些站點之一,然后問題已發布。
最后, 計劃cron作業每天在凌晨1點和凌晨5點運行 。
4.設定
這是一個寵物項目,它以一個非常簡單的數據庫結構開始 -現在仍然很簡單,但情況更是如此。 因此,主要目標之一是能夠輕松地更改數據庫結構-當然,有幾種用于數據庫遷移的工具 ,但是對于這樣一個簡單的項目,它們全都過時了。
因此,我決定將設置數據保留為簡單的文本格式 -將自動進行半自動更新。
安裝程序有兩個主要步驟:
- 檢索每個Twitter帳戶上的推文問題的ID,并將其存儲在文本文件中
- 刪除數據庫架構并重新啟動應用程序–這將再次創建架構,并將所有數據從文本文件設置回新數據庫
4.1。 原始設置數據
使用JDBC檢索現有數據庫中數據的過程非常簡單; 首先我們定義一個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。 恢復設置數據
上一步生成的數據行存儲在setup.properties文件中 ,該文件可用于Spring:
@Configuration @PropertySource({ "classpath:setup.properties" }) public class PersistenceJPAConfig {// }當應用程序啟動時,將執行設置過程。 這個簡單的過程使用Spring ApplicationListener,監聽ContextRefreshedEvent :
@Component public class StackexchangeSetup implements ApplicationListener<ContextRefreshedEvent> {private boolean setupDone;public void onApplicationEvent(ContextRefreshedEvent event) {if (!setupDone) {recreateAllQuestionsOnAllTwitterAccounts();setupDone = true;}} }最后,從setup.properties文件中檢索問題并重新創建:
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);} }這個簡單的過程可以輕松地更新數據庫結構-由于已完全擦除數據并完全重新創建了數據,因此無需進行任何實際的遷移 。
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的算法問題
這些帳戶中的每個帳戶每天都會創建2條推文,其特定主題的問題評分最高。
六,結論
第三篇文章完成了有關與StackOverflow和其他StackExchange網站集成以通過其REST API檢索問題,以及與Twitter和Spring Social集成以發布這些問題的系列文章。 可能值得探索的潛在方向與Google Plus相同(可能使用Pages,而不是帳戶)。
14這個項目的結果是Twitter帳戶已啟動并正在運行-專注于各種主題,并產生少量且希望高質量的內容(在評論中歡迎其他標記自己Twitter帳戶的標記的想法)。
參考:在baeldung博客上,我們的JCG合作伙伴 Eugen Paraschiv 與Spring Social一起發布了StackExchange Questions 。翻譯自: https://www.javacodegeeks.com/2013/05/tweeting-stackexchange-questions-with-spring-social.html
總結
以上是生活随笔為你收集整理的通过Spring Social发推StackExchange问题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Spring MVC:表单处理卷。 2
- 下一篇: 电脑如何进行长截屏(电脑如何长截屏快捷键
