כיצד ליצור תוסף רפוי בג'אווה

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. הקדמה

Slack היא מערכת צ'אט פופולרית המשמשת אנשים וחברות ברחבי העולם. אחד הדברים שהופכים אותו לפופולרי כל כך הוא היכולת לכתוב תוספים מותאמים אישית משלנו שיכולים לתקשר עם אנשים וערוצים בתוך רפיון אחד. זה משתמש ב- HTTP API שלהם.

Slack אינו מציע SDK רשמי לכתיבת תוספים עם Java. עם זאת, יש SDK קהילתי שאושר באופן רשמי, ואנחנו הולכים להשתמש בו. זה נותן לנו גישה כמעט לכל ה- API של Slack מבסיס קוד של Java מבלי שנצטרך לדאוג לפרטים המדויקים של ה- API.

נשתמש בזה לבניית בוט לניטור מערכות קטן. זה יאחזר מעת לעת את שטח הדיסק עבור המחשב המקומי ויתריע בפני אנשים אם כוננים מתמלאים מדי.

2. קבלת אישורי API

לפני שנוכל לעשות משהו עם Slack, אנחנו צריכים צור אפליקציה חדשה ובוט וחבר אותה לערוצים שלנו.

ראשית, בואו בקר בכתובת //api.slack.com/apps. זהו הבסיס שממנו אנו מנהלים את אפליקציות ה- Slack שלנו. מכאן נוכל ליצור אפליקציה חדשה.

כאשר אנו עושים זאת, עלינו להזין שם לאפליקציה וסביבת עבודה רפויה כדי ליצור אותה.

לאחר שעשינו זאת, האפליקציה נוצרה ומוכנה לעבודה. המסך הבא מאפשר לנו ליצור Bot. זהו משתמש מזויף שהתוסף יפעל.

כמו כל משתמש רגיל, עלינו לתת לזה שם תצוגה ושם משתמש. אלה ההגדרות שמשתמשים אחרים בסביבת העבודה Slack יראו עבור משתמש הבוט הזה אם אי פעם יתקשרו איתו.

כעת לאחר שעשינו זאת, נוכל לבחור באפשרות "התקן אפליקציה" מהתפריט הצדדי הוסף את האפליקציה לסביבת העבודה Slack שלנו. לאחר שעשינו זאת, האפליקציה יכולה לתקשר עם סביבת העבודה שלנו.

זה ייתן לנו את האסימונים הדרושים לנו כדי שהתוסף שלנו יתקשר עם Slack.

לכל בוט האינטראקציה עם סביבת עבודה אחרת של Slack יהיה סט שונה של אסימונים. היישום שלנו זקוק לערך "אסימון גישה OAuth למשתמש של Bot" כאשר אנו מריצים אותו.

לבסוף, אנחנו צריכים הזמן את הבוט לכל הערוצים שהוא צריך להיות מעורב בהם. זה עובד פשוט על ידי שליחת הודעות מהערוץ - @system_monitoring במקרה הזה.

3. הוספת רפיון לפרויקט שלנו

לפני שנוכל להשתמש בו, ראשית עלינו להוסיף את התלות של SDK Slack pom.xml קוֹבֶץ:

 com.hubspot.slack slack-base $ {slack.version} com.hubspot.slack slack-java-client $ {slack.version} 

3. מבנה היישום

ליבת היישום שלנו היא היכולת לבדוק אם קיימות שגיאות במערכת. נציג זאת באמצעות הרעיון של בודק שגיאות. זהו ממשק פשוט עם שיטה אחת, המופעל כדי לבדוק שגיאות ולדווח עליהם:

ממשק ציבורי ErrorChecker {void check (); }

אנו רוצים גם להיות באמצעים לדווח על כל שגיאה שנמצאו. זהו ממשק פשוט נוסף שייקח הצהרת בעיה וידווח עליה כראוי:

ממשק ציבורי ErrorReporter {void reportProblem (בעיית מחרוזת); }

השימוש בממשק כאן מאפשר לנו לקבל דרכים שונות לדיווח על בעיות. לדוגמא, ייתכן שיש לנו הודעה ששולחת דוא"ל, יוצרת קשר עם מערכת דיווח על שגיאות או שולחת הודעות למערכת Slack שלנו כדי שאנשים יקבלו התראה מיידית.

העיצוב מאחורי זה הוא שכל אחד מהם בודק שגיאות מופע ניתן משלו כתב שגיאה להשתמש. זה נותן לנו את הגמישות לקיים כתבי שגיאות שונים לשימושם של בודקים שונים מכיוון ששגיאות מסוימות עשויות להיות חשובות יותר מאחרות. לדוגמא, אם הדיסקים מלאים ביותר מ -90% יתכן ודורשים הודעה לערוץ Slack, אך אם הם מלאים מעל 98% אז אולי נרצה לשלוח הודעות פרטיות לאנשים מסוימים במקום.

4. בדיקת שטח הדיסק

בודק השגיאות שלנו יבדוק את כמות שטח הדיסק במערכת המקומית. כל מערכת קבצים שיש בה פחות מאחוז מסוים נחשב כטעות ותדווח ככזו.

נשתמש ב- NIO2 FileStore API שהוצג ב- Java 7 כדי להשיג מידע זה באופן חוצה פלטפורמות.

עכשיו, בואו נסתכל על בודק השגיאות שלנו:

מחלקה ציבורית DiskSpaceErrorChecker מיישמת ErrorChecker {לוגרית סופית סטטית פרטית LOG = LoggerFactory.getLogger (DiskSpaceErrorChecker.class); פרטי ErrorReporter errorReporter; מגבלה כפולה פרטית; DiskSpaceErrorChecker ציבורי (ErrorReporter errorReporter, מגבלה כפולה) {this.errorReporter = errorReporter; this.limit = מגבלה; } @ בדיקת חלל ציבורית ציבורית () {FileSystems.getDefault (). GetFileStores (). ForEach (fileStore -> {נסה {long totalSpace = fileStore.getTotalSpace (); long usableSpace = fileStore.getUsableSpace (); כפול usablePercentage = ((( double) usableSpace) / totalSpace; if (totalSpace> 0 && usablePercentage <limit) {String error = String.format ("לאחסון הקבצים% s יש רק% d %% שטח דיסק שמיש", fileStore.name (), (int) (usablePercentage * 100)); errorReporter.reportProblem (error);}} לתפוס (IOException e) {LOG.error ("שגיאה בקבלת שטח דיסק לאחסון קבצים {}", fileStore, e);}}); }}

כאן אנו מקבלים את רשימת כל חנויות הקבצים במערכת המקומית ואז בודקים כל אחד בנפרד. כל מי שיש לו פחות מהמגבלה המוגדרת כשטח שמיש, ייצור שגיאה באמצעות כתב השגיאות שלנו.

5. שליחת שגיאות לערוצים רפויים

כעת עלינו להיות מסוגלים לדווח על שגיאותינו. הכתב הראשון שלנו יהיה אחד שישלח הודעות לערוץ Slack. זה מאפשר לכל אחד בערוץ לראות את המסר, בתקווה שמישהו יגיב אליו.

זה משתמש ב- SlackClient, מ- SDK Slack, ושם הערוץ שאליו ישלח את ההודעות. זה גם מיישם את שלנו כתב שגיאה ממשק כדי שנוכל לחבר אותו בקלות לכל בודק שגיאות שרוצה להשתמש בו:

מחלקה ציבורית SlackChannelErrorReporter מיישם ErrorReporter {פרטי SlackClient slackClient; ערוץ מחרוזת פרטי; ציבורי SlackChannelErrorReporter (SlackClient slackClient, ערוץ מחרוזת) {this.slackClient = slackClient; this.channel = ערוץ; } @Override public void reportProblem (Problem String) {slackClient.postMessage (ChatPostMessageParams.builder () .setText (problem) .setChannelId (channel) .build ()) .join (). UnwrapOrElseThrow (); }}

6. חיווט יישומים

כעת אנו יכולים לחבר את היישום ולפקח עליו על המערכת שלנו. לצורך הדרכה זו, אנו נשתמש בג'אווה שָׁעוֹן עֶצֶר ו TimerTask שהם חלק מ- JVM הליבה, אבל אנחנו יכולים באותה קלות להשתמש באביב או בכל מסגרת אחרת כדי לבנות זאת.

לעת עתה, זה יהיה אחד DiskSpaceErrorChecker המדווח על כל דיסקים ששימושם מתחת ל -10% לערוץ "הכללי" שלנו, ואשר פועל כל חמש דקות:

מעמד ציבורי MainClass {גמר סטטי ציבורי ארוך דקות MINUTES = 1000 * 60; main static public ריק (String [] args) זורק IOException {SlackClientRuntimeConfig runtimeConfig = SlackClientRuntimeConfig.builder () .setTokenSupplier (() -> "") .build (); SlackClient slackClient = SlackClientFactory.defaultFactory (). Build (runtimeConfig); ErrorReporter slackChannelErrorReporter = SlackChannelErrorReporter חדש (slackClient, "כללי"); ErrorChecker diskSpaceErrorChecker10pct = חדש DiskSpaceErrorChecker (slackChannelErrorReporter, 0.1); טיימר טיימר = טיימר חדש (); timer.scheduleAtFixedRate (TimerTask חדש () {@Override public void run () {diskSpaceErrorChecker10pct.check ();}}, 0, 5 * MINUTES); }}

עלינו להחליף את "" באסימון שהושג קודם לכן ואז אנו מוכנים לפעול. ברגע שאנחנו עושים זאת, אם הכל תקין, התוסף שלנו יבדוק את הכוננים המקומיים ויעביר הודעה ל- Slack אם יש שגיאות.

7. שליחת שגיאות כהודעות פרטיות

לאחר מכן, אנו מוסיפים כתב שגיאות ששולח במקום זאת הודעות פרטיות. זה יכול להיות שימושי לשגיאות דחופות יותר מכיוון שזה יהיה מייד פינג למשתמש ספציפי במקום לסמוך על מישהו בערוץ שיגיב.

כתב השגיאות שלנו כאן מסובך יותר מכיוון שהוא צריך לתקשר עם משתמש ממוקד יחיד:

מחלקה ציבורית SlackUserErrorReporter מיישם ErrorReporter {פרטי SlackClient slackClient; משתמש מחרוזת פרטי; ציבורי SlackUserErrorReporter (SlackClient slackClient, מחרוזת משתמש) {this.slackClient = slackClient; this.user = משתמש; } @ דווח על ביטול חלל ציבורי @ בעיה (מחרוזת) {UsersInfoResponse usersInfoResponse = slackClient .lookupUserByEmail (UserEmailParams.builder () .setEmail (user) .build ()) .join (). UnwrapOrElseThrow (); ImOpenResponse imOpenResponse = slackClient.openIm (ImOpenParams.builder () .setUserId (usersInfoResponse.getUser (). GetId ()) .build ()) .join (). UnwrapOrElseThrow (); imOpenResponse.getChannel (). ifPresent (ערוץ -> {slackClient.postMessage (ChatPostMessageParams.builder (). setText (בעיה). setChannelId (channel.getId ()). בניין ()). להצטרף (). unwrapOrElseThrow ();} ); }}

מה שעלינו לעשות כאן הוא למצוא את המשתמש שאנו מעבירים לו הודעות - נבדק על ידי כתובת דוא"ל, מכיוון שזה הדבר היחיד שאי אפשר לשנות. הַבָּא, אנו פותחים ערוץ צ'אט למשתמש ואז אנו מפרסמים את הודעת השגיאה שלנו לערוץ זה.

לאחר מכן ניתן לחבר את זה ב רָאשִׁי שיטה, ואנחנו נתריע ישירות על משתמש יחיד:

ErrorReporter slackUserErrorReporter = SlackUserErrorReporter חדש (slackClient, "[דוא"ל מוגן]"); ErrorChecker diskSpaceErrorChecker2pct = חדש DiskSpaceErrorChecker (slackUserErrorReporter, 0.02); timer.scheduleAtFixedRate (TimerTask חדש () {@Override public void run () {diskSpaceErrorChecker2pct.check ();}}, 0, 5 * MINUTES);

לאחר שתסיים, נוכל להריץ זאת ולקבל גם הודעות פרטיות על טעויות.

8. מסקנה

ראינו כאן כיצד נוכל לשלב את Slack בכלים שלנו כך שנוכל לשלוח משוב לכל הצוות או לחברים בודדים. יש הרבה יותר שאנחנו יכולים לעשות עם ה- API של Slack, אז למה לא לראות מה עוד נוכל לשלב.

כרגיל, ניתן למצוא את קוד המקור של מאמר זה ב- GitHub.

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

$config[zx-auto] not found$config[zx-overlay] not found