Skip to content

Commit bc70869

Browse files
eranharelMatt Ingenthron
authored andcommitted
Spring FactoryBean support.
Added a Spring FactoryBean for simplifying MemcachedClient creation in a Spring applications. This is a patch for http://code.google.com/p/spymemcached/issues/detail?id=164 Change-Id: Ib4051608631d976487ab8114083f6d32d35258a7 Reviewed-on: http://review.membase.org/4752 Reviewed-by: Matt Ingenthron <[email protected]> Tested-by: Matt Ingenthron <[email protected]>
1 parent b8ae76d commit bc70869

File tree

3 files changed

+185
-1
lines changed

3 files changed

+185
-1
lines changed

buildfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ define "memcached" do
5959
compile.options.target = '1.5'
6060
manifest["Implementation-Vendor"] = COPYRIGHT
6161
compile.with "log4j:log4j:jar:1.2.15", "jmock:jmock:jar:1.2.0",
62-
"junit:junit:jar:4.4"
62+
"junit:junit:jar:4.4", "org.springframework:spring-beans:jar:3.0.3.RELEASE"
6363

6464
# Gen build
6565
gen_build_info "net.spy.memcached", "git"
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package net.spy.memcached.spring;
2+
3+
import java.util.Collection;
4+
5+
import net.spy.memcached.AddrUtil;
6+
import net.spy.memcached.ConnectionFactoryBuilder;
7+
import net.spy.memcached.ConnectionFactoryBuilder.Locator;
8+
import net.spy.memcached.ConnectionFactoryBuilder.Protocol;
9+
import net.spy.memcached.ConnectionObserver;
10+
import net.spy.memcached.FailureMode;
11+
import net.spy.memcached.HashAlgorithm;
12+
import net.spy.memcached.MemcachedClient;
13+
import net.spy.memcached.OperationFactory;
14+
import net.spy.memcached.auth.AuthDescriptor;
15+
import net.spy.memcached.ops.OperationQueueFactory;
16+
import net.spy.memcached.transcoders.Transcoder;
17+
18+
import org.springframework.beans.factory.FactoryBean;
19+
20+
/**
21+
* A Spring {@link FactoryBean} creating {@link MemcachedClient} instances.
22+
* <p>
23+
* Usage example:
24+
* <pre>
25+
* {@code
26+
* <bean id="memcachedClient" class="net.spy.memcached.utils.MemcachedClientFactoryBean">
27+
* <property name="servers" value="${pajamas.remoteHosts}"/>
28+
* <property name="protocol" value="${pajamas.client.protocol}"/>
29+
* <property name="transcoder">
30+
* <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder"/>
31+
* </property>
32+
* <property name="hashAlg" value="${pajamas.client.hashAlg}"/>
33+
* <property name="locatorType" value="${pajamas.client.locatorType}"/>
34+
* </bean>
35+
* }
36+
* </pre>
37+
* </p>
38+
* @author Eran Harel
39+
*/
40+
public class MemcachedClientFactoryBean implements FactoryBean<MemcachedClient> {
41+
private final ConnectionFactoryBuilder connectionFactoryBuilder = new ConnectionFactoryBuilder();
42+
private String servers;
43+
44+
@Override
45+
public MemcachedClient getObject() throws Exception {
46+
return new MemcachedClient(connectionFactoryBuilder.build(), AddrUtil.getAddresses(servers));
47+
}
48+
49+
@Override
50+
public Class<MemcachedClient> getObjectType() {
51+
return MemcachedClient.class;
52+
}
53+
54+
@Override
55+
public boolean isSingleton() {
56+
return true;
57+
}
58+
59+
public void setServers(final String servers) {
60+
this.servers = servers;
61+
}
62+
63+
public void setAuthDescriptor(final AuthDescriptor to) {
64+
connectionFactoryBuilder.setAuthDescriptor(to);
65+
}
66+
67+
public void setDaemon(final boolean d) {
68+
connectionFactoryBuilder.setDaemon(d);
69+
}
70+
71+
public void setFailureMode(final FailureMode fm) {
72+
connectionFactoryBuilder.setFailureMode(fm);
73+
}
74+
75+
public void setHashAlg(final HashAlgorithm to) {
76+
connectionFactoryBuilder.setHashAlg(to);
77+
}
78+
79+
public void setInitialObservers(final Collection<ConnectionObserver> obs) {
80+
connectionFactoryBuilder.setInitialObservers(obs);
81+
}
82+
83+
public void setLocatorType(final Locator l) {
84+
connectionFactoryBuilder.setLocatorType(l);
85+
}
86+
87+
public void setMaxReconnectDelay(final long to) {
88+
connectionFactoryBuilder.setMaxReconnectDelay(to);
89+
}
90+
91+
public void setOpFact(final OperationFactory f) {
92+
connectionFactoryBuilder.setOpFact(f);
93+
}
94+
95+
public void setOpQueueFactory(final OperationQueueFactory q) {
96+
connectionFactoryBuilder.setOpQueueFactory(q);
97+
}
98+
99+
public void setOpQueueMaxBlockTime(final long t) {
100+
connectionFactoryBuilder.setOpQueueMaxBlockTime(t);
101+
}
102+
103+
public void setOpTimeout(final long t) {
104+
connectionFactoryBuilder.setOpTimeout(t);
105+
}
106+
107+
public void setProtocol(final Protocol prot) {
108+
connectionFactoryBuilder.setProtocol(prot);
109+
}
110+
111+
public void setReadBufferSize(final int to) {
112+
connectionFactoryBuilder.setReadBufferSize(to);
113+
}
114+
115+
public void setReadOpQueueFactory(final OperationQueueFactory q) {
116+
connectionFactoryBuilder.setReadOpQueueFactory(q);
117+
}
118+
119+
public void setShouldOptimize(final boolean o) {
120+
connectionFactoryBuilder.setShouldOptimize(o);
121+
}
122+
123+
public void setTimeoutExceptionThreshold(final int to) {
124+
connectionFactoryBuilder.setTimeoutExceptionThreshold(to);
125+
}
126+
127+
public void setTranscoder(final Transcoder<Object> t) {
128+
connectionFactoryBuilder.setTranscoder(t);
129+
}
130+
131+
public void setUseNagleAlgorithm(final boolean to) {
132+
connectionFactoryBuilder.setUseNagleAlgorithm(to);
133+
}
134+
135+
public void setWriteOpQueueFactory(final OperationQueueFactory q) {
136+
connectionFactoryBuilder.setWriteOpQueueFactory(q);
137+
}
138+
139+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package net.spy.memcached.spring;
2+
3+
import junit.framework.Assert;
4+
import junit.framework.TestCase;
5+
import net.spy.memcached.ConnectionFactoryBuilder.Protocol;
6+
import net.spy.memcached.FailureMode;
7+
import net.spy.memcached.HashAlgorithm;
8+
import net.spy.memcached.MemcachedClient;
9+
import net.spy.memcached.transcoders.SerializingTranscoder;
10+
import net.spy.memcached.transcoders.Transcoder;
11+
12+
import org.junit.Test;
13+
14+
/**
15+
* Test cases for the {@link MemcachedClientFactoryBean} implementation.
16+
*
17+
* @author Eran Harel
18+
*/
19+
public class MemcachedClientFactoryBeanTest extends TestCase {
20+
21+
@Test
22+
public void testGetObject() throws Exception {
23+
final MemcachedClientFactoryBean factory = new MemcachedClientFactoryBean();
24+
factory.setDaemon(true);
25+
factory.setFailureMode(FailureMode.Cancel);
26+
factory.setHashAlg(HashAlgorithm.CRC32_HASH);
27+
factory.setProtocol(Protocol.BINARY);
28+
factory.setServers("localhost:22211 localhost:22212");
29+
factory.setShouldOptimize(true);
30+
final Transcoder<Object> transcoder = new SerializingTranscoder();
31+
factory.setTranscoder(transcoder);
32+
33+
final MemcachedClient memcachedClient = factory.getObject();
34+
35+
Assert.assertEquals("deamon", true, memcachedClient.isDaemon());
36+
Assert.assertEquals("servers", 2, memcachedClient.getUnavailableServers().size());
37+
Assert.assertSame("transcoder", transcoder, memcachedClient.getTranscoder());
38+
}
39+
40+
@Test
41+
public void testGetObjectType() {
42+
Assert.assertEquals("object type", MemcachedClient.class, new MemcachedClientFactoryBean().getObjectType());
43+
}
44+
45+
}

0 commit comments

Comments
 (0)