ÀÌ ±ÛÀº Neil Bartlett ÀÇ ¿¬Àç ±Û
"Getting started with OSGi"ÀÇ ¹ø¿ªº»ÀÔ´Ï´Ù.
*
ÆÄÆ® 1 - ù¹øÂ° ¹øµé : Your First Bundle
*
ÆÄÆ® 2 - ÇÁ·¹ÀÓ¿öÅ©¿Í ¿¬µ¿Çϱâ : Interacting with the Framework
*
ÆÄÆ® 3 - ¹øµé°£ÀÇ ÀÇÁ¸°ü°è : Dependencies between bundles
*
ÆÄÆ® 4 - ¼ºñ½º µî·ÏÇϱâ : Registering a Service
*
ÆÄÆ® 5 - ¼ºñ½º »ç¿ëÇϱâ : Consuming a Service
*
ÆÄÆ® 6 - µ¿ÀûÀ¸·Î ¼ºñ½º ÃßÀûÇϱâ : Dynamic Service Tracking
*
ÆÄÆ® 7 - ¼±¾ðÀû ¼ºñ½º ¼Ò°³Çϱâ : Introducing Declarative Services
¿¡ À̾î 8¹øÂ° ¸¶Áö¸· ±ÛÀÔ´Ï´Ù. ¿ÀÅ»ÀÚ ¹× ÀÌ»óÇÑ ¹ø¿ªÀº ´ñ±Û·Î ³²°ÜÁÖ¼¼¿ä
Getting started with OSGi : OSGi ½ÃÀÛÇÏ±â ÆÄÆ® 8 - ¼±¾ðÀû ¼ºñ½º¿Í ÀÇÁ¸°ü°è
ÀúÀÚ : Neil Bartlett < njbartlett at gmail dot com >
¿ªÀÚ : ±Ç Á¤Çõ < guruguru at gmail dot com >
±Û¿øº» :
http://www.eclipsezone.com/eclipse/forums/t97690.html - Getting started with OSGi : Declarative Services and Dependencies
"Getting Started with OSGi" ½Ã¸®Áî¿¡ µ¹¾Æ ¿À½Å°É ȯ¿µÇÕ´Ï´Ù. ·¹½¼ ½ÃÀÛÀü¿¡ ÇѰ¡Áö °øÁö, ÀÌ Æ©Å丮¾óÀÇ ÀÌÀüȸµéÀ» º¸½Ã·Á¸é
Á¦ ºí·Î±× ÆäÀÌÁö¿¡¼ ¸µÅ©µéÀ» ã¾Æº¸½Ç¼ö ÀÖ½À´Ï´Ù.
Áö³¹ø¿¡´Â ¼±¾ðÀû ¼ºñ½º¿¡ ´ëÇØ óÀ½À¸·Î »ìÆìºÃ½À´Ï´Ù. À̹ø¿¡´Â ¼±¾ðÀû ¼ºñ½ºÀÇ »ç¿ëÀÚ Ãø¸éÀ» »ìÆìº¼ °ÍÀÔ´Ï´Ù. Áö³¹ø¿¡
java.lang.Runnable ÀÎÅÍÆäÀ̽º·Î ¼ºñ½º¸¦ µî·ÏÇߴٴ°ÍÀ» ±â¾ïÇϼ¼¿ä. ÀÌÁ¦ ¿ì¸®´Â ±× ¼ºñ½º¿¡ ÀÇÁ¸ÇÏ´Â ÄÄÆ÷³ÍÆ®¸¦ ¸¸µé¾î º¼ °ÍÀÔ´Ï´Ù.
¸»¾¸µå¸°´ë·Î, ¼±¾ðÀü ¼ºñ½º¿¡ ´ëÇÑ ½ºÆåÀº ÀÌÀü ·¹½¼µé¿¡¼ º¸¾Ò´ø OSGi ÀÇ ±Û·ç(glue)Äڵ庸´Ù ¿©·¯ºÐ ÄÚµåÀÇ Application Logic ¿¡ ÁýÁßÇÒ¼ö ÀÖµµ·Ï ÇØÁÖ´Â °ÍÀÔ´Ï´Ù. ÀÌ°É ¿°µÎ¿¡ µÎ°í, Äڵ带 »ìÆìº¸°Ú½À´Ï´Ù. ±×Àü¿¡ ¿ì¸° ÇÁ·ÎÁ§Æ®¸¦ Çϳª ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ÀÌÀü ·¹½¼ÀÇ ¼ø¼¸¦ µû¶ó¼, À̹ø¿£ "SampleImporter" ¶ó´Â À̸§À¸·Î ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÏ¿© º¸¼¼¿ä.
»õ·Î »ý¼ºµÈ Eclipse ÇÁ·ÎÁ§Æ®¿¡ ¾Æ·¡ Äڵ带 º¹»çÇÏ¿© src Æú´õ¿¡ ºÙ¿©³Ö½À´Ï´Ù.
package org.example.ds;
import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.eclipse.osgi.framework.console.CommandProvider;
public class SampleCommandProvider1 implements CommandProvider {
private Runnable runnable;
public synchronized void setRunnable(Runnable r) {
runnable = r;
}
public synchronized void unsetRunnable(Runnable r) {
runnable = null;
}
public synchronized void _run(CommandInterpreter ci) {
if(runnable != null) {
runnable.run();
} else {
ci.println("Error, no Runnable available");
}
}
public String getHelp() {
return "\trun - execute a Runnable service";
}
}
ÀÌ Å¬·¡½º´Â Equinox ¸¦ ½ÇÇàÇÒ¶§ osgi> ÇÁ·ÒÇÁÆ® »ó¿¡¼ »ç¿ë°¡´ÉÇÑ ¸í·ÉµéÀ» È®ÀåÇÏ´Â
CommandProvider ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÕ´Ï´Ù.
CommandProvider ¸¦ ÀÛ¼ºÇÏ´Â ÀÌÀ¯´Â, ±×°Ô ¿ì¸® Äڵ带 ÀÎÅÍ·¢Æ¼ºêÇÏ°Ô Å×½ºÆ®ÇÏ±â ÆíÇϱ⠶§¹®ÀÔ´Ï´Ù. Ä¿¸Çµå ÇÁ·Î¹ÙÀÌ´õ¿¡ ´ëÇØ¼´Â
IBM developerWorks ¿¡ Chris Aniszczyk ÀÇ ±â»ç¿¡ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ÀÖ½À´Ï´Ù.
¿ì¸®°¡ ÀÌ Å¬·¡½º¿¡¼ ¾î¶² OSGi API µµ È£ÃâÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ÁÖ¸ñÇϼ¼¿ä. ½ÇÁ¦·Î ¿ì¸®´Â
org.osgi.* ÆÐŰÁö¿¡¼ ¾Æ¹«°Íµµ import ÇÒ Çʿ䵵 ¾ø½À´Ï´Ù. ¿ì¸®°¡ ÀÇÁ¸ÇÏ´Â ¼ºñ½º´Â
java.lang.Runnable ÀÇ ÀνºÅϽºÀ̸ç
setRunnable ¸Þ¼Òµå·Î ¿ì¸®¿¡°Ô Àü´ÞµÇ¸ç,
unsetRunnable ¸Þ¼Òµå¿¡ ÀÇÇØ Ä¡¿öÁý´Ï´Ù. ¿ì¸®´Â À̰ÍÀ»
dependency injection ÀÇ ÇüÅ·Πº¼¼ö ÀÖ½À´Ï´Ù.
´Ù¸¥ µÎ°³ÀÇ ¸Þ¼Òµå
getHelp ¿Í
_run Àº Ä¿¸Çµå ÇÁ·Î¹ÙÀÌ´õ¿¡ ´ëÇÑ ±¸Çö ¸Þ¼Òµåµé ÀÔ´Ï´Ù. ³×, "_run" Àº ¾Õ¿¡ ¹ØÁÙÀÌ ÀÖ´Â ¿ô±â´Â À̸§ÀÔ´Ï´Ù¸¸, À̰ÍÀº Equinox console APIs ÀÇ ÀÌ»óÇÑ ±â´ÉÀ̸ç OSGi ³ª ¼±¾ðÀû ¼ºñ½º¿Í´Â »ó°üÀÌ ¾ø½À´Ï´Ù. ¸Þ¼ÒµåÀÇ À̸§ ¾Õ¿¡ ¹ØÁÙÀ» ³Ö´Â ÆÐÅÏÀº Equinox console ¿¡¼ ¸í·ÉÀÌ µÇ¹Ç·Î,
_run ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù´Â °ÍÀº ¿ì¸®°¡ "run" ¸í·ÉÀ» Ãß°¡Çߴٴ°ÍÀÔ´Ï´Ù. ÀÌ Å¬·¡½º¿¡¼ ÁÖÀÇÇÒ ´Ù¸¥Á¡Àº, runnable Çʵ尡 ¾÷µ¥ÀÌÆ®/Á¢±ÙÀÌ ¾²·¹µù¿¡ ¾ÈÀüÇÑ ÇüÅ·ΠÀÌ·ç¾îÁ®¾ß ÇÑ´Ù´Â °Í¿¡ ÁÖÀÇÇØ¾ß ÇÕ´Ï´Ù. OSGi °¡ º»ÁúÀûÀ¸·Î ¸ÖƼ¾²·¹µåÀ̱⠶§¹®¿¡ ¾²·¹µå ¾ÈÀüÀº Áß¿äÇÕ´Ï´Ù. ¿ì¸° Ç×»ó ¿ì¸®ÀÇ Äڵ带 ¾²·¹µù¿¡ ¾ÈÀüÇÏ°Ô ÀÛ¼ºÇØ¾ß ÇÕ´Ï´Ù.
Àü°ú °°ÀÌ, ¿ì¸° À̰ÍÀÌ °¡´ÉÇÏ°Ô ÇÏ´Â DS ¼±¾ðÀ» °¡Áø XML ÆÄÀÏÀ» Á¦°øÇØ¾ß ÇÕ´Ï´Ù. ¾Æ·¡ Äڵ带
OSGI-INF/commandprovider1.xml ¿¡ º¹»çÇϼ¼¿ä.
<?xml version="1.0"?>
<component name="commandprovider1">
<implementation class="org.example.ds.SampleCommandProvider1"/>
<service>
<provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
</service>
<reference name="RUNNABLE"
interface="java.lang.Runnable"
bind="setRunnable"
unbind="unsetRunnable"
cardinality="0..1"
policy="dynamic"/>
</component>
Á¦°¡ Áö³¹ø¿¡ ¸»ÇÏÁö ¾ÊÀº Áß¿äÇÑ ´Ü°è°¡ ÀÖ½À´Ï´Ù. (
ÁöÀûÇØÁØ Seamus Venasse ¿¡°Ô °¨»çµå¸³´Ï´Ù.) ¿©·¯ºÐÀÇ Ç÷¯±×ÀÎ ÇÁ·ÎÁ§Æ®¾È¿¡
build.properties ¸¦ ¼öÁ¤ÇÏ¿©,
OSGI-INF Æú´õ¿· üũ¹Ú½º¸¦ ÄѾßÇÕ´Ï´Ù. À̰ÍÀº ¹øµéÀÌ Eclipse export wizard ¸¦ ÀÌ¿ëÇϰųª PDE ºôµå¸¦ ÀÌ¿ëÇØ¼ Export µÉ¶§ ÇØ´ç Æú´õ°¡ ²À Æ÷ÇԵǵµ·Ï ÇϱâÀ§ÇØ ÇÊ¿äÇÕ´Ï´Ù. ¶ÇÇÑ ¾Æ·¡ ¶óÀÎÀ» ¹øµé Manifest ¿¡ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù.
Service-Component: OSGI-INF/commandprovider1.xml
À§ DS ¼±¾ðÀº ÀÌÀü¿¡ ¿ì¸®°¡ ºÃ´ø°Í°ú °°Àº
implementation °ú
service µÎ°³ÀÇ °°Àº Ç׸ñÀ» °¡Áö°í ÀÖ½À´Ï´Ù.
implementation ³ëµå´Â ÄÄÆ÷³ÍÆ®¸¦ ½ÇÁ¦ ±¸ÇöÇϴ Ŭ·¡½ºÀÇ À̸§À» Ç¥½ÃÇϸç,
service ³ëµå´Â DS ¿¡°Ô ÄÄÆ÷³ÍÆ®¸¦ ¼ºñ½º·Î µî·ÏÇϵµ·Ï ¾Ë·ÁÁÝ´Ï´Ù. ÀÌ °æ¿ì´Â ¿ì¸®°¡
CommandProvider ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇÏ¿© µî·ÏÇÔÀ¸·Î½á, Equinox ÄܼÖÀÌ ¿ì¸® Ä¿¸Çµå ÇÁ·Î¹ÙÀÌ´õ ÀÇ Á¸À縦 ¾Ë°Ô µË´Ï´Ù.
´ÙÀ½ ¿¤¸®¸ÕÆ®ÀÎ
reference ´Â ¿ì¸®°¡ ÀÌÀü¿¡ º¸Áö ¸øÇѰÍÀ¸·Î, DS ¿¡ ¿ì¸®°¡ ¼ºñ½º¿¡ ÀÇÁ¸Çϰí ÀÖ´Ù´Â °ÍÀ» ¼±¾ðÇØ ÁÝ´Ï´Ù.
name ¼Ó¼ºÀº ÀÇÁ¸°ü°èÀÇ À̸§À» ³ªÅ¸³»´Â ¹®ÀÚ¿À̸ç(ÀÌ°Ô ¾îµð¿¡ ¾²ÀÌ´ÂÁö´Â ¾ÆÁ÷ ¾Ë Çʿ䰡 ¾ø½À´Ï´Ù)
interface ¼Ó¼ºÀº ¿ì¸®°¡ ÀÇÁ¸ÇÏ´Â ÀÎÅÍÆäÀ̽º À̸§À» ³ªÅ¸³À´Ï´Ù.
bind ¼Ó¼ºÀº ¼ºñ½º°¡ »ç¿ë °¡´ÉÇÒ¶§ DS ¿¡ ÀÇÇØ È£ÃâµÉ ±¸ÇöŬ·¡½ºÀÇ ¸Þ¼Òµå À̸§À̸ç, ´Ù½Ã ¸»Çؼ
Runnable ¼ºñ½º°¡ ¼ºñ½º ·¹Áö½ºÆ®¸®¿¡ µî·ÏµÉ¶§ DS °¡ »õ·Î¿î ¼ºñ½º °´Ã¼¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦ ¾ò¾î¼ ÀÌ ÁöÁ¤ ¸Þ¼Òµå¸¦ ÅëÇØ ¿ì¸®¿¡°Ô Àü´ÞÇØ Áشٴ °ÍÀÔ´Ï´Ù. ºñ½ÁÇϰÔ
unbind ¼Ó¼ºÀº ¼ºñ½º°¡ »ç¿ë ºÒ°¡´ÉÇØ Áú¶§ DS ¿¡ ÀÇÇØ È£ÃâµÉ ¸Þ¼Òµå ¸íÀÔ´Ï´Ù.
cardinality ¼Ó¼ºÀº DS ÀÇ ÁøÁ¤ÇÑ ÈûÀ» º¸¿©ÁÝ´Ï´Ù. ÀÌ ¼Ó¼ºÀº ÀÇÁ¸¼ºÀÌ Çʼö(mandatory)ÀÎÁö ¼±ÅÃ(optional)ÀÎÁö, ´ÜÀÏÀÎÁö ´Ù¼öÀÎÁö¸¦ ÁöÁ¤ÇÏ°Ô ÇØÁÝ´Ï´Ù. °¡´ÉÇÑ °ªµéÀº
´ÙÀ½°ú °°½À´Ï´Ù.
- 0..1: ¼±ÅÃÀÌ¸é¼ ´ÜÀϰü°è , "0 ¶Ç´Â 1" - "zero or one"
- 1..1: ÇʼöÀÌ¸é¼ ´ÜÀϰü°è , "µü 1°³" - "exactly one"
- 0..n: ¼±ÅÃÀÌ¸é¼ º¹¼ö°ü°è , "0 ¿¡¼ ¿©·¯°³" - "zero to many"
- 1..n: ÇʼöÀÌ¸é¼ º¹¼ö°ü°è , "1 ¿¡¼ ¿©·¯°³" ¶Ç´Â "Àû¾îµµ ÇѰ³ ÀÌ»ó" - "one to many" or "at least one"
ÀÌ ¿¹Á¦¿¡¼´Â ¿ì¸° ¿É¼ÇÀÌ¸é¼ ´ÜÀϰü°è¸¦ ¼±ÅÃÇßÀ¸¹Ç·Î, À̰ÍÀº ¿ì¸®ÀÇ Ä¿¸Çµå ¼ºñ½º°¡ ÀÇÁ¸ÇÏ´Â ¼ºñ½º°¡ ¾ø´õ¶óµµ ´ëóÇÒ¼ö Àִٴ°ÍÀ» ÀǹÌÇÕ´Ï´Ù. _run ¸Þ¼Òµå¸¦ ´Ù½Ã »ìÆìº¸¸é ÀÌ·± »óȲÀ» ´ëóÇϱâ À§ÇØ ¼ºñ½º Çڵ鿡 ´ëü null üũ°¡ ÇÊ¿äÇߴٴ°ÍÀ» º¸½Ç¼ö ÀÖ½À´Ï´Ù.
ÀÌ ¹øµéÀ» ½ÇÇàÇßÀ»¶§ ¾î¶² ÀÏÀÌ ÀϾ´ÂÁö º¾½Ã´Ù. Áö³¹ø¿¡ ÀÛ¼ºÇß´ø SampleExporter ¹øµéÀ» ¾ÆÁ÷ ½ÇÇàÁß¿¡ ÀÖ´Ù¸é, osgi> ÇÁ·ÒÇÁÆ®¿¡¼ "run" ¸í·ÉÀ» ÀÔ·ÂÇßÀ»¶§ ¾Æ·¡ Ãâ·ÂÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
Hello from SampleRunnable
¸ÚÁý´Ï´Ù. À̰ÍÀº ¿ì¸®°¡ Áö³¹ø ·¹½¼¿¡¼ ÀÛ¼ºÇÑ Runnable ¼ºñ½º°¡ ¼º°øÀûÀ¸·Î import µÇ¾ú´Ù´Â°ÍÀ» ¾Ë·ÁÁÝ´Ï´Ù. ÀÌÁ¦ stop ¸í·ÉÀ» ÀÌ¿ëÇØ¼ SampleExporter ¹øµéÀ» ÁߴܽÃŵ´Ï´Ù. ±×¸®°í ´Ù½Ã "run" ¸í·ÉÀ» ÀÔ·ÂÇÏ¸é ¾Æ·¡¿Í °°Àº ¸Þ½ÃÁö¸¦ º¼¼ö ÀÖ½À´Ï´Ù.
Error, no Runnable available
À̰ÍÀ¸·Î º¸¾Æ, DS °¡ Runnable ¼ºñ½º°¡ ¾ø¾îÁ® ¹ö·Á¼ ¿ì¸®ÀÇ unsetRunnable ¸Þ¼Òµå¸¦ È£ÃâÇߴٴ°ÍÀ» ¾Ë¼ö ÀÖ½À´Ï´Ù.
´Ù½Ã
cardinality ¼Ó¼ºÀ» »ìÆìº¸¸é, ¸¸¾à ¿ì¸®°¡ "1..1" ·Î º¯°æÇؼ ¼±Åÿ¡¼ Çʼö ÀÇÁ¸°ü°è·Î ¹Ù²Ù¸é ¾î¶²ÀÏÀÌ »ý±æ±î¿ä ? Çѹø º¯°æÇϰí Equinox ¸¦ Àç½ÇÇà ÇØº¸¼¼¿ä. ¸¸¾à SampleExporter°¡ Ȱ¼ºÈ µÇ¾îÀÖ´Ù¸é ¿ì¸®°¡ "run" À» ÀÔ·ÂÇßÀ»¶§ ÀÌÀü°ú °°Àº "Hello from SampleRunnable" ¸Þ½ÃÁö¸¦ º¼¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ¸¸¾à SampleExporter°¡ºñȰ¼ºÈ µÇ¾î ÀÖ´Ù¸é ÀüÇô ´Ù¸¥ ¸Þ½ÃÁö¸¦ º¼¼ö ÀÖ½À´Ï´Ù. ½ÇÁ¦·Î ¿ì¸° ¸ð¸£´Â ¸í·ÉÀ» ÀÔ·ÂÇßÀ»¶§ ³ª¿À´Â Equinox ÄܼÖÀÇ µµ¿ò¸»À» º¸°Ô µË´Ï´Ù. À̰ÍÀº ¿ì¸®ÀÇ Command Provider ÀÚü°¡ DS ¿¡ ÀÇÇØ µî·ÏÇØÁ¦ µÇ¾ú´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù! ÄÄÆ÷³ÍÆ®°¡ Çʼö ÀÇÁ¸°ü°è¸¦ ÃæÁ·½ÃŰÁö ¸øÇϱ⠶§¹®¿¡ DS °¡ ÄÄÆ÷³ÍÆ®¸¦ ºñ Ȱ¼ºÈ Çϰí Á¦°øÇÏ´ø ¼ºñ½º ÀÚü¸¦ µî·ÏÇØÁ¦ ÇѰÍÀÔ´Ï´Ù. ±×·¡¼ Equinox ÄܼÖÀÌ run ¸í·É ÀÚü¸¦ ¸ð¸£°Ô µÈ°ÍÀÌÁÒ.
ÀÌ·± ½¬¿î º¯°æÀÌ ¿ì¸®°¡ ¼±¾ðÀû ¼ºñ½º¸¦ ÀÌ¿ëÇÏ´Â °¡Àå Å« ÀÌÀ¯Áß ÇϳªÀÔ´Ï´Ù. ¿ì¸®°¡
ServiceTracker ¸¦ ÀÌ¿ëÇÒ¶§´Â ²Ï ¸¹Àº ¾çÀÇ Äڵ带 ÀçÀÛ¼ºÇØ¾ß Çߴٴ°ÍÀ» ±â¾ïÇϼ¼¿ä.
¿©·¯ºÐ²²¼± Á¦°¡ ¾ÆÁ÷ ¾ð±ÞÇÏÁö ¾ÊÀº
policy ¼Ó¼ºÀÌ ±Ã±ÝÇÏ½Ç °ÍÀÔ´Ï´Ù. ÀÌ ¼Ó¼ºÀÇ °ªÀº static ¶Ç´Â dynamic ÀÌ µÉ¼öÀÖÀ¸¸ç, dynamicÀº ¼ºñ½º°¡ µ¿ÀûÀ¸·Î º¯°æµÉ¶§ ÄÄÆ÷³ÍÆ®ÀÇ implementationÀÌ ÀÌ¿¡ µ¿ÀûÀ¸·Î ´ëÀÀÀÌ °¡´ÉÇÑÁö¸¦ ¸»ÇØÁÝ´Ï´Ù. staticÀ̶ó¸é DS°¡ ÇØ´ç ¼ºñ½º°¡ º¯°æµÉ¶§¸¶´Ù ÄÄÆ÷³ÍÆ®¸¦ ºñȰ¼ºÈÇÏ°í »õ·Î¿î ÀνºÅϽº¸¦ ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ÀÌ°Ç ¸Å¿ì ºÎÇϰ¡ ¸¹Àº Á¢±Ù¹æ¹ýÀ̸ç, ¿©·¯ºÐ²²¼± °¡´ÉÇÏ¸é µ¿Àû º¯°æÀ» Áö¿øÇϵµ·Ï ÄÄÆ÷³ÍÆ® Ŭ·¡½º¸¦ ÄÚµùÇϴ°ÍÀÌ ÁÁ½À´Ï´Ù. ¾Æ½±°Ôµµ static ÀÌ ±âº»°ªÀ̱⠶§¹®¿¡ dynamic À» ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù.
±×·³ Áö±Ý±îÁö ¼±Åà ´ÜÀÏ ¹× Çʼö ´ÜÀÏ °ü°è¸¦ »ìÆìº¸¾Ò½À´Ï´Ù. ±×·³ º¹¼ö°ü°è´Â ¾î¶³±î¿ä ? ¼ºñ½º ·¹Áö½ºÆ®¸®¿¡´Â ÇѰ³ÀÌ»óÀÇ Runnable ÀÌ µî·ÏµÇ¾îÀÖÀ»±¸ ÀÖ±¸, ±×Áß ÇѰ¡Áö¿Í ¿¬°á(bind)ÇÒ¶§ ¾î¶²°ÍÀ» ¼±ÅÃÇÏ´ÂÁö´Â ÀÓÀÇ·Î °áÁ¤µË´Ï´Ù. ¾Æ¸¶µµ ¿ì¸° ÇöÀç µî·ÏµÈ
¸ðµç Runnable À» ½ÇÇàÇϵµ·Ï ÇÏ´Â "runall" ¸í·ÉÀ» °³¹ßÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
¸¸¾à ¿ì¸®°¡
cardinality ¸¦ "0..n" À¸·Î ¹Ù²Ù¸é ¹«½¼ÀÏÀÌ ¹ú¾îÁú±î¿ä ? ¾Æ¸¶ °ÅÀÇ µ¿ÀÛÇÒ °Ì´Ï´Ù. ´Ù¸¸
setRunnalbe À» Çѹø È£ÃâÇÏ´Â°Í ´ë½Å, DS ´Â ·¹Áö½ºÆ®¸®ÀÇ Runnable ÀνºÅϽºµéÀÇ
setRunnableÀ» Çѹø¾¿ È£ÃâÇÒ °ÍÀÔ´Ï´Ù. ¹®Á¦´Â ¿ì¸®°¡ ¸¸µç Ŭ·¡½º°¡ È¥¶õ½º·¯¿ï¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ÇѰ³ÀÇ Runnable Çʵ带 ¼¼ÆÃÇϴ°ͺ¸´Ù Runnable µéÀ» Ä÷º¼Ç¿¡ ³Ö¾îµÎ´Â°ÍÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¾Æ·¡¿¡ ¾à°£ ¼öÁ¤µÈ ¹öÀüÀÇ Å¬·¡½º°¡ ÀÖ½À´Ï´Ù. ¾Æ·¡ Äڵ带 º¹»çÇØ¼ ÇÁ·ÎÁ§Æ®ÀÇ src Æú´õ¿¡ ºÙ¿©³Ö±â ÇϽǼö ÀÖ½À´Ï´Ù.
package org.example.ds;
import java.util.*;
import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.eclipse.osgi.framework.console.CommandProvider;
public class SampleCommandProvider2 implements CommandProvider {
private List runnables =
Collections.synchronizedList(new ArrayList());
public void addRunnable(Runnable r) {
runnables.add(r);
}
public void removeRunnable(Runnable r) {
runnables.remove(r);
}
public void _runall(CommandInterpreter ci) {
synchronized(runnables) {
for(Runnable r : runnables) {
r.run();
}
}
}
public String getHelp() {
return "\trunall - Run all registered Runnables";
}
}
ÀÚ ÀÌÁ¦
OSGI-INF/commandprovider2.xml ¸¦ ¸¸µé°í ¾Æ·¡¸¦ º¹»çÇÕ´Ï´Ù.
<?xml version="1.0"?>
<component name="commandprovider2">
<implementation class="org.example.ds.SampleCommandProvider2"/>
<service>
<provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
</service>
<reference name="RUNNABLE"
interface="java.lang.Runnable"
bind="addRunnable"
unbind="removeRunnable"
cardinality="0..n"
policy="dynamic"/>
</component>
±×¸®°í ¸¶Áö¸·À¸·Î ÀÌ ÆÄÀÏÀ» manifest ÀÇ
Service-Component Çì´õ¿¡ Ãß°¡ÇÕ´Ï´Ù. ÀÌ·¸°Ô º¸ÀϰÍÀÔ´Ï´Ù.
Service-Component: OSGI-INF/commandprovider1.xml,
OSGI-INF/commandprovider2.xml
ÀÌ ¼±¾ðÀº ¿ì¸®°¡ bind,unbind ¸Þ¼ÒµåÀÇ À̸§À» º¯°æÇϰí, cardinality¸¦ "0..n"À¸·Î º¯°æÇߴٴ°ÍÀ» Á¦¿ÜÇϸé, ÀÌÀü°ú °ÅÀÇ ºñ½ÁÇÕ´Ï´Ù. ½ÇÇè»ï¾Æ ¸î°³ÀÇ Runnable ¼ºñ½ºµéÀ» µî·ÏÇϰí runall ¸í·ÉÀÌ µ¿ÀÛÇÏ´ÂÁö¸¦ »ìÆìº¸¼¼¿ä. ´ÙÀ½À¸·Î ¸¸¾à ¿ì¸®°¡ cardinality ¸¦ "1..n"À¸·Î ¹Ù²Ù¸é ¾î¶»°Ô µÉ±î¿ä ? ¾î¶»°Ô µÉÁö¸¦ Çѹø »ý°¢Çغ¸°í È®ÀÎÇØ º¸¼¼¿ä.
·¹½¼Àº ¿©±â±îÁö ÀÔ´Ï´Ù.
OSGi Alliance Community Event °¡ ´ÙÀ½ÁÖ¿¡ µ¶ÀÏ Munich ¿¡¼ ¿¸°´Ù´Â°ÍÀ» ÀØÁö¸¶¼¼¿ä. ¾ÆÁ÷ µî·ÏÇϱ⿡ ´ÊÁö ¾Ê¾Ò½À´Ï´Ù. °Å±â¼ º¾½Ã´Ù! (¿ªÁÖ: ¿ª½Ã Áö³ª¹ö¸° À̺¥Æ®ÀÔ´Ï´Ù¸¸.. ±×³É ¹ø¿ªÇØ µÓ´Ï´Ù.)
´ñ±Û °¡¹³ÀÌ´Ù...
°¡º¿î ³»¿ëÀ¸·Î Áß°£¿¡ ÇϳªÂë ³Ö¾îÁá¾î¾ß ÇÏÁö ¾Ê¾Ò³Ä..?
³Ê ´ñ±Û ¹«Áö ÁÁ¾ÆÇÑ´Ù¸ç... ¿äÁòÀº ¿ä¸®µµ ¾ÈÇϳÄ?
¤»¤»¤»
´Ù¸¸ ¼Ò½º ºÎºÐ¿¡ <, &rt; °¡ µé¾î°£ ºÎºÐÀÌ Á¤»óÀûÀ¸·Î Ç¥ÇöµÇÁö ¾Ê¾Æ¼ ¸î¸î ¼Ò½ºµéÀº
¿øº» »çÀÌÆ®¸¦ ºÁ¾ß Çϳ׿ä. :)
¿Ö ¼ºñ½º´Â µî·ÏÀÌ µÇ¾úÁö¸¸.. ¿Ö ½ÇÇàÀÌ ¾ÈµÇ´ÂÁö.. ¾ÆÁ÷µµ Çì¸Å°í ÀÖ´ÂÁß ..