2017-02-07 7 views
0

私はJCRで動作するosgiコンポーネント(CRUDなど)を持っています。Sling/Jackrabbit - リゾルバ/セッションライフタイムとその同時整合性

@Component 
@Service 
public class SomeServiceImpl implements SomeService { 

    @Reference 
    private ResourceResolverFactory resourceResolverFactory; 

    private ResourceResolver resourceResolver; 

    @Activate 
    private void init() { 
     resourceResolver = resourceResolverFactory.getServiceResourceResolver(
       Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, "myService")); 
    } 

    @Override 
    public void serve() { 
     //does something with resourceResolver 
    } 

    @Deactivate 
    private void dispose() { 
     resourceResolver.close(); 
    } 
} 

このサービスが稼動している限り、resourceResolverの新しいインスタンスが作成され、保持されます。時折、このサービスは外部から呼び出されます。

私の質問は以下のとおりです。それは私がかつてresourceResolverを作成し、それを再利用し、正しいアプローチは

  1. ですか?それは絶えずですか?
  2. 基礎となるセッションが期限切れにならないという保証はありますか?
  3. ところでresourceResolverとそのセッションの存続期間と、どこでそれを見ることができますか?
  4. 並行性はどうですか?このサービスは、パラレルにサーバーの場所から呼び出されたと想像してください.Jackrabbitは一貫性を保証していますか?
  5. @Component 
    @Service 
    public class SomeServiceImpl implements SomeService { 
    
        @Reference 
        private SlingRepository slingRepository; 
    
        private Session session; 
    
        @Activate 
        private void init() { 
         session = slingRepository.login(); 
        } 
    
        @Override 
        public void serve() { 
         //does something with session 
        } 
    
        @Deactivate 
        private void dispose() { 
         session.logout(); 
        } 
    } 
    

    (セッション実装と)別のサービスのために同じ質問


可能であれば、いくつかの証拠を見てうれしいです。たぶんドキュメント...

ありがとう。

答えて

3

私は一度resourceResolverを作成して再利用する正しいアプローチですか?それは絶えずですか?

いいえ、そうではありません。それは悪い練習の完全な例です。 resourceResolverの作成は軽量で、必要な数だけ作成できます。 注:使用後は常にresourceResolverを終了する必要がありますが、注意して早期に終了しないでください。

私は基礎となるセッションが期限切れにならないという保証はありますか?

いいえ。 AEMはしばらくして閉鎖されていないセッションを収集しています。

ところでresourceResolverとそのセッションの存続期間と、どこでそれを見ることができますか?

このセッションは、同じリソースへの最初の同時書き込み後に無効になります。 IRLは、競合がなくても変更を保存すると失敗することがあります。

並行性はどうですか?このサービスは、パラレルにサーバーの場所から呼び出されたと想像してください.Jackrabbitは一貫性を保証していますか?

JCRセッションは、1つのセッションの範囲内で同時実行性をサポートしています。主な前提は、常に新しいセッションごとの更新要求を作成することです。

他のサービス(セッションの実装あり)についても同じ質問があります。

ResourceResolverは、Sessionを超えて機能しています。これは単なる高水準のAPIです。

+0

フィードバックに感謝します。 – Alex

+0

ところで、「AEMはしばらくして閉鎖されていないセッションを収集しています」という情報を見つけることができます。 この[記事](http://tech.ethomasjoseph.com/2015/09/sling-who-is-closing-my-jcr-session.html)では、ResourceResolverの基盤となるJCRセッションを閉じるResourceResolverオブジェクトは収集されるガーベジです。あなたは、AEMが閉鎖されたセッションを閉鎖するか、または記事の挙動に言及する実際の仕事をしていることを意味しますか? – Alex

+0

「AEMはしばらくして閉鎖されていないセッションを収集しています」の参照はありますか? ?私はこの製品でそのような機能性を認識していません。 –