私は、永続ストレージとしてLDAPサーバを使用するマルチスレッドアプリケーションの開発を進めています。必要なときに私は、LDAPサービスを開始し、停止するには、次のサービスクラスを作成しました:サービスインスタンスをJavaで安全に起動/停止
public class LdapServiceImpl implements LdapService {
public void start() {
if (!isRunning()) {
//Initialize LDAP connection pool
}
}
public void stop() {
if (isRunning()) {
//Release LDAP resources
}
}
private boolean isRunning() {
//What should go in here?
}
}
我々は現在、シングルトンインスタンスとしてサービスの実装を注入するには、Google Guiceのを使用します。
public class ServiceModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides @Singleton
LdapService providesLdapService() {
return new LdapServiceImpl();
}
}
我々ができる方法アプリケーションの起動時に接続プールを設定し、接続で何かを行い、アプリケーションがシャットダウンしたときにリソースを解放してください:
public static void main(String[] args) throws Exception {
Injector injector = Guice.createInjector(new ServiceModule());
Service ldapService = injector.getInstance(LdapService.class));
ldapService.start();
addShutdownHook(ldapService);
//Use connections
}
private static void addShutdownHook(final LdapService service) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
service.stop();
}
});
}
私が直面している問題は、サービスが一度だけ開始/停止されていることを確認したいということです。そのため、サービスの実装に "isRunning()"メソッドを追加しましたが、実装方法はわかりません。
アプリケーションがマルチスレッドであり、サービスインスタンスがシングルトンであることを考慮して、「isRunning()」メソッドを実装する最良の方法は何ですか?
また、これを達成するためのより良い/よりクリーンな方法がありますか?
ありがとうございます。
Typo: 'synchronized'ですが、これはうまくいくはずです。おそらく 'isRunning'メソッドを避けてフラグを直接使うのですが、これは大丈夫です。 –
@KedarMhaswade typoを指摘してくれてありがとう:)そして、isRunningメソッドは完全に冗長です。元の質問の文脈で例を示したかっただけです。 – djmorton