2010年1月20日水曜日

JBoss/JCA/Jackrabbit

JBoss と Jackrabbit の連携 以前、Tomcat から Jackrabbit を使うやり方を調べたが、今度は JBoss で似たような事をやってみる。ここでは リソースアダプタ版の jackrabbit を使って JCA 経由で試してみる。 ■ 使うもの ・JBoss 5.1 GA ・Eclipse 3.5 Galileo ・jackrabbit-jca-1.6.0.rar [download] ■ 準備
  • リポジトリ用のフォルダを作る。ここでは C:/devel/tmp/jackrabbit とした
  • JBoss の lib 下に、jcr-2.0.jar を置く(server/defaultとかの方)
  • JBoss のdeploy 下に jackrabbit-jca-1.6.0.rar をおく
  • 同ディレクトリに以下のファイルを作って、上の rar を使うように JBoss に指示する。
    〔jcr-ds.xml〕
    <?xml version="1.0" encoding="UTF-8"?>
    <connection-factories> 
        <tx-connection-factory>
          <jndi-name>jcr/local</jndi-name> 
          <xa-transaction/>
          <rar-name>jackrabbit-jca-1.6.0.rar</rar-name>
          <connection-definition>javax.jcr.Repository</connection-definition>
          <config-property name="homeDir" type="java.lang.String">C:/devel/tmp/jackrabbit</config-property>
          <config-property name="configFile" type="java.lang.String">classpath:repository.xml</config-property>
          <config-property name="bindSessionToTransaction" type="java.lang.Boolean">true</config-property>
        </tx-connection-factory>
    </connection-factories>
    もともとは ここから落としてきたものを必要箇所修正したもの。JBoss 4x 用のようだけど問題ないらしい。
  • Eclipse で JBoss の Server Runtime と Serverを構成しておく
■ 構築
  • Dynamic Web Project 作成。ここではプロジェクト名=hello-jcr-warとした。
  • [New]/[Other...]/[Servlet] で HelloJcaServlet を作成。
    public class HelloJcaServlet extends HttpServlet {
       private static final long serialVersionUID = 1L;
    
       @Resource(mappedName = "java:jcr/local")
       Repository repo;
    
       protected void doGet(HttpServletRequest request,
             HttpServletResponse response) throws ServletException, IOException {
          Session session = null;
          try {
             session = repo.login(new SimpleCredentials(
                   "username", "password".toCharArray()));
             Node root = session.getRootNode();
    
             if (!root.hasNode("hello/world")) {
                root.addNode("hello").addNode("world")
                   .setProperty("message", "Hello, World!");
                session.save();
             }
             Node node = root.getNode("hello/world");
             response.getWriter().println(
                   node.getProperty("message").getString());
    
          } catch (Exception ex) {
             response.getWriter().println(ex.getMessage());
          } finally {
             if (null != session) session.logout();
          }
       }
    }
■ 実行
  • hello-jcr-war を JBoss サーバにデプロイして起動
  • ブラウザで http://localhost:8080/hello-jcr-war/HelloJcrServlet を開く
  • 「Hello, World!」が表示されるのを確認
■ 補足 @Resource の使用箇所で、本当は mappedName ではなく「@Resource(name="jcr/HelloJCR")」のように論理名にしたかったが、jboss-web.xml や web.xml でマッピングを指定しても効果がなく、どうしても「mappedName じゃなきゃ嫌だ」とJBoss がゴネ続ける。ファイル名をベタ書きしてるみたいな感じでまずい気がするが、未解決。

0 件のコメント:

コメントを投稿