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 件のコメント:
コメントを投稿