2012年12月7日金曜日

JNDIのカスタムPropertyクラス

JNDIに設定を集約できないかと思い、カスタムPropertyクラス作ってみました。

 Jettyを利用している場合、
 xmlのNew要素に指定したclass属性のクラスをnewして、
その子要素のSetに指定した値をname属性と同じ名前のメンバに代入します。

何言ってるかわからんないですね。。つまり、
<New class="org.chikishe.Property.MemcachedProp">
                <Set name="servers">127.0.0.1:8091</Set>
                <Set name="weights" type="java.lang.String" >1</Set>


というxmlは、

MemcachedProp prop = new MemcachedProp();
prop.setServers("127.0.0.1:8091");
prop.setWeights("1"):
 …

というふうに解釈されます。

Memcached-Java-Client用のPropertyクラスを作るとするとこうなります。


MemcahedProp.java:

package org.chikishe.Property;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class MemcachedProp {
    private String[] servers;

    private Integer[] weights;

    private int initConn;

    private int minConn;

    private int maxConn;

    private int maxIdle;

    private int maintSleep;

    private boolean nagle;

    private int socketTO;

    private int socketConnectTO;

    public String[] getServers() {
        return servers;
    }

    public void setServers(String servers) {
        this.servers = servers.split(",");
    }

    public Integer[] getWeights() {
        return weights;
    }

    public void setWeights(String weights) {
        String[] strings = weights.split(",");
        Integer[] ints = new Integer[strings.length];
        for (int i = 0; i < strings.length; i++)
            ints[i] = Integer.parseInt(strings[i]);

        this.weights = ints;
    }

    public int getInitConn() {
        return initConn;
    }

    public void setInitConn(int initConn) {
        this.initConn = initConn;
    }

    public int getMinConn() {
        return minConn;
    }

    public void setMinConn(int minConn) {
        this.minConn = minConn;
    }

    public int getMaxConn() {
        return maxConn;
    }

    public void setMaxConn(int maxConn) {
        this.maxConn = maxConn;
    }

    public int getMaxIdle() {
        return maxIdle;
    }

    public void setMaxIdle(int maxIdle) {
        this.maxIdle = maxIdle;
    }

    public int getMaintSleep() {
        return maintSleep;
    }

    public void setMaintSleep(int maintSleep) {
        this.maintSleep = maintSleep;
    }

    public boolean isNagle() {
        return nagle;
    }

    public void setNagle(boolean nagle) {
        this.nagle = nagle;
    }

    public int getSocketTO() {
        return socketTO;
    }

    public void setSocketTO(int socketTO) {
        this.socketTO = socketTO;
    }

    public int getSocketConnectTO() {
        return socketConnectTO;
    }

    public void setSocketConnectTO(int socketConnectTO) {
        this.socketConnectTO = socketConnectTO;
    }

    public MemcachedProp() {
    }

    public static MemcachedProp getInstance() throws NamingException {

        InitialContext ic = new InitialContext();
        Context envCtx = (Context) ic.lookup("java:comp/env");
        MemcachedProp prop = (MemcachedProp) envCtx.lookup("memcached");
        return prop;
    }

}


jetty-env.xml:

<New id="memcached" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>memcached</Arg>
        <Arg>
            <New class="org.chikishe.Property.MemcachedProp">
                <Set name="servers">127.0.0.1:8091</Set>
                <Set name="weights" type="java.lang.String" >1</Set>
                <Set name="initConn">5</Set>
                <Set name="minConn">5</Set>
                <Set name="maxConn">250</Set>
                <Set name="maxIdle">21600000</Set>
                <Set name="maintSleep">30</Set>
                <Set name="nagle">false</Set>
                <Set name="socketTO">3000</Set>
                <Set name="socketConnectTO">0</Set>
            </New>
        </Arg>
    </New>


web-inf/web.xml :

 <resource-ref>
     <description>Memcached Property</description>
     <res-ref-name>memcached</res-ref-name>
     <res-type>org.chikishe.Property.MemcachedProp</res-type>
     <res-auth>Container</res-auth>
  </resource-ref>



呼び出しはこんなふうになります。

MemcachedProp prop = MemcachedProp.getInstance();

SockIOPool pool = SockIOPool.getInstance();

// set the servers and the weights
pool.setServers(prop.getServers());
pool.setWeights(prop.getWeights());



とりあえず、JNDIに設定をまとめるには使えそうです。
本来はstatic finalにしたいところ。
あと、 Memcached-Java-ClientのJNDI対応まだないんでしょうか?



0 件のコメント: