remove the bug while using threadPool

This commit is contained in:
coderfengyun 2014-01-08 11:38:05 +08:00
parent bddf2b538e
commit 540ffeac25
3 changed files with 530 additions and 524 deletions

View File

@ -1,239 +1,244 @@
package org.bench4q.agent.api;
import java.io.ByteArrayOutputStream;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.apache.log4j.Logger;
import org.bench4q.agent.datacollector.impl.BehaviorStatusCodeResult;
import org.bench4q.agent.scenario.Scenario;
import org.bench4q.agent.scenario.ScenarioContext;
import org.bench4q.agent.scenario.ScenarioEngine;
import org.bench4q.agent.scenario.behavior.Behavior;
import org.bench4q.share.models.agent.BehaviorBriefModel;
import org.bench4q.share.models.agent.BehaviorStatusCodeResultModel;
import org.bench4q.share.models.agent.CleanTestResultModel;
import org.bench4q.share.models.agent.RunScenarioModel;
import org.bench4q.share.models.agent.RunScenarioResultModel;
import org.bench4q.share.models.agent.StopTestModel;
import org.bench4q.share.models.agent.statistics.AgentBriefStatusModel;
import org.bench4q.share.models.agent.statistics.AgentBehaviorsBriefModel;
import org.bench4q.share.models.agent.statistics.AgentPageBriefModel;
import org.bench4q.share.models.agent.statistics.AgentPagesBriefModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/test")
public class TestController {
private ScenarioEngine scenarioEngine;
private Logger logger = Logger.getLogger(TestController.class);
private Logger getLogger() {
return logger;
}
private ScenarioEngine getScenarioEngine() {
return scenarioEngine;
}
@Autowired
private void setScenarioEngine(ScenarioEngine scenarioEngine) {
this.scenarioEngine = scenarioEngine;
}
@RequestMapping(value = "/run", method = RequestMethod.POST)
@ResponseBody
public RunScenarioResultModel run(
@RequestBody RunScenarioModel runScenarioModel)
throws UnknownHostException {
// Scenario scenario = extractScenario(runScenarioModel);
Scenario scenario = Scenario.scenarioBuilder(runScenarioModel);
UUID runId = UUID.randomUUID();
System.out.println(runScenarioModel.getPoolSize());
this.getLogger().info(marshalRunScenarioModel(runScenarioModel));
this.getScenarioEngine().runScenario(runId, scenario,
runScenarioModel.getPoolSize());
RunScenarioResultModel runScenarioResultModel = new RunScenarioResultModel();
runScenarioResultModel.setRunId(runId);
return runScenarioResultModel;
}
private String marshalRunScenarioModel(RunScenarioModel inModel) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Marshaller marshaller;
try {
marshaller = JAXBContext.newInstance(RunScenarioModel.class)
.createMarshaller();
marshaller.marshal(inModel, outputStream);
return outputStream.toString();
} catch (JAXBException e) {
return "exception in marshal";
}
}
@RequestMapping(value = "/brief/{runId}/{behaviorId}", method = RequestMethod.GET)
@ResponseBody
public BehaviorBriefModel behaviorBrief(@PathVariable UUID runId,
@PathVariable int behaviorId) {
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null) {
return null;
}
Map<Integer, BehaviorStatusCodeResult> map = scenarioContext
.getDataStatistics().getBehaviorBriefStatistics(behaviorId);
return buildBehaviorBrief(runId, behaviorId, "", map);
}
private BehaviorBriefModel buildBehaviorBrief(UUID runId, int behaviorId,
String behaviorUrl, Map<Integer, BehaviorStatusCodeResult> map) {
List<BehaviorStatusCodeResultModel> detailStatusCodeResultModels = new ArrayList<BehaviorStatusCodeResultModel>();
for (int statusCode : map.keySet()) {
BehaviorStatusCodeResultModel behaviorStatusCodeResultModel = new BehaviorStatusCodeResultModel();
BehaviorStatusCodeResult detailStatusCodeResult = map
.get(statusCode);
behaviorStatusCodeResultModel.setStatusCode(statusCode);
behaviorStatusCodeResultModel
.setCount(detailStatusCodeResult.count);
behaviorStatusCodeResultModel
.setContentLength(detailStatusCodeResult.contentLength);
behaviorStatusCodeResultModel
.setMinResponseTime(detailStatusCodeResult.minResponseTime);
behaviorStatusCodeResultModel
.setMaxResponseTime(detailStatusCodeResult.maxResponseTime);
behaviorStatusCodeResultModel
.setContentType(detailStatusCodeResult.contentType);
behaviorStatusCodeResultModel
.setTotalResponseTimeThisTime(detailStatusCodeResult.totalResponseTimeThisTime);
detailStatusCodeResultModels.add(behaviorStatusCodeResultModel);
}
BehaviorBriefModel behaviorBriefModel = new BehaviorBriefModel();
behaviorBriefModel.setBehaviorId(behaviorId);
behaviorBriefModel
.setDetailStatusCodeResultModels(detailStatusCodeResultModels);
behaviorBriefModel.setBehaviorUrl(behaviorUrl);
return behaviorBriefModel;
}
@RequestMapping(value = "/pagesBrief/{runId}")
@ResponseBody
public AgentPagesBriefModel pagesBrief(@PathVariable UUID runId) {
ScenarioContext context = this.getScenarioEngine().getRunningTests()
.get(runId);
AgentPagesBriefModel result = new AgentPagesBriefModel();
List<AgentPageBriefModel> pageBrieves = new ArrayList<AgentPageBriefModel>();
if (context == null || context.isFinished()) {
return null;
}
for (int i = 0; i < context.getScenario().getPages().length; i++) {
pageBrieves.add((AgentPageBriefModel) context.getDataStatistics()
.getPageBriefStatistics(i));
}
result.setPageBriefModels(pageBrieves);
return result;
}
@RequestMapping(value = "/pageBrief/{runId}/{pageId}")
@ResponseBody
public AgentPageBriefModel pageBrief(@PathVariable UUID runId,
@PathVariable int pageId) {
ScenarioContext context = this.getScenarioEngine().getRunningTests()
.get(runId);
if (context == null || context.isFinished()) {
return null;
}
return (AgentPageBriefModel) context.getDataStatistics()
.getPageBriefStatistics(pageId);
}
@RequestMapping(value = "/behaviorsBrief/{runId}")
@ResponseBody
public AgentBehaviorsBriefModel behaviorsBrief(@PathVariable UUID runId) {
AgentBehaviorsBriefModel ret = new AgentBehaviorsBriefModel();
List<BehaviorBriefModel> behaviorBriefModels = new ArrayList<BehaviorBriefModel>();
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null || scenarioContext.isFinished()) {
return null;
}
for (Behavior behavior : scenarioContext.getScenario()
.getAllBehaviorsInScenario()) {
int behaviorId = behavior.getId();
Map<Integer, BehaviorStatusCodeResult> map = behavior
.getBehaviorBriefResult(scenarioContext.getDataStatistics());
if (map == null) {
continue;
}
behaviorBriefModels.add(buildBehaviorBrief(runId, behaviorId,
behavior.getUrl(), map));
}
ret.setBehaviorBriefModels(behaviorBriefModels);
return ret;
}
@RequestMapping(value = "/brief/{runId}", method = RequestMethod.GET)
@ResponseBody
public AgentBriefStatusModel brief(@PathVariable UUID runId) {
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null) {
return null;
}
AgentBriefStatusModel agentStatusModel = (AgentBriefStatusModel) scenarioContext
.getDataStatistics().getScenarioBriefStatistics();
agentStatusModel.setvUserCount(scenarioContext.getExecutor()
.getActiveCount());
return agentStatusModel;
}
@RequestMapping(value = "/stop/{runId}", method = { RequestMethod.GET,
RequestMethod.POST })
@ResponseBody
public StopTestModel stop(@PathVariable UUID runId) {
System.out.println("stop method");
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null) {
return null;
}
scenarioContext.setEndDate(new Date(System.currentTimeMillis()));
scenarioContext.getExecutor().shutdownNow();
scenarioContext.setFinished(true);
StopTestModel stopTestModel = new StopTestModel();
stopTestModel.setSuccess(true);
clean(runId);
return stopTestModel;
}
@RequestMapping(value = "/clean/{runId}", method = RequestMethod.GET)
@ResponseBody
public CleanTestResultModel clean(@PathVariable UUID runId) {
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null) {
return null;
}
scenarioContext.getExecutor().shutdownNow();
this.getScenarioEngine().getRunningTests().remove(runId);
System.gc();
CleanTestResultModel cleanTestResultModel = new CleanTestResultModel();
cleanTestResultModel.setSuccess(true);
return cleanTestResultModel;
}
}
package org.bench4q.agent.api;
import java.io.ByteArrayOutputStream;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.apache.log4j.Logger;
import org.bench4q.agent.datacollector.impl.BehaviorStatusCodeResult;
import org.bench4q.agent.scenario.Scenario;
import org.bench4q.agent.scenario.ScenarioContext;
import org.bench4q.agent.scenario.ScenarioEngine;
import org.bench4q.agent.scenario.behavior.Behavior;
import org.bench4q.share.models.agent.BehaviorBriefModel;
import org.bench4q.share.models.agent.BehaviorStatusCodeResultModel;
import org.bench4q.share.models.agent.CleanTestResultModel;
import org.bench4q.share.models.agent.RunScenarioModel;
import org.bench4q.share.models.agent.RunScenarioResultModel;
import org.bench4q.share.models.agent.StopTestModel;
import org.bench4q.share.models.agent.statistics.AgentBriefStatusModel;
import org.bench4q.share.models.agent.statistics.AgentBehaviorsBriefModel;
import org.bench4q.share.models.agent.statistics.AgentPageBriefModel;
import org.bench4q.share.models.agent.statistics.AgentPagesBriefModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/test")
public class TestController {
private ScenarioEngine scenarioEngine;
private Logger logger = Logger.getLogger(TestController.class);
private Logger getLogger() {
return logger;
}
private ScenarioEngine getScenarioEngine() {
return scenarioEngine;
}
@Autowired
private void setScenarioEngine(ScenarioEngine scenarioEngine) {
this.scenarioEngine = scenarioEngine;
}
@RequestMapping(value = "/run", method = RequestMethod.POST)
@ResponseBody
public RunScenarioResultModel run(
@RequestBody RunScenarioModel runScenarioModel)
throws UnknownHostException {
// Scenario scenario = extractScenario(runScenarioModel);
Scenario scenario = Scenario.scenarioBuilder(runScenarioModel);
UUID runId = UUID.randomUUID();
System.out.println(runScenarioModel.getPoolSize());
this.getLogger().info(marshalRunScenarioModel(runScenarioModel));
this.getScenarioEngine().runScenario(runId, scenario,
runScenarioModel.getPoolSize());
RunScenarioResultModel runScenarioResultModel = new RunScenarioResultModel();
runScenarioResultModel.setRunId(runId);
return runScenarioResultModel;
}
private String marshalRunScenarioModel(RunScenarioModel inModel) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Marshaller marshaller;
try {
marshaller = JAXBContext.newInstance(RunScenarioModel.class)
.createMarshaller();
marshaller.marshal(inModel, outputStream);
return outputStream.toString();
} catch (JAXBException e) {
return "exception in marshal";
}
}
@RequestMapping(value = "/brief/{runId}/{behaviorId}", method = RequestMethod.GET)
@ResponseBody
public BehaviorBriefModel behaviorBrief(@PathVariable UUID runId,
@PathVariable int behaviorId) {
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null) {
return null;
}
Map<Integer, BehaviorStatusCodeResult> map = scenarioContext
.getDataStatistics().getBehaviorBriefStatistics(behaviorId);
return buildBehaviorBrief(runId, behaviorId, "", map);
}
private BehaviorBriefModel buildBehaviorBrief(UUID runId, int behaviorId,
String behaviorUrl, Map<Integer, BehaviorStatusCodeResult> map) {
List<BehaviorStatusCodeResultModel> detailStatusCodeResultModels = new ArrayList<BehaviorStatusCodeResultModel>();
for (int statusCode : map.keySet()) {
BehaviorStatusCodeResultModel behaviorStatusCodeResultModel = new BehaviorStatusCodeResultModel();
BehaviorStatusCodeResult detailStatusCodeResult = map
.get(statusCode);
behaviorStatusCodeResultModel.setStatusCode(statusCode);
behaviorStatusCodeResultModel
.setCount(detailStatusCodeResult.count);
behaviorStatusCodeResultModel
.setContentLength(detailStatusCodeResult.contentLength);
behaviorStatusCodeResultModel
.setMinResponseTime(detailStatusCodeResult.minResponseTime);
behaviorStatusCodeResultModel
.setMaxResponseTime(detailStatusCodeResult.maxResponseTime);
behaviorStatusCodeResultModel
.setContentType(detailStatusCodeResult.contentType);
behaviorStatusCodeResultModel
.setTotalResponseTimeThisTime(detailStatusCodeResult.totalResponseTimeThisTime);
detailStatusCodeResultModels.add(behaviorStatusCodeResultModel);
}
BehaviorBriefModel behaviorBriefModel = new BehaviorBriefModel();
behaviorBriefModel.setBehaviorId(behaviorId);
behaviorBriefModel
.setDetailStatusCodeResultModels(detailStatusCodeResultModels);
behaviorBriefModel.setBehaviorUrl(behaviorUrl);
return behaviorBriefModel;
}
@RequestMapping(value = "/pagesBrief/{runId}")
@ResponseBody
public AgentPagesBriefModel pagesBrief(@PathVariable UUID runId) {
ScenarioContext context = this.getScenarioEngine().getRunningTests()
.get(runId);
AgentPagesBriefModel result = new AgentPagesBriefModel();
List<AgentPageBriefModel> pageBrieves = new ArrayList<AgentPageBriefModel>();
if (context == null || context.isFinished()) {
return null;
}
for (int i = 0; i < context.getScenario().getPages().length; i++) {
pageBrieves.add((AgentPageBriefModel) context.getDataStatistics()
.getPageBriefStatistics(i));
}
result.setPageBriefModels(pageBrieves);
return result;
}
@RequestMapping(value = "/pageBrief/{runId}/{pageId}")
@ResponseBody
public AgentPageBriefModel pageBrief(@PathVariable UUID runId,
@PathVariable int pageId) {
ScenarioContext context = this.getScenarioEngine().getRunningTests()
.get(runId);
if (context == null || context.isFinished()) {
return null;
}
return (AgentPageBriefModel) context.getDataStatistics()
.getPageBriefStatistics(pageId);
}
@RequestMapping(value = "/behaviorsBrief/{runId}")
@ResponseBody
public AgentBehaviorsBriefModel behaviorsBrief(@PathVariable UUID runId) {
AgentBehaviorsBriefModel ret = new AgentBehaviorsBriefModel();
List<BehaviorBriefModel> behaviorBriefModels = new ArrayList<BehaviorBriefModel>();
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null || scenarioContext.isFinished()) {
return null;
}
for (Behavior behavior : scenarioContext.getScenario()
.getAllBehaviorsInScenario()) {
int behaviorId = behavior.getId();
Map<Integer, BehaviorStatusCodeResult> map = behavior
.getBehaviorBriefResult(scenarioContext.getDataStatistics());
if (map == null) {
continue;
}
behaviorBriefModels.add(buildBehaviorBrief(runId, behaviorId,
behavior.getUrl(), map));
}
ret.setBehaviorBriefModels(behaviorBriefModels);
return ret;
}
@RequestMapping(value = "/brief/{runId}", method = RequestMethod.GET)
@ResponseBody
public AgentBriefStatusModel brief(@PathVariable UUID runId) {
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null) {
return null;
}
AgentBriefStatusModel agentStatusModel = (AgentBriefStatusModel) scenarioContext
.getDataStatistics().getScenarioBriefStatistics();
agentStatusModel.setvUserCount(scenarioContext.getExecutor()
.getActiveCount());
return agentStatusModel;
}
@RequestMapping(value = "/stop/{runId}", method = { RequestMethod.GET,
RequestMethod.POST })
@ResponseBody
public StopTestModel stop(@PathVariable UUID runId) {
System.out.println("stop method");
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null) {
return null;
}
scenarioContext.setEndDate(new Date(System.currentTimeMillis()));
System.out.println("when before stop, classId:"
+ scenarioContext.getExecutor().toString());
scenarioContext.getExecutor().shutdown();
scenarioContext.getExecutor().shutdownNow();
System.out.println("when after stop, classId:"
+ scenarioContext.getExecutor().toString());
scenarioContext.setFinished(true);
StopTestModel stopTestModel = new StopTestModel();
stopTestModel.setSuccess(true);
clean(runId);
return stopTestModel;
}
@RequestMapping(value = "/clean/{runId}", method = RequestMethod.GET)
@ResponseBody
public CleanTestResultModel clean(@PathVariable UUID runId) {
ScenarioContext scenarioContext = this.getScenarioEngine()
.getRunningTests().get(runId);
if (scenarioContext == null) {
return null;
}
scenarioContext.getExecutor().shutdownNow();
this.getScenarioEngine().getRunningTests().remove(runId);
System.gc();
CleanTestResultModel cleanTestResultModel = new CleanTestResultModel();
cleanTestResultModel.setSuccess(true);
return cleanTestResultModel;
}
}

View File

@ -1,82 +1,82 @@
package org.bench4q.agent.datacollector.impl;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.bench4q.agent.Main;
import org.bench4q.agent.datacollector.interfaces.DataCollector;
import org.bench4q.agent.helper.ApplicationContextHelper;
import org.bench4q.agent.scenario.BehaviorResult;
import org.bench4q.agent.storage.StorageHelper;
import org.bench4q.share.models.agent.BehaviorResultModel;
public abstract class AbstractDataCollector implements DataCollector {
protected StorageHelper storageHelper;
protected StorageHelper getStorageHelper() {
return storageHelper;
}
public void setStorageHelper(StorageHelper storageHelper) {
this.storageHelper = storageHelper;
}
public AbstractDataCollector() {
mustDoWhenIniti();
}
// Each sub class should call this in their constructor
protected void mustDoWhenIniti() {
this.setStorageHelper(ApplicationContextHelper.getContext().getBean(
StorageHelper.class));
}
public void add(final BehaviorResult behaviorResult) {
if (!Main.IS_TO_SAVE_DETAIL) {
return;
}
if (behaviorResult == null) {
return;
}
Runnable runnable = new Runnable() {
public void run() {
storageHelper.getLocalStorage().writeFile(
buildBehaviorResultModel(behaviorResult)
.getModelString(),
calculateSavePath(behaviorResult));
}
};
ExecutorService executorService = Executors
.newSingleThreadScheduledExecutor();
executorService.execute(runnable);
executorService.shutdown();
}
private BehaviorResultModel buildBehaviorResultModel(
BehaviorResult behaviorResult) {
BehaviorResultModel resultModel = new BehaviorResultModel();
resultModel.setBehaviorId(behaviorResult.getBehaviorId());
resultModel.setBehaviorName(behaviorResult.getBehaviorName());
resultModel.setContentLength(behaviorResult.getContentLength());
resultModel.setContentType(behaviorResult.getContentType());
resultModel.setEndDate(behaviorResult.getEndDate());
resultModel.setPluginId(behaviorResult.getPluginId());
resultModel.setPluginName(behaviorResult.getPluginName());
resultModel.setResponseTime(behaviorResult.getResponseTime());
resultModel.setShouldBeCountResponseTime(behaviorResult
.isShouldBeCountResponseTime());
resultModel.setStartDate(behaviorResult.getStartDate());
resultModel.setStatusCode(behaviorResult.getStatusCode());
resultModel.setSuccess(behaviorResult.isSuccess());
return resultModel;
}
protected abstract String calculateSavePath(BehaviorResult behaviorResult);
public abstract Object getScenarioBriefStatistics();
public abstract Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefStatistics(
int id);
}
package org.bench4q.agent.datacollector.impl;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.bench4q.agent.Main;
import org.bench4q.agent.datacollector.interfaces.DataCollector;
import org.bench4q.agent.helper.ApplicationContextHelper;
import org.bench4q.agent.scenario.BehaviorResult;
import org.bench4q.agent.storage.StorageHelper;
import org.bench4q.share.models.agent.BehaviorResultModel;
public abstract class AbstractDataCollector implements DataCollector {
protected StorageHelper storageHelper;
protected StorageHelper getStorageHelper() {
return storageHelper;
}
public void setStorageHelper(StorageHelper storageHelper) {
this.storageHelper = storageHelper;
}
public AbstractDataCollector() {
mustDoWhenIniti();
}
// Each sub class should call this in their constructor
protected void mustDoWhenIniti() {
this.setStorageHelper(ApplicationContextHelper.getContext().getBean(
StorageHelper.class));
}
public void add(final BehaviorResult behaviorResult) {
if (!Main.IS_TO_SAVE_DETAIL) {
return;
}
if (behaviorResult == null) {
return;
}
Runnable runnable = new Runnable() {
public void run() {
storageHelper.getLocalStorage().writeFile(
buildBehaviorResultModel(behaviorResult)
.getModelString(),
calculateSavePath(behaviorResult));
}
};
ExecutorService executorService = Executors
.newSingleThreadScheduledExecutor();
executorService.execute(runnable);
executorService.shutdown();
}
private BehaviorResultModel buildBehaviorResultModel(
BehaviorResult behaviorResult) {
BehaviorResultModel resultModel = new BehaviorResultModel();
resultModel.setBehaviorId(behaviorResult.getBehaviorId());
resultModel.setBehaviorName(behaviorResult.getBehaviorName());
resultModel.setContentLength(behaviorResult.getContentLength());
resultModel.setContentType(behaviorResult.getContentType());
resultModel.setEndDate(behaviorResult.getEndDate());
resultModel.setPluginId(behaviorResult.getPluginId());
resultModel.setPluginName(behaviorResult.getPluginName());
resultModel.setResponseTime(behaviorResult.getResponseTime());
resultModel.setShouldBeCountResponseTime(behaviorResult
.isShouldBeCountResponseTime());
resultModel.setStartDate(behaviorResult.getStartDate());
resultModel.setStatusCode(behaviorResult.getStatusCode());
resultModel.setSuccess(behaviorResult.isSuccess());
return resultModel;
}
protected abstract String calculateSavePath(BehaviorResult behaviorResult);
public abstract Object getScenarioBriefStatistics();
public abstract Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefStatistics(
int id);
}

View File

@ -1,203 +1,204 @@
package org.bench4q.agent.scenario;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;
import org.apache.log4j.Logger;
import org.bench4q.agent.datacollector.interfaces.DataCollector;
import org.bench4q.agent.plugin.Plugin;
import org.bench4q.agent.plugin.PluginManager;
import org.bench4q.agent.plugin.result.HttpReturn;
import org.bench4q.agent.plugin.result.PluginReturn;
import org.bench4q.agent.scenario.behavior.Behavior;
import org.bench4q.agent.storage.StorageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ScenarioEngine {
private static final long keepAliveTime = 10;
private PluginManager pluginManager;
private Map<UUID, ScenarioContext> runningTests;
private StorageHelper storageHelper;
private Logger logger;
@SuppressWarnings("unused")
private Logger getLogger() {
return logger;
}
private void setLogger(Logger logger) {
this.logger = logger;
}
public ScenarioEngine() {
this.setRunningTests(new HashMap<UUID, ScenarioContext>());
this.setLogger(Logger.getLogger(ScenarioEngine.class));
}
private PluginManager getPluginManager() {
return pluginManager;
}
@Autowired
private void setPluginManager(PluginManager pluginManager) {
this.pluginManager = pluginManager;
}
public StorageHelper getStorageHelper() {
return storageHelper;
}
@Autowired
public void setStorageHelper(StorageHelper storageHelper) {
this.storageHelper = storageHelper;
}
public Map<UUID, ScenarioContext> getRunningTests() {
return runningTests;
}
private void setRunningTests(Map<UUID, ScenarioContext> runningTests) {
this.runningTests = runningTests;
}
public void runScenario(UUID runId, final Scenario scenario, int poolSize) {
try {
final SynchronousQueue<Runnable> workQueue = new SynchronousQueue<Runnable>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(poolSize,
poolSize, keepAliveTime, TimeUnit.MINUTES, workQueue,
new DiscardPolicy());
final ScenarioContext scenarioContext = ScenarioContext
.buildScenarioContext(runId, scenario, poolSize, executor);
this.getRunningTests().put(runId, scenarioContext);
System.out.println(poolSize);
executeTasks(executor, scenarioContext);
} catch (Exception e) {
e.printStackTrace();
}
}
private void executeTasks(final ExecutorService executorService,
final ScenarioContext scenarioContext) {
ExecutorService taskMaker = Executors.newSingleThreadExecutor();
taskMaker.execute(new Runnable() {
public void run() {
while (true) {
executorService.execute(new Runnable() {
public void run() {
doRunScenario(scenarioContext);
logger.info("end for once!");
}
});
}
}
});
}
public void doRunScenario(ScenarioContext context) {
Map<String, Object> plugins = new HashMap<String, Object>();
preparePlugins(context.getScenario(), plugins);
for (int i = 0; i < context.getScenario().getPages().length; i++) {
Page page = context.getScenario().getPages()[i];
context.getDataStatistics().add(
PageResult.buildPageResult(
i,
doRunBatchesInPage(plugins, page,
context.getDataStatistics())));
}
}
private List<BehaviorResult> doRunBatchesInPage(
Map<String, Object> plugins, Page page, DataCollector dataCollector) {
List<BehaviorResult> results = new ArrayList<BehaviorResult>();
for (Batch batch : page.getBatches()) {
results.addAll(doRunBatch(plugins, batch, dataCollector));
}
return results;
}
private List<BehaviorResult> doRunBatch(Map<String, Object> plugins,
Batch batch, DataCollector dataCollector) {
List<BehaviorResult> results = new ArrayList<BehaviorResult>();
for (Behavior behavior : batch.getBehaviors()) {
Object plugin = plugins.get(behavior.getUse());
Map<String, String> behaviorParameters = prepareBehaviorParameters(behavior);
Date startDate = new Date(System.currentTimeMillis());
PluginReturn pluginReturn = (PluginReturn) this.getPluginManager()
.doBehavior(plugin, behavior.getName(), behaviorParameters);
Date endDate = new Date(System.currentTimeMillis());
if (!behavior.shouldBeCountResponseTime()) {
continue;
}
BehaviorResult behaviorResult = buildBehaviorResult(behavior,
plugin, startDate, pluginReturn, endDate);
dataCollector.add(behaviorResult);
results.add(behaviorResult);
}
return results;
}
private BehaviorResult buildBehaviorResult(Behavior behavior,
Object plugin, Date startDate, PluginReturn pluginReturn,
Date endDate) {
BehaviorResult result = new BehaviorResult();
result.setStartDate(startDate);
result.setEndDate(endDate);
result.setSuccess(pluginReturn.isSuccess());
result.setResponseTime(endDate.getTime() - startDate.getTime());
result.setBehaviorName(behavior.getName());
result.setPluginId(behavior.getUse());
result.setPluginName(plugin.getClass().getAnnotation(Plugin.class)
.value());
result.setShouldBeCountResponseTime(behavior
.shouldBeCountResponseTime());
if (pluginReturn instanceof HttpReturn) {
HttpReturn httpReturn = (HttpReturn) pluginReturn;
result.setBehaviorId(behavior.getId());
for (Parameter parameter : behavior.getParameters()) {
if (parameter.getKey().equals("url")) {
result.setBehaviorUrl(parameter.getValue());
}
}
result.setContentLength(httpReturn.getContentLength());
result.setContentType(httpReturn.getContentType());
result.setStatusCode(httpReturn.getStatusCode());
}
return result;
}
private Map<String, String> prepareBehaviorParameters(Behavior behavior) {
Map<String, String> behaviorParameters = new HashMap<String, String>();
for (Parameter parameter : behavior.getParameters()) {
behaviorParameters.put(parameter.getKey(), parameter.getValue());
}
return behaviorParameters;
}
private void preparePlugins(Scenario scenario, Map<String, Object> plugins) {
for (UsePlugin usePlugin : scenario.getUsePlugins()) {
String pluginId = usePlugin.getId();
Class<?> pluginClass = this.getPluginManager().getPlugins()
.get(usePlugin.getName());
Map<String, String> initParameters = new HashMap<String, String>();
for (Parameter parameter : usePlugin.getParameters()) {
initParameters.put(parameter.getKey(), parameter.getValue());
}
Object plugin = this.getPluginManager().initializePlugin(
pluginClass, initParameters);
plugins.put(pluginId, plugin);
}
}
}
package org.bench4q.agent.scenario;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;
import org.apache.log4j.Logger;
import org.bench4q.agent.datacollector.interfaces.DataCollector;
import org.bench4q.agent.plugin.Plugin;
import org.bench4q.agent.plugin.PluginManager;
import org.bench4q.agent.plugin.result.HttpReturn;
import org.bench4q.agent.plugin.result.PluginReturn;
import org.bench4q.agent.scenario.behavior.Behavior;
import org.bench4q.agent.storage.StorageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ScenarioEngine {
private static final long keepAliveTime = 10;
private PluginManager pluginManager;
private Map<UUID, ScenarioContext> runningTests;
private StorageHelper storageHelper;
private Logger logger;
@SuppressWarnings("unused")
private Logger getLogger() {
return logger;
}
private void setLogger(Logger logger) {
this.logger = logger;
}
public ScenarioEngine() {
this.setRunningTests(new HashMap<UUID, ScenarioContext>());
this.setLogger(Logger.getLogger(ScenarioEngine.class));
}
private PluginManager getPluginManager() {
return pluginManager;
}
@Autowired
private void setPluginManager(PluginManager pluginManager) {
this.pluginManager = pluginManager;
}
public StorageHelper getStorageHelper() {
return storageHelper;
}
@Autowired
public void setStorageHelper(StorageHelper storageHelper) {
this.storageHelper = storageHelper;
}
public Map<UUID, ScenarioContext> getRunningTests() {
return runningTests;
}
private void setRunningTests(Map<UUID, ScenarioContext> runningTests) {
this.runningTests = runningTests;
}
public void runScenario(UUID runId, final Scenario scenario, int poolSize) {
try {
final SynchronousQueue<Runnable> workQueue = new SynchronousQueue<Runnable>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(poolSize,
poolSize, keepAliveTime, TimeUnit.MINUTES, workQueue,
new DiscardPolicy());
final ScenarioContext scenarioContext = ScenarioContext
.buildScenarioContext(runId, scenario, poolSize, executor);
System.out.println("when run, classId:" + executor.toString());
this.getRunningTests().put(runId, scenarioContext);
System.out.println(poolSize);
executeTasks(executor, scenarioContext);
} catch (Exception e) {
e.printStackTrace();
}
}
private void executeTasks(final ExecutorService executor,
final ScenarioContext scenarioContext) {
ExecutorService taskMaker = Executors.newSingleThreadExecutor();
taskMaker.execute(new Runnable() {
public void run() {
while (!scenarioContext.isFinished()) {
executor.execute(new Runnable() {
public void run() {
doRunScenario(scenarioContext);
logger.info("end for once!");
}
});
}
}
});
}
public void doRunScenario(ScenarioContext context) {
Map<String, Object> plugins = new HashMap<String, Object>();
preparePlugins(context.getScenario(), plugins);
for (int i = 0; i < context.getScenario().getPages().length; i++) {
Page page = context.getScenario().getPages()[i];
context.getDataStatistics().add(
PageResult.buildPageResult(
i,
doRunBatchesInPage(plugins, page,
context.getDataStatistics())));
}
}
private List<BehaviorResult> doRunBatchesInPage(
Map<String, Object> plugins, Page page, DataCollector dataCollector) {
List<BehaviorResult> results = new ArrayList<BehaviorResult>();
for (Batch batch : page.getBatches()) {
results.addAll(doRunBatch(plugins, batch, dataCollector));
}
return results;
}
private List<BehaviorResult> doRunBatch(Map<String, Object> plugins,
Batch batch, DataCollector dataCollector) {
List<BehaviorResult> results = new ArrayList<BehaviorResult>();
for (Behavior behavior : batch.getBehaviors()) {
Object plugin = plugins.get(behavior.getUse());
Map<String, String> behaviorParameters = prepareBehaviorParameters(behavior);
Date startDate = new Date(System.currentTimeMillis());
PluginReturn pluginReturn = (PluginReturn) this.getPluginManager()
.doBehavior(plugin, behavior.getName(), behaviorParameters);
Date endDate = new Date(System.currentTimeMillis());
if (!behavior.shouldBeCountResponseTime()) {
continue;
}
BehaviorResult behaviorResult = buildBehaviorResult(behavior,
plugin, startDate, pluginReturn, endDate);
dataCollector.add(behaviorResult);
results.add(behaviorResult);
}
return results;
}
private BehaviorResult buildBehaviorResult(Behavior behavior,
Object plugin, Date startDate, PluginReturn pluginReturn,
Date endDate) {
BehaviorResult result = new BehaviorResult();
result.setStartDate(startDate);
result.setEndDate(endDate);
result.setSuccess(pluginReturn.isSuccess());
result.setResponseTime(endDate.getTime() - startDate.getTime());
result.setBehaviorName(behavior.getName());
result.setPluginId(behavior.getUse());
result.setPluginName(plugin.getClass().getAnnotation(Plugin.class)
.value());
result.setShouldBeCountResponseTime(behavior
.shouldBeCountResponseTime());
if (pluginReturn instanceof HttpReturn) {
HttpReturn httpReturn = (HttpReturn) pluginReturn;
result.setBehaviorId(behavior.getId());
for (Parameter parameter : behavior.getParameters()) {
if (parameter.getKey().equals("url")) {
result.setBehaviorUrl(parameter.getValue());
}
}
result.setContentLength(httpReturn.getContentLength());
result.setContentType(httpReturn.getContentType());
result.setStatusCode(httpReturn.getStatusCode());
}
return result;
}
private Map<String, String> prepareBehaviorParameters(Behavior behavior) {
Map<String, String> behaviorParameters = new HashMap<String, String>();
for (Parameter parameter : behavior.getParameters()) {
behaviorParameters.put(parameter.getKey(), parameter.getValue());
}
return behaviorParameters;
}
private void preparePlugins(Scenario scenario, Map<String, Object> plugins) {
for (UsePlugin usePlugin : scenario.getUsePlugins()) {
String pluginId = usePlugin.getId();
Class<?> pluginClass = this.getPluginManager().getPlugins()
.get(usePlugin.getName());
Map<String, String> initParameters = new HashMap<String, String>();
for (Parameter parameter : usePlugin.getParameters()) {
initParameters.put(parameter.getKey(), parameter.getValue());
}
Object plugin = this.getPluginManager().initializePlugin(
pluginClass, initParameters);
plugins.put(pluginId, plugin);
}
}
}