我正在尝试使用OSGI实现某种微服务架构。 我有UserDAO包,该包从另一个包(连接器)中的连接池中获得连接。 它们与OSGI服务API绑定。问题是:
1)我应该将接口(IConnector)注册为该接口(连接器)的服务还是实现:
serviceRegistration = bundleContext.registerService(IConnector.class.getName(), new Connector(), null);
VS
serviceRegistration = bundleContext.registerService(Connector.class.getName(), new Connector(), null);
这两个变体都可以正常工作。如果我注册IConnector(接口),我将对其进行跟踪:
userDBConnectorTracker = new ServiceTracker(context, IConnector.class.getName(), this);
如果我注册连接器(IConnector的实现),则采用相同的方式:
userDBConnectorTracker = new ServiceTracker(context, Connector.class.getName(), this);
2)我想使用DBCP或HikariCP,但是所有带有它们的示例都使用没有接口的静态方法,例如:
public class HikariCPDataSource {
private static HikariConfig config = new HikariConfig();
private static HikariDataSource ds;
static {
config.setJdbcUrl("jdbc:h2:mem:test");
config.setUsername("user");
config.setPassword("password");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
ds = new HikariDataSource(config);
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
private HikariCPDataSource(){}
}
我已经尝试过了。但是然后,我也需要将接口的方法也更改为静态方法,作为一种实现方法:
我不能使用它,因为如果我将连接器类的接口注册为服务,则会导致错误“不允许在接口中使用静态方法”。
我应该从Connector类的所有方法中删除静态方法吗? 为什么每个人都在连接池中使用静态?
答案 0 :(得分:1)
对于OSGi服务,通常应使用一个界面来宣布它。这样,服务的用户就不会绑定到您的实现类。
在OSGi中,使用静态方法返回连接通常不是一个好主意。您将要使用OSGi配置来提供数据源的配置。这些配置在运行时提供,甚至可以在运行时消失。因此,您需要以某种方式实现此功能以应对配置或配置更改。
一种好的做法是,在配置管理员为您提供配置后,为连接提供工厂服务,并在配置消失后删除该服务。
使用普通的OSGi API进行所有操作非常麻烦。尝试避免手动注册服务以及使用服务跟踪器。两种API均难以正确使用。而是使用诸如声明式服务之类的依赖项注入框架。
您管理数据源和池的情况特别复杂。您不应该自己这样做。现有两个项目已经可以满足您的需求。
由于您的问题建议您尝试在OSGi上构建微服务,因此我也推荐enroute microservice tutorial。它包含一个使用事务控制的示例。