diff --git a/Bench4Q-Agent/src/main/java/org/bench4q/agent/api/TestController.java b/Bench4Q-Agent/src/main/java/org/bench4q/agent/api/TestController.java index 70f65e34..c8dd5d76 100644 --- a/Bench4Q-Agent/src/main/java/org/bench4q/agent/api/TestController.java +++ b/Bench4Q-Agent/src/main/java/org/bench4q/agent/api/TestController.java @@ -1,9 +1,9 @@ package org.bench4q.agent.api; -import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; +import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import org.bench4q.agent.plugin.ParameterFileCollector; @@ -11,9 +11,6 @@ import org.bench4q.agent.scenario.Scenario; import org.bench4q.agent.scenario.engine.ScenarioContext; import org.bench4q.agent.scenario.engine.ScenarioEngine; import org.bench4q.agent.scenario.engine.Schedule; -import org.bench4q.agent.scenario.node.Behavior; -import org.bench4q.agent.scenario.node.PluginImplementBehavior; -import org.bench4q.agent.scenario.node.UserBehavior; import org.bench4q.share.helper.MarshalHelper; import org.bench4q.share.models.agent.CleanTestResultModel; import org.bench4q.share.models.agent.RunScenarioModel; @@ -23,9 +20,7 @@ import org.bench4q.share.models.agent.TestBriefStatusModel; import org.bench4q.share.models.agent.scriptrecord.ScheduleModel; 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.bench4q.share.models.agent.statistics.BehaviorBriefModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; @@ -40,7 +35,7 @@ import org.springframework.web.multipart.MultipartFile; public class TestController { private ScenarioEngine scenarioEngine; private ParameterFileCollector paramFileCollector; - private Logger logger = Logger.getLogger(TestController.class); + public Logger logger = Logger.getLogger(TestController.class); private ScenarioEngine getScenarioEngine() { return scenarioEngine; @@ -63,9 +58,13 @@ public class TestController { @RequestMapping(value = "/bookTest/{poolSize}", method = { RequestMethod.GET, RequestMethod.POST }) @ResponseBody - public RunScenarioResultModel bookTest(@PathVariable int poolSize) { + public RunScenarioResultModel bookTest(@PathVariable int poolSize, + @RequestParam(value = "briefCycle") int briefCycle, + @RequestParam(value = "briefUnit") String briefUnit) { try { UUID runId = UUID.randomUUID(); + long sampleCycleInMillis = TimeUnit.valueOf(briefUnit).toMillis( + briefCycle); this.getScenarioEngine().addRunningTestWithoutScenario(runId, poolSize); RunScenarioResultModel runScenarioResultModel = new RunScenarioResultModel(); @@ -88,6 +87,7 @@ public class TestController { try { this.getParamFileCollector().collectParamFiles(files, runId); System.out.println(scenarioModel); + logger.info("Real start time is:" + new Date(realStartTime)); RunScenarioModel runScenarioModel = MarshalHelper.unmarshal( RunScenarioModel.class, scenarioModel); @@ -121,11 +121,7 @@ public class TestController { @RequestMapping(value = "/briefAll/{runId}", method = RequestMethod.GET) @ResponseBody public TestBriefStatusModel briefAll(@PathVariable UUID runId) { - TestBriefStatusModel result = new TestBriefStatusModel(); - result.setScenarioBriefModel(this.brief(runId)); - result.setPagesBriefModel(this.pagesBrief(runId)); - result.setBehaviorsBriefModel(this.behaviorsBrief(runId)); - return result; + return this.getScenarioEngine().getRunningTests().get(runId).briefAll(); } @RequestMapping(value = "/pagesBrief/{runId}") @@ -133,55 +129,16 @@ public class TestController { public AgentPagesBriefModel pagesBrief(@PathVariable UUID runId) { ScenarioContext context = this.getScenarioEngine().getRunningTests() .get(runId); - AgentPagesBriefModel result = new AgentPagesBriefModel(); - List pageBrieves = new ArrayList(); - - if (context == null) { - return null; - } - for (int i = 0; i < context.getScenario().getPages().length; i++) { - pageBrieves.add((AgentPageBriefModel) context.getDataCollector() - .getPageBriefStatistics(i)); - } - result.setPageBriefModels(pageBrieves); - return result; + return context.briefAll().getPagesBriefModel(); } @RequestMapping(value = "/behaviorsBrief/{runId}") @ResponseBody public AgentBehaviorsBriefModel behaviorsBrief(@PathVariable UUID runId) { - AgentBehaviorsBriefModel ret = new AgentBehaviorsBriefModel(); - List behaviorBriefModels = new ArrayList(); ScenarioContext scenarioContext = this.getScenarioEngine() .getRunningTests().get(runId); - if (scenarioContext == null) { - return null; - } - for (Behavior behavior : scenarioContext.getScenario() - .getAllBehaviors()) { - if (!(behavior instanceof UserBehavior)) { - continue; - } - PluginImplementBehavior pluginImplementBehavior = (PluginImplementBehavior) behavior; - try { - BehaviorBriefModel briefModel = pluginImplementBehavior - .getBehaviorBriefResult(scenarioContext - .getDataCollector()); - logger.info(pluginImplementBehavior.getId()); - if (briefModel == null) { - continue; - } - briefModel.setBehaviorUrl(pluginImplementBehavior - .getSpecificParamValue("url")); - behaviorBriefModels.add(briefModel); - } catch (Exception e) { - logger.info( - "where behaviorId is " - + pluginImplementBehavior.getId(), e); - } - - } - ret.setBehaviorBriefModels(behaviorBriefModels); + AgentBehaviorsBriefModel ret = scenarioContext.briefAll() + .getBehaviorsBriefModel(); return ret; } @@ -190,14 +147,7 @@ public class TestController { public AgentBriefStatusModel brief(@PathVariable UUID runId) { ScenarioContext scenarioContext = this.getScenarioEngine() .getRunningTests().get(runId); - if (scenarioContext == null) { - return null; - } - AgentBriefStatusModel agentStatusModel = (AgentBriefStatusModel) scenarioContext - .getDataCollector().getScenarioBriefStatistics(); - agentStatusModel.setvUserCount(scenarioContext.getExecutor() - .getActiveCount()); - return agentStatusModel; + return scenarioContext.briefAll().getScenarioBriefModel(); } @RequestMapping(value = "/stop/{runId}", method = { RequestMethod.GET, @@ -210,11 +160,9 @@ public class TestController { if (scenarioContext == null) { return null; } - System.out.println("when before stop, classId:" - + scenarioContext.getExecutor().toString()); - System.out.println("when after stop, classId:" - + scenarioContext.getExecutor().toString()); scenarioContext.stop(); + System.out + .println("**********************Stop*****************************"); clean(); return new StopTestModel(true); } diff --git a/Bench4Q-Agent/src/main/java/org/bench4q/agent/scenario/engine/ScenarioContext.java b/Bench4Q-Agent/src/main/java/org/bench4q/agent/scenario/engine/ScenarioContext.java index 91a09e6b..4ba276aa 100644 --- a/Bench4Q-Agent/src/main/java/org/bench4q/agent/scenario/engine/ScenarioContext.java +++ b/Bench4Q-Agent/src/main/java/org/bench4q/agent/scenario/engine/ScenarioContext.java @@ -1,6 +1,8 @@ package org.bench4q.agent.scenario.engine; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Observable; import java.util.Observer; import java.util.UUID; @@ -14,7 +16,16 @@ import org.bench4q.agent.datacollector.DataCollector; import org.bench4q.agent.datacollector.impl.DataCollectorImpl; import org.bench4q.agent.plugin.PluginManager; import org.bench4q.agent.scenario.Scenario; +import org.bench4q.agent.scenario.node.Behavior; +import org.bench4q.agent.scenario.node.PluginImplementBehavior; +import org.bench4q.agent.scenario.node.UserBehavior; import org.bench4q.agent.storage.StorageHelper; +import org.bench4q.share.models.agent.TestBriefStatusModel; +import org.bench4q.share.models.agent.statistics.AgentBehaviorsBriefModel; +import org.bench4q.share.models.agent.statistics.AgentBriefStatusModel; +import org.bench4q.share.models.agent.statistics.AgentPageBriefModel; +import org.bench4q.share.models.agent.statistics.AgentPagesBriefModel; +import org.bench4q.share.models.agent.statistics.BehaviorBriefModel; public class ScenarioContext implements Observer { private static final long keepAliveTime = 10; @@ -27,8 +38,9 @@ public class ScenarioContext implements Observer { private final DataCollector dataCollector; private final PluginManager pluginManager; private Schedule schedule; + private Logger logger = Logger.getLogger(this.getClass()); - public ScenarioContext(UUID testId, Date startDate, + private ScenarioContext(UUID testId, Date startDate, ThreadPoolExecutor executor, DataCollector dataCollector, PluginManager pluginManager) { this.testId = testId; @@ -62,7 +74,7 @@ public class ScenarioContext implements Observer { return scenario; } - public void setScenario(Scenario scenario) { + private void setScenario(Scenario scenario) { this.scenario = scenario; } @@ -70,11 +82,11 @@ public class ScenarioContext implements Observer { return finished; } - public void setFinished(boolean finished) { + private void setFinished(boolean finished) { this.finished = finished; } - public DataCollector getDataCollector() { + DataCollector getDataCollector() { return dataCollector; } @@ -120,6 +132,9 @@ public class ScenarioContext implements Observer { } /** + * Task Management section -------- Start + * + * * Now, I tolerate that if the requiredLoad < * this.getExecutor.getCorePoolSize(), then the excess threads will be * killed when its current task complete @@ -181,9 +196,79 @@ public class ScenarioContext implements Observer { } } + /** + * Task Management section --------- Stop + */ + + /** + * Brief When Running Section -------- Start + * + * @return + */ + public TestBriefStatusModel briefAll() { + TestBriefStatusModel result = new TestBriefStatusModel(); + result.setScenarioBriefModel(getScenarioBrief()); + result.setPagesBriefModel(getPagesBrief()); + result.setBehaviorsBriefModel(getBehaviorsBrief()); + return result; + + } + + private AgentBriefStatusModel getScenarioBrief() { + AgentBriefStatusModel result = (AgentBriefStatusModel) this.dataCollector + .getScenarioBriefStatistics(); + result.setvUserCount(this.getExecutor().getActiveCount()); + return result; + } + + private AgentPagesBriefModel getPagesBrief() { + AgentPagesBriefModel result = new AgentPagesBriefModel(); + List pageBrieves = new ArrayList(); + + for (int i = 0; i < getScenario().getPages().length; i++) { + pageBrieves.add((AgentPageBriefModel) getDataCollector() + .getPageBriefStatistics(i)); + } + result.setPageBriefModels(pageBrieves); + return result; + } + + private AgentBehaviorsBriefModel getBehaviorsBrief() { + List behaviorBriefModels = new ArrayList(); + AgentBehaviorsBriefModel ret = new AgentBehaviorsBriefModel(); + for (Behavior behavior : getScenario().getAllBehaviors()) { + if (!(behavior instanceof UserBehavior)) { + continue; + } + PluginImplementBehavior pluginImplementBehavior = (PluginImplementBehavior) behavior; + try { + BehaviorBriefModel briefModel = pluginImplementBehavior + .getBehaviorBriefResult(getDataCollector()); + this.logger.info(pluginImplementBehavior.getId()); + if (briefModel == null) { + continue; + } + briefModel.setBehaviorUrl(pluginImplementBehavior + .getSpecificParamValue("url")); + behaviorBriefModels.add(briefModel); + } catch (Exception e) { + this.logger.info("where behaviorId is " + + pluginImplementBehavior.getId(), e); + } + + } + ret.setBehaviorBriefModels(behaviorBriefModels); + return ret; + } + + /** + * Brief When Running-------- End + */ + public void stop() { this.setFinished(true); this.getExecutor().shutdownNow(); this.getSchedule().stop(); } + } diff --git a/Bench4Q-Agent/src/test/java/org/bench4q/agent/test/TestWithScriptFile.java b/Bench4Q-Agent/src/test/java/org/bench4q/agent/test/TestWithScriptFile.java index 834cf65b..649d9c6b 100644 --- a/Bench4Q-Agent/src/test/java/org/bench4q/agent/test/TestWithScriptFile.java +++ b/Bench4Q-Agent/src/test/java/org/bench4q/agent/test/TestWithScriptFile.java @@ -193,9 +193,8 @@ public class TestWithScriptFile extends TestBase { + "testJD.xml")); HttpResponse httpResponse1 = this.getHttpRequester().sendPost( url + "/bookTest/20", null, null); - RunScenarioResultModel bookResponse = MarshalHelper - .tryUnmarshal(RunScenarioResultModel.class, - httpResponse1.getContent()); + RunScenarioResultModel bookResponse = MarshalHelper.tryUnmarshal( + RunScenarioResultModel.class, httpResponse1.getContent()); assertNotNull(bookResponse); assertNotNull(bookResponse.getRunId().toString()); System.out.println(bookResponse.getRunId().toString()); @@ -204,7 +203,6 @@ public class TestWithScriptFile extends TestBase { MarshalHelper.tryMarshal(getScenarioModel())); stringPart.put("scheduleContent", MarshalHelper.tryMarshal(buildScheduleModel())); - // TODO: HttpResponse httpResponse = this.getHttpRequester().postFiles( null, url + "/submitScenarioWithParams/" @@ -213,9 +211,8 @@ public class TestWithScriptFile extends TestBase { assertNotNull(httpResponse); assertNotNull(httpResponse.getContent()); assertEquals(200, httpResponse.getCode()); - RunScenarioResultModel resultModel = MarshalHelper - .tryUnmarshal(RunScenarioResultModel.class, - httpResponse.getContent()); + RunScenarioResultModel resultModel = MarshalHelper.tryUnmarshal( + RunScenarioResultModel.class, httpResponse.getContent()); String dirPath = (String) TestHelper.invokePrivate( new ParameterFileCollector(), "guardDirExists", new Class[] { UUID.class },