提交 12be05d2 编写于 作者: A ainilife

Refactor the abtest code.

上级 e8cc87bd
......@@ -4,8 +4,7 @@ import com.dianping.cat.abtest.model.entity.Field;
import com.dianping.cat.abtest.model.entity.GroupstrategyDescriptor;
import com.dianping.cat.abtest.spi.ABTestGroupStrategy;
public class FieldInjectUtil {
public class FieldInjecter {
public void inject(ABTestGroupStrategy targetGroupStrategy, GroupstrategyDescriptor descriptor) throws Exception {
for (Field field : descriptor.getFields()) {
java.lang.reflect.Field modifiersField = targetGroupStrategy.getClass().getDeclaredField(
......
package com.dianping.cat.abtest.repository;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
......@@ -29,6 +30,7 @@ import com.dianping.cat.abtest.spi.ABTestEntity;
import com.dianping.cat.abtest.spi.ABTestGroupStrategy;
import com.dianping.cat.configuration.ClientConfigManager;
import com.dianping.cat.configuration.client.entity.Server;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
public class HttpABTestEntityRepository extends ContainerHolder implements ABTestEntityRepository, Initializable, Task {
......@@ -39,15 +41,15 @@ public class HttpABTestEntityRepository extends ContainerHolder implements ABTes
@Inject
private int m_refreshTimeInSeconds = 60; // seconds
private Map<String, ABTestEntity> m_entities = new ConcurrentHashMap<String, ABTestEntity>();
private Map<String, ABTestEntity> m_entities = new HashMap<String, ABTestEntity>();
private Set<String> m_activeRuns = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
private Set<String> m_activeRuns = new HashSet<String>();
private Map<Integer, ABTestGroupStrategy> m_strategies = new ConcurrentHashMap<Integer, ABTestGroupStrategy>();
private Map<Integer, Invocable> m_invokeMap = new ConcurrentHashMap<Integer, Invocable>();
private FieldInjectUtil m_fieldInjector = new FieldInjectUtil();
private FieldInjecter m_fieldInjector = new FieldInjecter();
private ScriptEngineManager m_mgr;
......@@ -105,6 +107,8 @@ public class HttpABTestEntityRepository extends ContainerHolder implements ABTes
m_abtestModel = abtest.toString();
break;
}
t.setStatus(Message.SUCCESS);
} catch (Throwable e) {
t.setStatus(e);
Cat.logError(e);
......@@ -140,9 +144,9 @@ public class HttpABTestEntityRepository extends ContainerHolder implements ABTes
class ABTestVisitor extends BaseVisitor {
private String m_domain;
private Map<String, ABTestEntity> m_entities;
private Map<String, ABTestEntity> m_entities = new HashMap<String, ABTestEntity>();
private Set<String> m_activeRuns;
private Set<String> m_activeRuns = new HashSet<String>();
public ABTestVisitor(String domain) {
m_domain = domain;
......@@ -217,7 +221,7 @@ public class HttpABTestEntityRepository extends ContainerHolder implements ABTes
}
}
public String getAbtestModel() {
public synchronized String getAbtestModel() {
return m_abtestModel;
}
......
......@@ -19,15 +19,15 @@ public class ABTestEntity {
private Run m_run;
private String m_groupStrategyName;
private ABTestGroupStrategy m_groupStrategy;
private Invocable m_invocable;
private MessageManager m_messageManager;
private ABTestCodec m_cookieCodec;
private String m_groupStrategyName;
private ABTestCodec m_cookieCodec;
public ABTestEntity() {
m_run = new Run();
......@@ -40,38 +40,6 @@ public class ABTestEntity {
m_run = run;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ABTestEntity other = (ABTestEntity) obj;
if (m_groupStrategy == null) {
if (other.m_groupStrategy != null)
return false;
} else if (!m_groupStrategy.equals(other.m_groupStrategy))
return false;
if (m_groupStrategyName == null) {
if (other.m_groupStrategyName != null)
return false;
} else if (!m_groupStrategyName.equals(other.m_groupStrategyName))
return false;
if (m_name == null) {
if (other.m_name != null)
return false;
} else if (!m_name.equals(other.m_name))
return false;
if (m_run == null) {
if (other.m_run != null)
return false;
} else if (!m_run.equals(other.m_run))
return false;
return true;
}
public List<Condition> getConditions() {
return m_run.getConditions() != null ? m_run.getConditions() : null;
}
......@@ -85,8 +53,8 @@ public class ABTestEntity {
}
public ABTestCodec getCookieCodec() {
return m_cookieCodec;
}
return m_cookieCodec;
}
public Date getEndDate() {
return m_run.getEndDate();
......@@ -105,12 +73,12 @@ public class ABTestEntity {
}
public Invocable getInvocable() {
return m_invocable;
}
return m_invocable;
}
public MessageManager getMessageManager() {
return m_messageManager;
}
return m_messageManager;
}
public String getName() {
return m_name;
......@@ -124,17 +92,6 @@ public class ABTestEntity {
return m_run.getStartDate();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((m_groupStrategy == null) ? 0 : m_groupStrategy.hashCode());
result = prime * result + ((m_groupStrategyName == null) ? 0 : m_groupStrategyName.hashCode());
result = prime * result + ((m_name == null) ? 0 : m_name.hashCode());
result = prime * result + ((m_run == null) ? 0 : m_run.hashCode());
return result;
}
public boolean isDisabled() {
return m_run.isDisabled();
}
......@@ -162,8 +119,8 @@ public class ABTestEntity {
}
public void setCookieCodec(ABTestCodec cookieCodec) {
m_cookieCodec = cookieCodec;
}
m_cookieCodec = cookieCodec;
}
public void setDisabled(boolean disabled) {
m_run.setDisabled(disabled);
......@@ -174,12 +131,12 @@ public class ABTestEntity {
}
public void setInvocable(Invocable invocable) {
m_invocable = invocable;
}
m_invocable = invocable;
}
public void setMessageManager(MessageManager messageManager) {
m_messageManager = messageManager;
}
m_messageManager = messageManager;
}
public void setName(String name) {
m_name = name;
......
package com.dianping.cat.abtest.spi;
public interface ABTestGroupStrategy {
public void apply(ABTestContext ctx);
public void init();
public void apply(ABTestContext ctx);
}
\ No newline at end of file
......@@ -104,15 +104,16 @@ public class DefaultABTestContext implements ABTestContext {
if (inv != null && m_entity.isEligible(new Date())) {
boolean isAccept = false;
Transaction t = Cat.newTransaction("GroupStrategy", m_entity.getGroupStrategyName());
Transaction t = Cat.newTransaction("ABTest-GroupStrategy", m_entity.getGroupStrategyName());
try {
isAccept = (Boolean) inv.invokeFunction("isEligible", request);
if (isAccept) {
m_groupStrategy.apply(this);
t.setStatus(Message.SUCCESS);
}
t.setStatus(Message.SUCCESS);
} catch (Throwable e) {
t.setStatus(e);
Cat.logError(e);
......
......@@ -296,7 +296,7 @@ CREATE TABLE `abtest` (
`description` varchar(512) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `abtest_report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册