כיצד ניתן להפעיל ג'וב עם פרמטרים?

28/08/2013

תגובה אחת

לא ניתן!
(יכולתי לסיים כאן ולזכות בתואר הפוסט הכי קצר באתר, או הפוסט היחיד שהכותרת שלו ארוכה מהתוכן וכו')

לא סתם אי אפשר, אלא אין בזה הגיון: ג'וב מפעילים באופן עקיף בעזרת ה-Scheduler שקובע מתי הוא ירוץ, או באופן ישיר בעזרת פרוצדורת המערכת SP_Start_Job.
במקרה הראשון (הפעלה מתוזמנת), מה בדיוק ההגיון בשימוש בפרמטרים? אם הוא יתוזמן ויופעל פעם אחת– הפרמטרים יכולים להיות חלק ממנו, ואם הוא יתוזמן ויופעל דרך קבע – מה בדיוק הרעיון ומהיכן הצורך בפרמטרים?
במקרה השני (הפעלה יזומה)– יש לשאול קודם כל למה ג'וב ולא פרוצדורה, הרי רוצים שהוא יתחיל לרוץ עכשיו. אם התשובה המנומקת היא שרוצים שהקוד ירוץ באופן אסינכרוני ומנותק מהעמדה שלנו – הכלי הנכון לעשות זאת הוא Service Broker ולו מפני שהוא גם פותר את בעיית הפרמטרים וגם ניתן להפעיל אותו במקביל מספר פעמים (בניגוד לג'וב!). יחד עם זאת- אם מישהו עובד עם גרסה קודמת ל-2005 או מסיבות אלו ואחרות אין זמן וחשק ללמוד לעשות זאת עם Service Broker, ובנוסף לכל – הוא צריך משהו גנרי שניתן יהיה להריץ אותו בעוד מקרים (ולכן לא ניתן לשים את הפרמטרים בתוך הג'וב) – אזי ניתן להיעזר בטבלה יעודית שבה יהיו הפרמטרים ושהג'וב יפנה אליה.
כלומר- באותו מקרה קצה שמכוונים לנו אקדח לרקה ומתעקשים שנריץ ג'וב עם פרמטרים מבחוץ, נוכל להעביר אותם אליו באמצעות טבלה. זו התשובה הישירה לשאלה שבכותרת, אבל חוץ מזה – זה מיותר לחלוטין.

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

2. יש לי ג'וב שמשתמשים שונים רוצים להפעיל אותו, כל אחד עם פרמטר אחר.
תשובה- בשביל זה יש Service Broker, ודרכו ניתן להפעיל פרוצדורה באופן אסינכרוני (או להיעזר בטבלת פרמטרים למרות שזה פתרון עקום).

3. יש לי פרוצדורה שאני רוצה שתרוץ מחר לפנות בוקר כשאין עומס על השרת כמו עכשיו, ויש להפעיל אותה עם מספר פרמטרים.
תשובה- בג'וב כתוב פקודת Execute לפרוצדורה עם כל הפרמטרים Hard coded. למה להעביר אותם לג'וב? שיהיו בפנים!

4. אני רוצה שהפרוצדורה מסעיף 3 תרוץ כל יום ולא רק מחר, בכל פעם עם פרמטרים אחרים. מה אז?
תשובה- זה בדיוק כמו בסעיף 1: אם הפרמטר קשור ליום או לחודש או לשעה בהם הג'וב רץ – הלוגיקה צריכה להיות בתוכו, ובהתאם ליום/חודש/שעה הג'וב "יחליט" איך להריץ. מנגד, אם הכוונה שהיום הג'וב ירוץ עם הפרמטר X ומחר עם Y וכך הלאה – אזי הפירוט הזה חייב להיות כתוב באיזה מקום: או בטבלה ממנה יהיה ניתן לקרוא מה הפרמטר בכל פעם, או שיהיה כתוב בתוך הג'וב; ובכל מקרה אי אפשר "להגיד" ל-scheduler אם איזה פרמטר להריץ בכל פעם (וגם אם היתה אופציה כזו – מה ההבדל בין לפרט אותה ב-scheduler או בג'וב או בטבלה?).

לסיכום: אם מישהו בא ושואל איך להפעיל ג'וב עם פרמטרים, צריך לברר למה ומה בדיוק הוא צריך, ולהראות לו איך ניתן לעשות את זה ללא פרמטרים; לא במובן של "בוא נאלתר משהו במקום" אלא כי הרעיון של העברת הפרמטרים לג'וב הוא עצמו אילתור ושימוש לא נכון בג'וב.
כנראה שמי ששואל את זה מעוניין ליזום הפעלה אסינכרונית באופן מזדמן (ולא קבוע שניתן לתזמן מראש), ובמקרה זה הפתרון כאמור הוא Servicr Broker.

(לא הפוסט הכי קצר אבל לפחות אין בו קודים הפעם..)

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

תגובה אחת

  1. פלג01/09/2013 ב 02:05

    אתה מדבר לוגיקה ומערבב עם פרמטרים.

    בשביל פרמטרים יצרו את ה "set values", שגם נכון וצריך להשתמש בהם.

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

    הגב