Spring Dynamic Module (springDM)

Download Report

Transcript Spring Dynamic Module (springDM)

‫‪OSGi‬‬
‫‪and‬‬
‫‪Spring Dynamic Module‬‬
‫وحید شیخعلی زاده‬
‫فرشاد زینالی‬
‫استاد راهنما‪:‬مهندس امیرسام بهادر‬
‫بهار‪۹۲‬‬
‫‪SpringDm‬‬
‫‪‬‬
‫‪ SpringDm‬یک فریم ورک جدید است که در واقع استفاده از مدل برنامه نویسی قدرتمن ِد‬
‫‪Spring‬در بستر فریم ورک ‪ OSGi‬میباشد‪.‬‬
‫‪‬‬
‫همانطور که از تعریف هم بر میاید برای شناخت هرچه بهتره این فریم ورک ابتدا نیاز است بدانیم‬
‫‪OSGi‬چیست‪.‬‬
‫‪‬‬
‫به همین منظور در ادامه با فریم ورک ‪OSGi‬آشنا میشویم و علل ظهور این فریم ورک را برسی‬
‫میکنیم‪.‬‬
‫‪OSGi‬‬
‫‪‬‬
‫فریم ورک ‪ OSGi‬توسط شرکت ‪ OSGi Alliance‬پایه گذاری شد تا بتواند عالوه بر پشتیبانی از‬
‫مدل برنامه نویسی سرویس گرا (‪، )SOP‬قابلیت برنامه نویسی ماژوله را به زبان جاوا اضافه کند‪.‬‬
‫‪‬‬
‫علی رغم موفقیت چشم گی ِر زبان برنامه نویسی جاوا ‪،‬از برنامه برای تلفنهای همراه گرفته تا‬
‫سازمانهای بسیار بزرگ‪،‬این زبان به صورت خاص از مدل برنامه نویسی ماژوله پشتیبانی نمیکند‪.‬‬
‫‪‬‬
‫‪ OSGi‬پلتفرم استانداردی است که ارائه شده است تا بتواند این خ ٔ‬
‫ال را در زبان برنامه نویسی جاوا‬
‫پوشش دهد‪.‬‬
‫‪Java limitation‬‬
‫‪‬‬
‫جاوا نوع محدودی از ‪ modularity‬را پشتیبانی میکند که همان ‪object-oriented‬است که‬
‫این مدل ایرادهای زیر را دارد‪:‬‬
‫‪‬‬
‫کنترل دسترسی(‪ :)code visibility‬اگرچه جاوا قابلیت دسترسی را برای ما فراهم‬
‫‪.۱‬محدودیت در‬
‫ِ‬
‫میکند(‪ )public,private,protected‬اما این قابلیت تنها ‪ capsulation‬سطح پایین ‪ OO‬را‬
‫پاسخگو است‪.‬‬
‫‪‬‬
‫‪.۲‬مشکل دیگر مفهومی به نام ‪ classloader‬میباشد‪:‬برنامهها به یک سری ‪ library‬نیاز دارند‬
‫ورژن آنها نمیکند‪.‬در این شرایط‬
‫ولی ‪ classloader‬توجهی به ویژگیهای این الیبرریها از جمله‬
‫ِ‬
‫ورژن درست‪ JVM،‬دیگر پیغام خطا به ما ندهد‪.‬‬
‫راه حل آزمون و خطا میباشد که تا با انتخاب‬
‫ِ‬
‫‪OSGi Solution‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪ OSGi‬میتواند در موارد زیر این مشکالت را حل کند‪:‬‬
‫‪:Class Not Found Exception.۱‬‬
‫‪ OSGi‬این اطمینان را به شما میدهد که تا زمانی که وابستگی کدها برطرف نشده برنامه اجرا نشود‪.‬‬
‫‪‬‬
‫‪:Execution-Time Error.۲‬‬
‫‪‬‬
‫ورژن اشتباه ‪ library‬در ‪classpath‬‬
‫دلیل‬
‫به ِ‬
‫ِ‬
‫‪‬‬
‫‪.۳‬قابلیت اعمال تغییرات در برنامه به صورت ‪Dynamic‬‬
‫‪‬‬
‫‪.۴‬امکان توسعه برنامه به صورت موازی‬
‫‪‬‬
‫‪.۵‬استفاده مجدد از کدهای نوشته شده(‪)reusability‬‬
‫‪‬‬
‫‪Real-time developement.۶‬‬
Container
:‫ معروف وجود دارد‬container ۳,OSGi ‫برای پیاده سازی برنامههای مبتنی بر‬

equinox(Eclipse).۱

Apache Felix.۲

Knopflerfish .۳

‫‪Bundle‬‬
‫‪‬‬
‫‪-‬واحد سازند در ‪:OSGi‬‬
‫‪‬‬
‫واحد سازند در ‪ bundle , OSGi‬میباشد‪ bundle .‬در واقع همان ‪ jar‬فایلهای ما هستند که‬
‫عالوه بر محتویات ‪ jar‬فایل استاندارد دارای پوش ٔه ‪ META-INF‬میباشند که محتویات این پوشه فایل‬
‫‪ MANIFEST.MF‬است و اطالعات مربوط به آن ‪ jar‬فایل را دارا میباشد‪.‬‬
Bundle
: ‫اجزای سازنده‬
.class
Resources
MANIFEST.MF
Overview
‫‪OSGi Layers‬‬
‫‪‬‬
‫‪ OSGi‬و معماری الیه ی‪:‬‬
‫‪‬‬
‫‪ OSGi‬از ‪ ۳‬الیه مفهومی تشکیل شده است و هر کدام از این الیهها قابلیتی را به برنام ٔه ما اضافه‬
‫میکنند‪.‬‬
‫‪‬‬
‫نکته‪:‬مانند سایر مدلهای الیه الیه اینجا نیز‬
‫‪‬‬
‫هر الیه به الیه زیرین خود وابسته است‪.‬‬
‫‪Module‬‬
‫‪‬‬
‫‪ :Module‬وظیفه ی بستهبندی (‪ )packaging‬و همچنین به اشتراک گذاری کدها مربوط به این‬
‫الیه میباشد(‪)code visibility‬‬
MANIFEST.MF
:‫ دسته تقسیم میشود‬۳ ‫ به‬manifest.mf ‫اطالعات فایل‬
.human-readable information.1
.bundle identification.2
.code visibility.3
‫‪Import and Export‬‬
‫چه ‪package‬هایی دیده شوند؟‬
‫‪‬‬
‫چه ‪package‬هایی مورد نیاز است؟‬
‫پاسخ بهینه به این ‪ ۲‬سال‬
‫‪‬‬
‫‪‬‬
Lifecycle
‫ را در زمان‬bundle ‫ میباشد و مدیریت‬bundle ‫ این الیه در واقع همان چرخه حیاط‬:Lifecycle
)internal to application( ‫اجرا بر عهد دارد‬

uninstall ‫ و‬update، stop ،start،OSGi ‫ در‬bundle ‫وعملیات شامل نصب‬
.)external to application( ‫آن‬

Lifecycle
‫‪Lifecycle‬‬
‫‪‬‬
‫‪‬‬
‫‪ bundle :install‬درون ‪ container OSGi‬با استفاده از دستور‬
‫>‪ Install file :< directory‬نصب میشود و یک ‪Id‬واحد به آن اختصاص داده میشود‪.‬‬
‫‪‬‬
‫‪ :Resolve‬پس از نصب ‪ ، bundle‬هنگامی که هم ٔه وابستگیهای آن رفع شد باندل به صورت‬
‫خودکار در وضعیت ‪ resolve‬قرار میگیرد‪.‬‬
‫‪‬‬
‫‪ :start‬پس از اینکه وابستگیهای ‪ bundle‬برطرف شد میتوان آن را با دستور >‪start <id‬‬
‫راهاندازی کرد‪.‬‬
‫‪‬‬
‫‪ bundle :Active‬شروع به کار کرده و هم اکنون در حال اجرا است‪.‬‬
‫‪‬‬
‫‪ :Stop‬دستوری است که صادر میشود و باندل مورد نظر را متوقف میکنیم‪.‬‬
Lifecycle API
:‫را تشکیل میدهند‬lifecycle ‫که در واقع روح اصلی الیه‬interface ۳-

:BundleActivator.۱

‫در واقع‬.‫تعامل کرد‬osgi framework ‫میتوان با‬interface ‫ کردن این‬implement ‫با‬
۱ ‫فریم ورک‬، ‫ این اینترفیس فراخوانی میشود‬start() ‫نصب شده و متد‬bundle ‫وقتی‬
instance ‫ روی یک‬stop ()‫ و‬start() ‫در واقع متدهای‬.‫از این کالس میسازد‬instance
.‫یکسان از آن کالس اجرا میشوند‬

public void start(BundleContext context) throws Exception;
public void stop(BundleContext context) throws Exception;
Lifecycle API
:BundleContext.۲

:‫ دست تقسیم میشوند‬۲ ‫به‬interface ‫متدهای این‬

)lifecycle management(‫ها‬bundle ‫مدیریت چرخه حیاط‬.۱

.‫تعامل با سرویس ها‬.۲

‫ از طریق این اینترفیس میتوان به‬.‫است‬bundle ‫ جاری‬object ,BundleContext ‫در واقع‬
.‫سرویس رجیستری دسترسی پیدا کرد‬

void
void
void
void
addBundleListener(BundleListener listener);
removeBundleListener(BundleListener listener);
addFrameworkListener(FrameworkListener listener);
removeFrameworkListener(FrameworkListener listener);
Lifecycle API
:Bundle.۳

‫ایجاد میکند تا از لحاظ‬bundle Object ‫ یک‬framework ‫نصب شده‬bundle ‫برای هر‬
bundle ‫ را بر اساس‬bundle ‫هر‬framework ‫در واقع‬.‫ را بیان کند‬bundle ‫آن‬logical
.‫ایجاد شده میشناسد‬Object

‫ در زمان اجرا‬OSGi ‫ نکته جالب این است که‬
long getBundleId();
Dictionary getHeaders();
.‫ است‬bundle ‫خود به صورت‬
Dictionary getHeaders(String locale);
(system bundle)
String getLocation();
int getState();
String getSymbolicName();
‫‪services‬‬
‫‪‬‬
‫کاری که برای دیگری انجام میشود‪.‬‬
‫‪‬‬
‫وظیفه این الیه تامل و ارتباط میان ‪bundle‬ها است‪،‬اینگونه که ‪ A‬سرویس ‪ X‬را رجیستر میکند و ‪B‬‬
‫سرویس ‪ X‬را مصرف میکند‬
‫‪‬‬
‫با استفاده از مدل برنامه نویسی بر پای ٔه ‪ interface‬ها‪،‬وابستگی میان سرویس دهنده و سرویس‬
‫گیرنده از بین میرود‬
‫‪services‬‬
‫‪‬‬
‫مزایای برنامه نویسی سرویس گرا ‪:‬‬
‫‪.۱‬وابستگی کمتر قطعه کد ها‬
‫‪.۲‬برنامه نویسی با ‪ interface‬ها‪.‬‬
‫‪ metadata.۳‬اضافه)‪(Filter‬‬
‫‪.۴‬چند پیاده سازی‬
Whiteboard Pattern
‫‪Listening for Services‬‬
‫‪‬‬
‫‪ osgi‬از یک ‪ ListenerAPI‬برای مدیریت ‪Event‬ها استفاده میکند‪.‬‬
‫‪‬‬
‫‪ ۳‬مدل ‪ Event‬داریم‪:‬‬
‫‪‬‬
‫‪ :registered.۱‬سرویس رجیستر شده و میتوان از آن استفاده کرد‬
‫‪‬‬
‫‪ : modified.۲‬سرویس ‪ metaData‬تغییر کرده است‪.‬‬
‫‪‬‬
‫‪ :unregistering.۳‬سرویس در حال ‪ unregister‬شدن است‪.‬‬
Details
.‫ کند‬implement ‫ را‬interface serviceListener ‫ باید‬listener ‫هر کالس‬

‫نکت ٔه جالب در این باره این است که بر اساس‬.‫میتواند چند پیاده سازی داشته باشد‬interface ‫هر‬
‫چنین قابلیتی در فریم‬.‫ انجام داد‬filtering ‫ بدست آماده میتوان روی پیاده سازیها عمل‬metaData
!‫ورک های وجود ندارد و صرفا از روی پیاده سازی می توان فیلتر کرد نه عملکرد‬


ServiceRegistration registration =
bundleContext.registerService(serviceName, new IMP(),
metadata);
Dictionary metadata =new Properties();
Metadata. setProperties(key,value);
‫‪Enterprise OSGi‬‬
‫‪‬‬
‫مزایایی که ‪ E-OSGi‬میتواند به ‪ web application‬بیاورد‪:‬‬
‫‪‬‬
‫الی ٔه ‪ module‬ساختار بندی ‪ physical‬و ‪ logical‬بهتری برای ‪web app‬ها میاورد‪.‬‬
‫‪‬‬
‫الی ٔه ‪ lifecycle‬این قابلیت را ایجاد میکند که بتوان مدیریت دینامیک روی ‪ web app‬داشته‬
‫باشیم‪.‬‬
‫‪‬‬
‫الی ٔه ‪ service‬وابستگی کمتر بین بخشهای مختلف و امکان استفاده آنها در سایر پروژه ها فراهم‬
‫میکند‪.‬‬
‫‪WAB‬‬
‫‪ war ‬فایلی است که از ‪ metadata osgi‬پشتیبانی میکند و به الی ٔه ‪ lifecycle‬فریم‬
‫ورک ‪ osgi‬برای دسترسی به منابعش نیازمند است‪.‬‬
‫‪Apache Aries‬‬
‫‪‬‬
‫یکی از ‪Application Server‬هایی است که از ‪ EO‬پشتیبانی میکند و هم یک ‪web server‬‬
‫است و هم یک ‪servlet container‬و این قابلیت را دارد که به سادگی با سایر فریم ورکها آمیخته‬
‫شود‪)...،Clustering،JNDI،JMX،osgi،websocket( .‬‬
‫‪‬‬
‫روند کار اینگونه است که ‪WebContainer‬درون پوش ٔه ‪WEB-INF/web.xml‬را میگردد تا‬
‫ببیند چه سرولتهایی توسط باندل فراهم شده و ‪OSGiContainer‬درون پوش ٔه ‪META-‬‬
‫‪INF/MANIFEST.MF‬به دنبال اطالعات مربوط به خود باندل میگردد‪.‬‬
classloader
Apache Aries
‫معرفی ‪Spring dynamic module‬‬
‫‪‬‬
‫‪ Spring DM‬ترکیبی از ‪ Spring‬و ‪ OSGI‬است‬
‫‪‬‬
‫‪ Spring DM‬مدل برنامه نویسی ‪ Spring‬در برنامه های تحت ‪ OSGI‬می باشد‬
‫‪‬‬
‫‪ Spring DM‬یک راه حل بر مبنای ماژول بندی کردن برنامه پیشنهاد می دهد که به وسیله آن می توانیم از تمام ویژگی‬
‫های ‪ OSGI‬در قالب ‪ Spring‬استفاده کنیم ‪.‬‬
‫‪‬‬
‫در واقع هدف اصلی ‪ Spring DM‬این است که ‪ OSGI‬و ‪ Spring‬بتوانند به ساده ترین شکل با هم در تعامل باشند تا به‬
‫این شکل بتوانند ضعف های همدیگر را پوشش دهند‪.‬‬
‫‪‬‬
‫‪ Spring DM‬دارای یک ‪ extender‬می باشد که وظیفه ی ‪ extender‬این است که با بررسی شرایط ‪OSGI‬‬
‫‪ Bundle‬ها به آنها به صورت اختصاصی یک ‪ Spring application context‬بدهد که با این کار ‪OSGI‬‬
‫‪Bundle‬ها به ‪ Spring powered bundle‬تغییر نوع می هند ( در این رابطه به صورت مفصل تر در قسمت‬
‫های آتی صحبت خواهد شد )‬
‫چرا ‪Spring dynamic module‬‬
‫‪‬‬
‫با تمام فواید و مزایایی که ‪ Spring Framework‬به همراه دارد از جمله ‪ IOC‬و ‪ AOP‬بودن ‪ ،‬اما‬
‫‪ Spring‬مشکالتی هم دارد از جمله ‪:‬‬
‫‪‬‬
‫زمانی بر روی پروژه های بزرگ و پیچیده کار می کنیم به تعداد خیلی زیادی ‪ Bean‬نیاز داریم که‬
‫‪ config‬و مدیریت کردن آنها بسیار مشکل است‪.‬‬
‫‪‬‬
‫‪Spring‬توانایی ‪ module‬بندی کردن برنامه را ندارد ‪ .‬برای مثال هیچ روشی برای اینکه‬
‫‪Bean ، Visiility‬ها را کنترل کرد وجود ندارد و هر ‪ Bean‬توانایی مشاهده ی سایر ‪bean‬ها را‬
‫دارد ‪ .‬حتی اگر به صورت مستقیم هم از ‪bean‬ها استفاده نکنیم با استفاده از ‪Spring‬‬
‫‪ application context‬می توانیم به دنبال ‪ bean‬مورد نظر باشیم‪.‬‬
‫ادامه‬
‫‪‬‬
‫‪ configure‬کردن مجدد ‪ dependency graph‬برای وابستگی های اعمال شده‬
‫(‪: )dependency injection‬مشکل سوم به وابستگی هایی که بین ‪bean‬ها وجود دارد بر‬
‫می گردد برای مثال ‪ :‬فرض کنید ‪ bean A‬از ‪ bean B‬استفاده می کند در این صورت ‪ A‬به ‪B‬‬
‫وابستگی پیدا می کند ‪ .‬حال زمانی را فرض کنید که برنامه ما دارای چند صد ‪ bean‬باشد و بین آنها‬
‫وابستگی وجود داشته باشد که در ‪ dependency graph‬مشخص شده باشد ‪ ،‬حال اگر برنامه‬
‫در حال اجرا باشد و ما بین ‪bean‬ها وابستگی های جدیدی به وجود آوریم ‪ ،‬این وابستگی ها تا زمانی‬
‫که تمام برنامه یک بار ‪ restart‬نشود اعمال نخواهد شد و دلیل آن این است که مشخص شدن وابستگی‬
‫بین ‪bean‬ها فقط یکبار صورت می گیرد و آن هم در زمان ‪ start up‬شدن ‪spring‬‬
‫‪ container‬است و امکان ‪ update‬وابستگی ها در حین اجرا وجود ندارد ‪ .‬و مدیریت‬
‫‪dependency‬ها تماما به وسیله ی ‪ Spring‬انجام می شود و ‪ developer‬نمی تواند مدیریت‬
‫را خود کنترل نمایید ‪.‬‬
‫ادامه‬
‫‪ ‬در این حال ‪ OSGI‬هم دارای کمبود هایی بود ‪ ،‬از جمله ‪:‬‬
‫‪ ‬دارای قابلیت ‪ IOC‬و ‪ AOP‬نمی باشد‬
‫‪ ‬به خاطر همین کمبود ها تکنولوژی جدیدی به نام ‪ Spring DM‬به وجود آمد‬
‫‪ ‬با استفاده از ‪ spring dm‬شما می توانید از تمام ویژگی ها و قدرت فریم ورک ‪ spring‬در برنامه های‬
‫تحت استفاده ی ‪ osgi‬بهره ببرید‪.‬‬
‫‪ Spring dm ‬توانایی این را دارد که تمام ‪bundle‬ها را شناسایی کند و به صورت کامال مدیریت شده‬
‫برای هر کدام از آنها یک ‪ spring application context‬اختصاصی ایجاد کند‬
‫ادامه‬
‫‪‬‬
‫‪ spring dm‬یک نوع خاصی از ‪bundle‬ها را معرفی می کند به نام ‪Spring powered bundles:‬‬
‫‪‬‬
‫‪ :Spring powered bundle‬این نوع از ‪bundle‬ها توانایی این را دارند که به صورت اتوماتیک یک ‪spring‬‬
‫‪ application context‬اختصاصی داشته باشند که تماما توسط ‪ spring dm‬مدیریت می شوند و می توانند از تمام‬
‫ویژگی های ‪ spring‬استفاده کنند‬
‫‪‬‬
‫‪Spring powered bundle‬ها همانند ‪osgi bundle‬ها می توانند ‪package‬های مورد نیاز خود را‬
‫‪ import‬و ‪ export‬کنند‬
‫‪‬‬
‫‪Spring powered bundle‬ها از ‪ spring container‬و توانایی های ‪ spring dm‬استفاده می کند تا با‬
‫‪ osgi container‬در ارتباط باشند ‪ ،‬و این تعامل می تواند به دو روش باشد ‪annotation )2 xml base )1 :‬‬
‫‪base‬‬
‫ادامه‬
‫‪‬‬
‫در مبحث ‪ osgi‬با استفاده از یک ‪ ،Bundle Activator‬باندل خود را تعریف ‪ ،‬مقدار دهی اولیه و‬
‫‪ service‬ثبت کرده و یا از ‪ service‬ها استفاده کنیم‪.‬‬
‫‪‬‬
‫‪ Spring powered bundle‬درون خود شامل یک ‪ instance‬از ‪ spring container‬می‬
‫باشد ‪ ،‬که با استفاده از این ‪ container‬می توانیم از ویژگی های ‪ IOC‬و ‪ AOP‬استفاده کنیم و‬
‫دیگر نیازی به ‪ Bundle Activator‬نمی باشد زیرا ‪ spring container‬به صورت اتوماتیک‬
‫توسط ‪ spring dm‬فراخوانی می شود‪.‬‬
‫‪Spring DM’s extender‬‬
‫‪mechanisms‬‬
‫‪ Spring DM ‬یک ‪ extender bundle‬به وجود می آورد که وظیفه آن گوش دادن به ‪bundle‬هایی‬
‫است که می خواهند بر روی ‪ osgi container‬نصب شوند ‪ ،‬اگر این ‪bundle‬ها دارای شرایط الزم‬
‫بودند ‪ extender ،‬آنها را به ‪ spring powered bundle‬تبدیل می کند ‪ .‬و برای هر کدام به‬
‫صورت اختصاصی یک ‪ spring application context‬ایجاد می کند‪.‬‬
‫‪ ‬سوال ‪ spring extender :‬چگونه تصمیم می گیرد که کدام ‪ bundle‬باید به ‪spring powered‬‬
‫‪ bundle‬تبدیل شود ؟ برای اینکه یک ‪ bundle‬بتواند به ‪ spring powered bundle‬تبدیل شود‬
‫باید شامل ‪ 2‬ویژگی باشد ‪:‬‬
‫‪(1‬‬
‫باید دارای دایرکتوری ‪ META-INF/spring‬باشد که داخل دایرکتوری ‪ spring‬باید یک فایل ‪ xml‬برای‬
‫‪configure‬کردن ‪ spring‬داشته باشد‬
‫‪(2‬‬
‫در داخل فایل ‪ MANIFEST.MF‬واقع در دایرکتوری‪ META-INF‬دارای یک ‪ header‬به نام‬
‫‪ Spring-Context‬باشد ‪ ،‬که در واقع مقدار این ‪ header‬مشخص کننده محل فایلی است که ‪spring‬‬
‫را ‪ configure‬خواهد کرد‬
‫‪Kinds of supported bundles‬‬
‫‪‬‬
‫‪ 2 Spring DM‬نوع ‪ bundle‬را ساپورت می کند ‪:‬‬
‫‪(1‬‬
‫‪standard Spring-powered bundles‬‬
‫‪(2‬‬
‫‪web bundles‬‬
‫‪‬‬
‫در اسالیدهای قبلی ما با یک نوع از ‪ spring extender bundle‬آشنا شدیم که در واقع تنها برای‬
‫‪ standard Spring-powered bundles‬مورد استفاده قرار می گیرد ‪ ،‬اما نوع دیگری از‬
‫‪ extender‬ها وجود دارند که از آنها برای ‪web bundle‬ها استفاده می شوند که اصطالحا به آنها‬
‫می گویند ‪ ، web extender‬که از ‪ web extender‬برای پیاده سازی ‪bundle‬ها در سمت‬
‫‪web application‬ها استفاده می شود‪.‬‬
‫‪Kinds of supported bundles‬‬
‫‪‬‬
‫‪ 2 Spring DM‬نوع ‪ bundle‬را ساپورت می کند ‪:‬‬
‫‪(1‬‬
‫‪standard Spring-powered bundles‬‬
‫‪(2‬‬
‫‪web bundles‬‬
‫‪‬‬
‫در اسالیدهای قبلی ما با یک نوع از ‪ spring extender bundle‬آشنا شدیم که در واقع تنها برای‬
‫‪ standard Spring-powered bundles‬مورد استفاده قرار می گیرد ‪ ،‬اما نوع دیگری از‬
‫‪ extender‬ها وجود دارند که از آنها برای ‪web bundle‬ها استفاده می شوند که اصطالحا به آنها‬
‫می گویند ‪ ، web extender‬که از ‪ web extender‬برای پیاده سازی ‪bundle‬ها در سمت‬
‫‪web application‬ها استفاده می شود‪.‬‬
Equinox container for web

‫ را ساپورت‬OSGI ‫ها بر روی محیط‬web application ‫ پیاده سازی‬، ‫ به بعد‬version 1.1 ‫ از‬Spring DM
.‫می کند‬

‫ها تا حدودی متفاوت است و نیازمند یک‬desktop application ‫ها نسبت به‬web application ‫پیاده سازی‬
.‫ می باشد‬web container

web container ‫ و‬osgi container ‫ مشابه پلی عمل می کند میان‬spring dm ‫در واقع‬

‫ها را‬web bundle ‫ استفاده می کند تا به وسیله ی آن‬web extender ‫ از‬spring dm ، web ‫در سمت‬
‫شناسایی و نصب کند‬

: ‫ ساپورت می کند‬web container ، 2 ‫ از‬web ‫ در سمت‬Spring DM

Tomcat is the default container in Spring DM
‫ به بعد‬5.5 ‫ از ورژن‬Apache Tomcat
(1
Jetty
(2
‫‪Packaging a web bundle‬‬
‫‪‬‬
‫‪(1‬‬
‫‪(2‬‬
‫‪‬‬
‫در سمت ‪web application‬ها برای استفاده از ‪ web bundle‬بر روی ‪ web container‬نیازمند ‪ 2‬مرحله‬
‫هستیم ‪:‬‬
‫‪ Deploy‬کردن ‪ web bundle‬بر روی ‪ osgi container‬همانند یک ‪ bundle‬معمولی‬
‫واسط قرار گرفتن ‪ spring dm web extender‬برای توانایی برقراری ارتباط بین ‪ osgi container‬و‬
‫‪web container‬‬
‫برای اینکه ‪ spring dm web extender‬بتواند ‪ bundle‬را بر روی ‪ deploy ، web container‬کند ‪،‬‬
‫‪ bundle‬مورد نظر باید دارای ‪ 2‬ویژگی باشد ‪:‬‬
‫‪(1‬‬
‫پسوند فایل ‪ .war‬باشد‬
‫‪(2‬‬
‫فایل شامل دایرکتوری ‪ WEB-INF‬باشد‬
‫‪‬‬
‫که در این مقاله ‪bundle‬های ما دارای شرط دوم می باشند‬
‫‪Spring DM standard extender‬‬
‫‪mechanisms‬‬
‫‪‬‬
‫یکی از وظایف اصلی ‪ Spring dm standard extender‬گوش دادن به ‪bundle‬هایی است‬
‫که می خواهند بر روی ‪ osgi container‬قرار بگیرند تا در صورت داشتن شرایط الزم‬
‫‪ extender‬آنها را به ‪ powered bundle‬تبدیل کند‬
‫‪‬‬
‫‪ Extender‬عالوه بر ‪bundle‬هایی که می خواهند بر روی ‪ container‬نصب شوند به ‪spring‬‬
‫‪powered bundle‬هایی که بر روی ‪ osgi container‬نصب هستند و یا حتی در حالت‬
‫‪ active‬نیز می باشند گوش می دهد و شرایط آنها را مرتبا بررسی می کند‬
‫‪‬‬
‫از دیدگاه ‪ osgi container‬هیچ تفاوتی میان ‪ osgi bundle‬و ‪standard powered‬‬
‫‪ bundle‬وجود ندارد زیرا هر دو از ‪package‬های یکسانی استفاده می کنند و هر دو ‪ jar‬فایل‬
‫هایی هستند که دارای دایرکتوری ‪ META-INF/MANIFEST.MF‬می باشند ‪.‬‬
‫ادامه‬
: ‫ چیز است‬2 ‫ داشتن‬powered bundle ‫از ویژگی های‬

‫ است‬xml ‫ که شامل یک فایل‬META-INF/spring
(1
Spring-Context manifest header
(2
‫ بود از آن‬xml ‫ را چک می کند اگر شامل فایل‬META-INF/spring ‫ ابتدا‬Spring extender
configure ‫ مربوط به‬xml ‫ اما اگر فایل‬، ‫ استفاده می کند‬spring ‫ کردن‬configure ‫فایل برای‬
. ‫ خواهد داد‬exception ‫ از آن نمی تواند استفاده بکند و‬extender ‫ نباشد‬spring ‫کردن‬

‫ است‬Spring-Context manifest header ‫اولویت با‬

‫‪HOW SPRING DM CREATES‬‬
‫‪APPLICATION CONTEXTS‬‬
‫‪‬‬
‫‪ Spring powered bundle‬هیچگونه نگرانی در رابطه با ‪ create‬و یا ‪ destroy‬کردن‬
‫‪ spring application context‬ندارد و این کار جزو وظایف ‪ spring extender‬می باشد‬
‫‪‬‬
‫‪ Spring dm extender‬جزو اولین ‪bundle‬هایی است که به حالت ‪ active‬می رود ‪ ،‬به این‬
‫دلیل که باید در حالت ‪ active‬باشد تا بتواند سایر ‪bundle‬ها را شناسایی کند و به آنها ‪spring‬‬
‫‪ application context‬اختصاص دهد‬
‫‪‬‬
‫‪ Spring dm extender‬توانایی این را دارد که ‪bundle‬هایی که قبل خودش در ‪container‬‬
‫نصب شده اند را شناسایی کند و به آنها در صورت لزوم ‪spring application context‬‬
‫اختصاص دهد‬
‫ادامه‬

Usually, Spring-powered bundles are deployed after the Spring extender.
‫هایی اختصاص دهد که‬bundle ‫ را به‬spring application context ‫ تالش می کند تا‬Spring extender
‫ هستند‬active ‫در حالت‬

: ‫پس روال کار به این ترتیب است‬

active ‫ در حالت‬Spring extender
(1
active ‫ در حالت‬Osgi bundle
(2
bundle ‫ به‬spring application context ‫اختصاص‬
(3
‫ انجام می شوند‬Tread base ‫تمام مراحل باال‬
