提交 a69643be 编写于 作者: D damon.zhu

Initial ABTest Demo

RoundRobin ABTest Group Strategy demo
上级 243c8801
......@@ -2,4 +2,4 @@ package com.dianping.cat.abtest.spi;
public interface ABTestGroupStrategy {
public void apply(ABTestContext ctx);
}
}
\ No newline at end of file
package com.dianping.cat.abtest.spi;
import java.util.concurrent.atomic.AtomicInteger;
public class RoundRobinGroupStrategy implements ABTestGroupStrategy {
private AtomicInteger m_pvCounter = new AtomicInteger();
@Override
public void apply(ABTestContext ctx) {
System.out.println(m_pvCounter.get());
if (m_pvCounter.incrementAndGet() % 2 == 0) {
ctx.setGroupName("A");
} else {
ctx.setGroupName("B");
}
}
}
package com.dianping.cat.abtest.spi.internal;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
......@@ -8,8 +7,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import com.dianping.cat.abtest.ABTestId;
import com.dianping.cat.abtest.model.entity.Abtest;
import com.dianping.cat.abtest.model.transform.DefaultSaxParser;
import com.dianping.cat.abtest.sample.SampleTest.MyABTestId;
import com.dianping.cat.abtest.spi.ABTestEntity;
import com.dianping.cat.abtest.spi.ABTestEntityManager;
......@@ -31,14 +29,13 @@ public class DefaultABTestEntityManager implements ABTestEntityManager, Initiali
@Override
public void initialize() throws InitializationException {
// TODO for test purpose
try {
InputStream in = getClass().getResourceAsStream("abtest.xml");
Abtest abtest = DefaultSaxParser.parse(in);
} catch (Exception e) {
throw new InitializationException("Error when loading resource(abtest.xml)", e);
}
// for test purpose
ABTestEntity entity = new ABTestEntity();
entity.setDisabled(false);
entity.setId(MyABTestId.CASE1.getValue());
entity.setName("abtest");
entity.setGroupStrategy("roundrobin");
m_entities.put(MyABTestId.CASE1.getValue(), entity);
}
}
......@@ -8,6 +8,8 @@ import org.unidal.lookup.configuration.Component;
import com.dianping.cat.abtest.spi.ABTestContextManager;
import com.dianping.cat.abtest.spi.ABTestEntityManager;
import com.dianping.cat.abtest.spi.ABTestGroupStrategy;
import com.dianping.cat.abtest.spi.RoundRobinGroupStrategy;
import com.dianping.cat.abtest.spi.internal.DefaultABTestContextManager;
import com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager;
......@@ -20,6 +22,8 @@ class ABTestComponentConfigurator extends AbstractResourceConfigurator {
.req(ABTestEntityManager.class));
all.add(C(ABTestEntityManager.class, DefaultABTestEntityManager.class));
all.add(C(ABTestGroupStrategy.class,"roundrobin",RoundRobinGroupStrategy.class));
return all;
}
......
......@@ -315,5 +315,10 @@
<role>com.dianping.cat.abtest.spi.ABTestEntityManager</role>
<implementation>com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager</implementation>
</component>
<component>
<role>com.dianping.cat.abtest.spi.ABTestGroupStrategy</role>
<role-hint>roundrobin</role-hint>
<implementation>com.dianping.cat.abtest.spi.RoundRobinGroupStrategy</implementation>
</component>
</components>
</plexus>
package com.dianping.cat.abtest;
import java.io.File;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import org.unidal.test.jetty.JettyServer;
import com.dianping.cat.Cat;
import com.dianping.cat.servlet.CatFilter;
@RunWith(JUnit4.class)
public class ABTestServer extends JettyServer {
@Test
public void startWebApp() throws Exception {
File file = new File("/data/appdatas/cat/client.xml");
Cat.initialize(file);
Server server = new Server(getServerPort());
Context root = new Context(server, "/", Context.SESSIONS);
root.addFilter(CatFilter.class, "/*", Handler.REQUEST | Handler.FORWARD);
root.addServlet(new ServletHolder(SimpleRoundRobinWebPage.class), "/abtest");
// server.setHandler(root);
server.start();
// open the page in the default browser
display("/abtest");
waitForAnyKey();
}
@Override
protected int getServerPort() {
return 8081;
}
@Override
protected String getContextPath() {
// TODO Auto-generated method stub
return null;
}
}
package com.dianping.cat.abtest;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dianping.cat.abtest.sample.SampleTest.MyABTestId;
public class SimpleRoundRobinWebPage extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = -6472784609174835547L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ABTest abtest = ABTestManager.getTest(MyABTestId.CASE1);
if (abtest.isGroupA()) {
String a = "This is group A";
byte[] aByte = a.getBytes();
response.getOutputStream().write(aByte);
// Cat.logMetric(...);
} else if (abtest.isGroupB()) {
String b = "This is group B";
byte[] bByte = b.getBytes();
response.getOutputStream().write(bByte);
// Cat.logMetric(...);
} else {
String b = "This is group dfault";
byte[] bByte = b.getBytes();
response.getOutputStream().write(bByte);
// Cat.logMetric(...);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册