Я играю с компонентами OSGi DS и файлом ConfigurationAdmin.
Я создал простой настраиваемый компонент
@Component(service=ConfigurableService.class)
public class ConfigurableService {
private String message;
@Activate
public void activate(Map<String, Object> params) {
System.out.println("Activate configurable");
message = (String) params.get("msg");
}
@Modified
public void modified(Map<String, Object> params) {
System.out.println("Modify configurable");
message = (String) params.get("msg");
}
@Deactivate
public void deactivate(Map<String, Object> params) {
System.out.println("Deactivate configurable");
message = (String) params.get("msg");
}
public void execute() {
System.out.println("Service says: " + message);
}
}
Затем я создал командный компонент оболочки Felix Gogo для запуска конфигурации через ConfigurationAdmin.
@Component(property = {
CommandProcessor.COMMAND_SCOPE + "=fipro",
CommandProcessor.COMMAND_FUNCTION + "=configure"
},
service = ConfigurationCommand.class
)
public class ConfigurationCommand {
private ConfigurationAdmin cm;
@Reference(unbind="-")
public void setConfigAdmin(ConfigurationAdmin cm) {
this.cm = cm;
}
public void configure(String input) throws IOException {
Configuration config = cm.getConfiguration("org.fipro.osgi.config.ConfigurableService");
Hashtable<String, Object> props = new Hashtable<>();
props.put("msg", input);
config.update(props);
}
}
И, наконец, я создал еще один командный компонент оболочки Felix Gogo, который использует ConfigurableService
@Component(property = {
CommandProcessor.COMMAND_SCOPE + "=fipro",
CommandProcessor.COMMAND_FUNCTION + "=welcome"
},
service = WelcomeCommand.class
)
public class WelcomeCommand {
private ConfigurableService service;
@Reference(unbind="-")
public void setConfigurable(ConfigurableService service) {
this.service = service;
}
public void updatedConfigurable(ConfigurableService service, Map<String, Object> properties) {
System.out.println("ConfigurableService updated");
}
public void welcome() {
service.execute();
}
}
Если я запускаю приложение OSGi с пакетами, содержащими эти компоненты, я ожидаю, что при первоначальном выполнении welcome
я увижу, что компонент активирован, а вывод службы равен нулю, потому что конфигурация еще не применена (убедитесь, что это изменяется при последовательных вызовах) . Если я впоследствии выполню configure Dirk
, я ожидаю, что метод, аннотированный @Modified
, будет выполнен, чтобы указать, что конфигурация службы была обновлена. Я также ожидаю, что метод updatedConfigurable
в WelcomeCommand
будет выполнен. По крайней мере, так я понял, прочитав спецификацию.
Сейчас наблюдаю разное поведение в Equinox и Felix.
Равноденствие:
Модифицированный метод вызывается, как и ожидалось, и ConfigurableService
настроен правильно. Но updatedConfigurable(<Service>, <Map>)
не называется. Только если я изменю сигнатуру метода на ServiceReference
, будет вызван обновленный метод.
В спецификации сказано, что все методы эталонных событий поддерживают следующие сигнатуры методов.
void <method-name>(ServiceReference);
void <method-name>(<parameter-type>);
void <method-name>(<parameter-type>, Map);
Есть ли исключение для обновленного метода, которого я не видел в спецификации, или это проблема в Equinox, из-за которой я должен подать заявку?
Феликс:
Если я запускаю тот же пример на Felix в Bndtools, ни модифицированный, ни метод обновления не вызываются. Я проверил ConfigurationCommand
, и есть доступный ConfigurationAdmin, поэтому нет никаких исключений при обновлении конфигурации. Но он никогда не применяется как-то.
Я что-то упустил при запуске примера на Felix?
Обновление:
Добавление выходных данных консоли к каждому методу события жизненного цикла приводит к следующему результату:
____________________________
Welcome to Apache Felix Gogo
g! ConfigurationCommand: Activate
ConfigurableService: Activate
WelcomeCommand: Activate
welcome
Service says: null
g! configure Dirk
g! welcome
Service says: null
g! exit 0
WelcomeCommand: Deactivate
ConfigurableService: Deactivate
ConfigurationCommand: Deactivate
Как видите, события модификации и обновления никогда не вызываются.