免责声明:我刚刚开始使用OSGI,所以请耐心等待我和我缺乏知识......
为了本练习,假设我在OSGI环境中有一个基于Jersey(2.17.0)的REST应用程序在Jetty(9.2.10)下运行,该环境为用户提供从单独服务器收集的一些统计信息通过SOAP。
我现在正试图在一个不同的应用程序中重用一些现有代码,这些应用程序应该通过JMS(或其他东西)检索统计信息。
我的目的是在bundle中为客户端API引入一个抽象层,使用适当的通信通道为每个应用程序实现一个bundle,并使用CDI在运行时在我的REST资源中注入客户端。例如:
REST资源(捆绑1,两个应用程序通用)
@Path("statistics")
public class StatisticsResource {
@Inject
private StatisticsClient client;
@GET
@Path("users")
public List<User> getActiveUsers(){
return client.getActiveUsers();
}
}
通用API (捆绑2,两个应用程序通用)
public interface StatisticsClient {
List<User> getActiveUsers();
}
SOAP实施(应用1的捆绑3)
@ApplicationScoped
public class SOAPClient implements StatisticsClient {
@Override
public List<User> getActiveUsers() {
// connect to server via SOAP
}
}
JMS实施(应用2的捆绑3)
@ApplicationScoped
public class JMSClient implements StatisticsClient {
@Override
public List<User> getActiveUsers() {
// connect to server via JMS
}
}
我一直在阅读和搜索有关如何使用Jersey,HK2(2.4.0)和OSGI注射的信息,但到目前为止,我还没有找到符合上述想法的相关内容。
我到目前为止看到的大多数Jersey CDI注入examples,使用具体类定义绑定,例如bind(MyService.class).to(MyService.class);
,而我希望能够在运行时切换实现并使用其中任何一个SOAPClient
或JMSClient
取决于当前运行代码的应用程序。理想情况下,框架将从可用的OSGI服务(或类似路径或类似的东西)推断/检测实现......
这是可行的,如果是的话,我错过了什么? 或者基本概念我可能误解或错过了什么?
答案 0 :(得分:0)
您可以将简单的EJB与CDI生产者一起使用(生产者注入bean,或根据某些条件产生要注入的bean实例)。
伪代码:
public interface Service;
@Stateless
@ServiceImplementation(A) //Qualifier *
public class ServiceImplA implements Service{
//impl code
}
@Stateless
@ServiceImplementation(B) //Qualifier *
public class ServiceImplB implements Service{
// impl code
}
@Produces
@ApplicationScoped
public Service produceServiceInstances(){
if(condition)
return ServiceImplA
else
return ServiceImplB
}
检查此链接https://docs.oracle.com/javaee/7/tutorial/cdi-adv003.htm