В Java EE, если у меня есть интерфейс:
@Remote
public interface MetaService {
ServiceData get();
}
И у меня в ухе 2 реализации:
@Stateless
public class Service1MetaService implements Calculator {
@Override
public ServiceData get() {...}
}
@Stateless
public class Service2MetaService implements Calculator {
@Override
public ServiceData get() {...}
}
Я могу создать bean, где:
@Stateless
public class View {
@Inject
private Instance<MetaService> metaServices;
...
}
А в View
поле metaServices
будет иметь 2 реализации MetaService
.
Я хотел бы иметь аналогичную функциональность с удаленными bean-компонентами.
Итак, скажем, у меня есть вышеуказанный интерфейс и реализации, но упаковка отличается.
В base.jar
У меня есть интерфейс MetaService
. Это будет упаковано во все последующие приложения, упомянутые ниже.
В a.ear
у меня есть реализация Service1MetaService
, в то время как в b.ear
у меня есть реализация Service2MetaService
и в c.war
у меня есть View
класс, который хотел бы использовать эти реализации.
Но, как и следовало ожидать, введенный Instance
пуст (не ноль). Есть ли способ найти ссылки на удаленный компонент в моем внедренном экземпляре Instance
, даже если эти реализации находятся в отдельных приложениях?
Одна важная вещь заключается в том, что в классе View
я не знаю и не заботятся ни о количестве этих реализаций, ни об именах приложений, в которых они развернуты. Поэтому я не могу использовать указанные строки c JNDI для получения этих ссылок.
PS: Должен ли я попробовать использовать такие технологии, как JMS? Чтобы я вызывал метод add
на прокси-сервере JMS, который отправляет запросы и ждет ответов от всех приложений, реализующих указанный интерфейс?
PS: Чтобы уточнить, причина, по которой мне это нужно, на самом деле чтобы я мог получать данные запущенных сервисов на моих серверах приложений. Я обновил пример интерфейса и реализации, чтобы он был более понятным. Кроме того, было бы неплохо, если бы я мог получать эти метаданные синхронно, поэтому JMS не является предпочтительным, однако я, вероятно, смогу заставить его работать.