У нас есть гибридное приложение RCP 3/4 и обработчик, определенный в фрагменте.e4xmi.Eclipse RCP, когда создан Handler?
<fragments xsi:type="fragment:StringModelFragment" xmi:id="_X7-AID93EeKXHI5xGhqnKg" featurename="handlers" parentElementId="org.eclipse.[..].application">
<elements xsi:type="commands:Handler" [..]/>
<elements xsi:type="commands:Handler" xmi:id="_jx8voD93EeKXHI5xGhqnKg" elementId="[..].ui.handler.addToDatabase" contributionURI="bundleclass://[..].ui/[..].ui.handlers.AddToDatabaseHandler" command="_TlV-ID93EeKXHI5xGhqnKg"/>
<elements xsi:type="commands:Handler" [..]/>
public class AddToDatabaseHandler implements EventHandler {
private ISelectionMSD selection;
public AddToDatabaseHandler() {
System.err.println("Created " + this);
}
@Execute
public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part) {
System.err.println(this + ": Execute, selection is " + selection);
if(selection != null) {
// do something
}
}
@Override
public void handleEvent(Event event) {
if(event.getTopic().equals(UPDATE_SELECTION)) {
selection = (ISelectionMSD)event.getProperty(IEvents.PROPERTY_SELECTION);
System.err.println(this + ": Handle event, selection is " + selection);
}
}
}
Я добавил некоторые System.err и я могу видеть, что два экземпляра этого обработчика создаются неявно с помощью DI/отражения.
1) Есть ли легкое объяснение при создании экземпляра этого обработчика?
2) первый созданный экземпляр (справа при запуске платформы) пропускает события, для которых этот класс прослушивает. Поэтому он не добавляется в EventAdmin в качестве прослушивателя событий. Могу ли я отлаживать это как-то?
3) Его кажется мне «волшебным», когда и где и как регистрируется второй класс для прослушивания событий? Это делается где-то на платформе или я просто пропустил часть нашего собственного кода?
Большое спасибо за помощь!
Большое спасибо за подсказку! Я не знаю, как и почему, но используя аннотированный метод, событие правильно обрабатывается в обоих объектах. Я до сих пор не знаю, почему создаются два экземпляра, но, что самое важное, теперь он согласован;) С «гибридом» я имею в виду, что у нас есть фрагмент.4xmi плюс мы используем plugin.xml и точки расширения. – kerner1000
Существует несколько причин, по которым обработчик может быть создан несколько раз, например, если у вас есть обработчик, определенный для части, он будет создан каждый раз, когда будет создана часть. –
Проблема решена. Класс обработчика также был зарегистрирован как служба OSGi (EventHandler) через xml, поэтому два экземпляра. Я реорганизовал его с помощью предложенных аннотаций и удалил определение OSGi Service, которое работает так, как ожидалось. Большое спасибо! – kerner1000