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

Initial ABTest Demo

RoundRobin ABTest Group Strategy demo
上级 243c8801
...@@ -2,4 +2,4 @@ package com.dianping.cat.abtest.spi; ...@@ -2,4 +2,4 @@ package com.dianping.cat.abtest.spi;
public interface ABTestGroupStrategy { public interface ABTestGroupStrategy {
public void apply(ABTestContext ctx); 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; package com.dianping.cat.abtest.spi.internal;
import java.io.InputStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -8,8 +7,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; ...@@ -8,8 +7,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import com.dianping.cat.abtest.ABTestId; import com.dianping.cat.abtest.ABTestId;
import com.dianping.cat.abtest.model.entity.Abtest; import com.dianping.cat.abtest.sample.SampleTest.MyABTestId;
import com.dianping.cat.abtest.model.transform.DefaultSaxParser;
import com.dianping.cat.abtest.spi.ABTestEntity; import com.dianping.cat.abtest.spi.ABTestEntity;
import com.dianping.cat.abtest.spi.ABTestEntityManager; import com.dianping.cat.abtest.spi.ABTestEntityManager;
...@@ -31,14 +29,13 @@ public class DefaultABTestEntityManager implements ABTestEntityManager, Initiali ...@@ -31,14 +29,13 @@ public class DefaultABTestEntityManager implements ABTestEntityManager, Initiali
@Override @Override
public void initialize() throws InitializationException { public void initialize() throws InitializationException {
// TODO for test purpose // for test purpose
try { ABTestEntity entity = new ABTestEntity();
InputStream in = getClass().getResourceAsStream("abtest.xml"); entity.setDisabled(false);
Abtest abtest = DefaultSaxParser.parse(in); entity.setId(MyABTestId.CASE1.getValue());
entity.setName("abtest");
entity.setGroupStrategy("roundrobin");
} catch (Exception e) {
throw new InitializationException("Error when loading resource(abtest.xml)", e); m_entities.put(MyABTestId.CASE1.getValue(), entity);
}
} }
} }
...@@ -8,6 +8,8 @@ import org.unidal.lookup.configuration.Component; ...@@ -8,6 +8,8 @@ import org.unidal.lookup.configuration.Component;
import com.dianping.cat.abtest.spi.ABTestContextManager; import com.dianping.cat.abtest.spi.ABTestContextManager;
import com.dianping.cat.abtest.spi.ABTestEntityManager; 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.DefaultABTestContextManager;
import com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager; import com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager;
...@@ -20,6 +22,8 @@ class ABTestComponentConfigurator extends AbstractResourceConfigurator { ...@@ -20,6 +22,8 @@ class ABTestComponentConfigurator extends AbstractResourceConfigurator {
.req(ABTestEntityManager.class)); .req(ABTestEntityManager.class));
all.add(C(ABTestEntityManager.class, DefaultABTestEntityManager.class)); all.add(C(ABTestEntityManager.class, DefaultABTestEntityManager.class));
all.add(C(ABTestGroupStrategy.class,"roundrobin",RoundRobinGroupStrategy.class));
return all; return all;
} }
......
...@@ -315,5 +315,10 @@ ...@@ -315,5 +315,10 @@
<role>com.dianping.cat.abtest.spi.ABTestEntityManager</role> <role>com.dianping.cat.abtest.spi.ABTestEntityManager</role>
<implementation>com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager</implementation> <implementation>com.dianping.cat.abtest.spi.internal.DefaultABTestEntityManager</implementation>
</component> </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> </components>
</plexus> </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.
先完成此消息的编辑!
想要评论请 注册