refactoring with the port pool, and think about if we should take the

recording script as a service
This commit is contained in:
chentienan 2013-07-20 17:12:00 +08:00
parent e569cb0a0f
commit 020d09177f
5 changed files with 273 additions and 270 deletions

View File

@ -1,7 +1,6 @@
package org.bench4q.master.api;
import org.bench4q.master.api.model.OrganizeRecordPortResponseModel;
import org.bench4q.master.entity.LocalPort;
import org.bench4q.master.service.PortPoolService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@ -45,14 +44,10 @@ public class RecordPortController extends BaseController {
* .setFailCauseString("you don't hava the power to add port to pool!");
* return organizeRecordPortResponseModel; }
*/
LocalPort localPort = new LocalPort();
localPort.setPort(port);
localPort.setInUse(false);
this.getPortPoolService().getScriptPortPool().put(port, localPort);
this.getPortPoolService().addPortToDBPool(port);
if (!this.getPortPoolService().addPortToDBPool(port)) {
return setOrganizePortResponseModel(false, "add to DB pool fails 2");
return setOrganizePortResponseModel(false, "add to DB pool fails");
}
return setOrganizePortResponseModel(true, "");
}
@ -60,10 +55,6 @@ public class RecordPortController extends BaseController {
@RequestMapping(value = "/removePortFromPool", method = RequestMethod.POST)
public OrganizeRecordPortResponseModel removePortFromPool(
@RequestParam int port) {
if (this.getPortPoolService().getScriptPortPool().remove(port) == null) {
return setOrganizePortResponseModel(false,
"fail in add to local pool 1");
}
if (!this.getPortPoolService().removePortFromDBPool(port)) {
return setOrganizePortResponseModel(false,
"remove from local fails");

View File

@ -2,8 +2,8 @@ package org.bench4q.master.api;
import org.bench4q.master.api.model.OperateScriptServerResponseModel;
import org.bench4q.master.entity.Constant;
import org.bench4q.master.entity.LocalPort;
import org.bench4q.master.entity.ScriptCapturer;
import org.bench4q.master.entity.db.Port;
import org.bench4q.master.service.PortPoolService;
import org.bench4q.master.service.ScriptService;
import org.springframework.beans.factory.annotation.Autowired;
@ -66,12 +66,11 @@ public class RecordScriptController extends BaseController {
*/
synchronized (PORT_LOCK) {
// TODO:
LocalPort localPort = this.getPortPoolService().getAPortNotInUse();
if (localPort == null) {
Port port = this.getPortPoolService().getAPortNotInUse();
if (port == null) {
return returnResponseModel(false, "port is in use!");
}
this.setPortForRecord(localPort.getPort());
localPort.setInUse(true);
this.setPortForRecord(port.getPort());
}
// String pathString = this.getClass().getResource("/").getPath();
@ -102,9 +101,10 @@ public class RecordScriptController extends BaseController {
"there is no RecordingServer to stop");
}
scriptCapturer.stopCurrentRecord();
this.getPortPoolService().getScriptPortPool()
.get(this.getPortForRecord()).setInUse(false);
this.getScriptCapturer().stopCurrentRecord();
this.getScriptCapturer().shutHttpCaptureProxyServer();
this.getPortPoolService().backThePortToPool(this.getPortForRecord());
return returnResponseModel(true, "RecordServer stop");
}

View File

@ -12,6 +12,7 @@ import javax.persistence.Table;
public class Port {
private int id;
private int port;
private boolean inUse;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ -33,4 +34,13 @@ public class Port {
this.port = port;
}
@Column(name = "inUse", nullable = false)
public boolean isInUse() {
return inUse;
}
public void setInUse(boolean inUse) {
this.inUse = inUse;
}
}

View File

@ -21,280 +21,249 @@ import org.python.util.PythonInterpreter;
public class Config {
private static Config config = null;
private static final Log log = LogFactory.getLog(Config.class);
private static Properties props;
private String pythonPath;
private int port = 8090;
private boolean debug;
private boolean quiet;
private String exist;
private String replace;
private List<String> includeList;
private List<String> excludeList;
private List<Pattern> includePatterns = new ArrayList<Pattern>();
private List<Pattern> excludePatterns = new ArrayList<Pattern>();
private String scriptArg;
private ProxySettings proxySettings;
private static String defDriverPkgName = "com.bitmechanic.maxq";
private static String defValidatorPkgName = "com.bitmechanic.maxq";
private static final Log log = LogFactory.getLog(Config.class);
private static Properties props;
private String pythonPath;
private int port = 8090;
private boolean debug;
private boolean quiet;
private String exist;
private String replace;
private List<String> includeList;
private List<String> excludeList;
private List<Pattern> includePatterns = new ArrayList<Pattern>();
private List<Pattern> excludePatterns = new ArrayList<Pattern>();
private String scriptArg;
private ProxySettings proxySettings;
private static String defDriverPkgName = "com.bitmechanic.maxq";
private static String defValidatorPkgName = "com.bitmechanic.maxq";
static
{
Layout layout = new PatternLayout("%d [%t] %-5p %c - %m%n");
Logger.getRootLogger().addAppender(new ConsoleAppender(layout, "System.err"));
}
static {
Layout layout = new PatternLayout("%d [%t] %-5p %c - %m%n");
Logger.getRootLogger().addAppender(
new ConsoleAppender(layout, "System.err"));
}
public static Config getConfig()
{
if (config == null)
initConfig();
return config;
}
public static Config getConfig() {
if (config == null)
initConfig();
return config;
}
public static void initConfig()
{
config = new Config();
String maxqDir = System.getProperty("maxq.dir");
String pathSep = System.getProperty("file.separator");
public static void initConfig() {
config = new Config();
String maxqDir = System.getProperty("maxq.dir");
String pathSep = System.getProperty("file.separator");
String propertiesFileName = System.getProperty("properties.file", "maxq.properties");
InputStream propertiesStream = Config.class.getClassLoader().getResourceAsStream(propertiesFileName);
props = new Properties();
if (propertiesStream != null)
{
try
{
props.load(propertiesStream);
log.debug("Generator: " + props.getProperty("generator.classnames"));
}
catch (IOException e)
{
throw new ExceptionInInitializerError(e);
}
String propertiesFileName = System.getProperty("properties.file",
"maxq.properties");
InputStream propertiesStream = Config.class.getClassLoader()
.getResourceAsStream(propertiesFileName);
props = new Properties();
if (propertiesStream != null) {
try {
props.load(propertiesStream);
log.debug("Generator: "
+ props.getProperty("generator.classnames"));
} catch (IOException e) {
throw new ExceptionInInitializerError(e);
}
}
}
config.addPythonPath(maxqDir + pathSep + "jython");
config.addPythonPath(maxqDir + pathSep + "jython");
String path = config.getProperty("python.path");
if (path != null) {
config.addPythonPath(path);
}
String path = config.getProperty("python.path");
if (path != null) {
config.addPythonPath(path);
}
String portStr = props.getProperty("local.proxy.port");
if (portStr != null)
config.port = Integer.parseInt(portStr);
}
String portStr = props.getProperty("local.proxy.port");
if (portStr != null)
config.port = Integer.parseInt(portStr);
}
public void completeInit()
throws Utils.UserException
{
Level level = this.quiet ? Level.WARN : this.debug ? Level.ALL : Level.INFO;
Logger.getRootLogger().setLevel(level);
public void completeInit() throws Utils.UserException {
Level level = this.quiet ? Level.WARN : this.debug ? Level.ALL
: Level.INFO;
Logger.getRootLogger().setLevel(level);
System.setProperty("org.apache.commons.logging.simplelog.defaultlog", "warn");
System.setProperty("org.apache.commons.logging.simplelog.defaultlog",
"warn");
Properties ppref = new Properties();
if (getPythonPath() != null)
ppref.put("python.path", getPythonPath());
PythonInterpreter.initialize(System.getProperties(), ppref, new String[0]);
Properties ppref = new Properties();
if (getPythonPath() != null)
ppref.put("python.path", getPythonPath());
PythonInterpreter.initialize(System.getProperties(), ppref,
new String[0]);
String host = getProperty("remote.proxy.host");
Integer port = getPropertyInt("remote.proxy.port");
if ((host == null ? 1 : 0) != (port == null ? 1 : 0))
throw new Utils.UserException("Not using proxy server. You must set both remote.proxy.host and remote.proxy.port.");
if ((host != null) && (port != null)) {
this.proxySettings = new ProxySettings();
this.proxySettings.host = host;
this.proxySettings.port = port.intValue();
log.info("Proxying requests via " + this.proxySettings.host + ":" + Integer.toString(this.proxySettings.port));
}
}
String host = getProperty("remote.proxy.host");
Integer port = getPropertyInt("remote.proxy.port");
if ((host == null ? 1 : 0) != (port == null ? 1 : 0))
throw new Utils.UserException(
"Not using proxy server. You must set both remote.proxy.host and remote.proxy.port.");
if ((host != null) && (port != null)) {
this.proxySettings = new ProxySettings();
this.proxySettings.host = host;
this.proxySettings.port = port.intValue();
log.info("Proxying requests via " + this.proxySettings.host + ":"
+ Integer.toString(this.proxySettings.port));
}
}
public String getProperty(String prop)
{
return (String)props.get(prop);
}
public String getProperty(String prop) {
return (String) props.get(prop);
}
public String getProperty(String prop, String def)
{
String val = getProperty(prop);
return (val == null) || (val.equals("")) ? def : val;
}
public String getProperty(String prop, String def) {
String val = getProperty(prop);
return (val == null) || (val.equals("")) ? def : val;
}
public void setProperty(String property, String value)
{
props.setProperty(property, value);
}
public void setProperty(String property, String value) {
props.setProperty(property, value);
}
public Integer getPropertyInt(String prop)
throws Utils.UserException
{
String s = getProperty(prop);
if (s == null)
return null;
try {
return new Integer(s); } catch (NumberFormatException e) {
}
throw new Utils.UserException(prop + " property must be an integer");
}
public Integer getPropertyInt(String prop) throws Utils.UserException {
String s = getProperty(prop);
if (s == null)
return null;
try {
return new Integer(s);
} catch (NumberFormatException e) {
}
throw new Utils.UserException(prop + " property must be an integer");
}
public void addPythonPath(String path)
{
if (this.pythonPath == null)
this.pythonPath = path;
else
this.pythonPath = (this.pythonPath + System.getProperty("path.separator") + path);
}
public void addPythonPath(String path) {
if (this.pythonPath == null)
this.pythonPath = path;
else
this.pythonPath = (this.pythonPath
+ System.getProperty("path.separator") + path);
}
public String getPythonPath()
{
return this.pythonPath;
}
public String getPythonPath() {
return this.pythonPath;
}
public void setPort(int pt)
{
this.port = pt;
}
public void setPort(int pt) {
this.port = pt;
}
public int getPort()
{
return this.port;
}
public int getPort() {
return this.port;
}
public void setDebug(boolean d)
{
this.debug = d;
}
public void setDebug(boolean d) {
this.debug = d;
}
public boolean isDebug()
{
return this.debug;
}
public boolean isDebug() {
return this.debug;
}
public void setQuiet(boolean q)
{
this.quiet = q;
}
public void setQuiet(boolean q) {
this.quiet = q;
}
public boolean isQuiet()
{
return this.quiet;
}
public boolean isQuiet() {
return this.quiet;
}
public void setExist(String e)
{
this.exist = e;
}
public void setExist(String e) {
this.exist = e;
}
public String getExist()
{
return this.exist;
}
public String getExist() {
return this.exist;
}
public void setReplace(String e)
{
this.replace = e;
}
public void setReplace(String e) {
this.replace = e;
}
public String getReplace()
{
return this.replace;
}
public String getReplace() {
return this.replace;
}
public void setIncludePatterns(String[] pats)
{
this.includeList = Arrays.asList(pats);
createPatterns(this.includeList, this.includePatterns);
}
public void setIncludePatterns(String[] pats) {
this.includeList = Arrays.asList(pats);
createPatterns(this.includeList, this.includePatterns);
}
public void setExcludePatterns(String[] pats)
{
this.excludeList = Arrays.asList(pats);
createPatterns(this.excludeList, this.excludePatterns);
}
public void setExcludePatterns(String[] pats) {
this.excludeList = Arrays.asList(pats);
createPatterns(this.excludeList, this.excludePatterns);
}
public List<Pattern> getIncludePatterns()
{
return this.includePatterns;
}
public List<Pattern> getIncludePatterns() {
return this.includePatterns;
}
public List<Pattern> getExcludePatterns()
{
return this.excludePatterns;
}
public List<Pattern> getExcludePatterns() {
return this.excludePatterns;
}
public void setScriptArg(String arg)
{
this.scriptArg = arg;
}
public void setScriptArg(String arg) {
this.scriptArg = arg;
}
public String getScriptArg()
{
return this.scriptArg;
}
public String getScriptArg() {
return this.scriptArg;
}
public static String getDriverPkgName()
{
return System.getProperty("maxq.driverpkgname", defDriverPkgName);
}
public static String getDriverPkgName() {
return System.getProperty("maxq.driverpkgname", defDriverPkgName);
}
public static String getValidatorPkgName()
{
return System.getProperty("maxq.validatorpkgname", defValidatorPkgName);
}
public static String getValidatorPkgName() {
return System.getProperty("maxq.validatorpkgname", defValidatorPkgName);
}
public static Log getTestLogger()
{
return LogFactory.getLog("com.bitmechanic.maxq.testrun");
}
public static Log getTestLogger() {
return LogFactory.getLog("com.bitmechanic.maxq.testrun");
}
public ProxySettings getProxySettings()
{
return this.proxySettings;
}
public ProxySettings getProxySettings() {
return this.proxySettings;
}
public void setProxySettings(ProxySettings proxySettings)
{
this.proxySettings = proxySettings;
}
public void setProxySettings(ProxySettings proxySettings) {
this.proxySettings = proxySettings;
}
private void createPatterns(List<String> list, List<Pattern> excludePatterns2)
{
Iterator<String> iter = list.iterator();
excludePatterns2.clear();
while (iter.hasNext())
try {
Pattern p = Pattern.compile(iter.next().toString());
excludePatterns2.add(p);
} catch (PatternSyntaxException e) {
log.error(e);
}
}
private void createPatterns(List<String> list,
List<Pattern> excludePatterns2) {
Iterator<String> iter = list.iterator();
excludePatterns2.clear();
while (iter.hasNext())
try {
Pattern p = Pattern.compile(iter.next().toString());
excludePatterns2.add(p);
} catch (PatternSyntaxException e) {
log.error(e);
}
}
public static class ProxySettings
{
String host;
int port;
public static class ProxySettings {
String host;
int port;
public String getHost()
{
return this.host;
}
public String getHost() {
return this.host;
}
public void setHost(String host)
{
this.host = host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort()
{
return this.port;
}
public int getPort() {
return this.port;
}
public void setPort(int port)
{
this.port = port;
}
}
public void setPort(int port) {
this.port = port;
}
}
}

View File

@ -1,9 +1,7 @@
package org.bench4q.master.service;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.bench4q.master.entity.LocalPort;
import java.util.List;
import org.bench4q.master.entity.db.Port;
import org.bench4q.master.helper.SessionHelper;
import org.hibernate.Session;
@ -15,14 +13,8 @@ import org.springframework.stereotype.Component;
@Component
public class PortPoolService {
private static Map<Integer, LocalPort> ScriptPortPool = new HashMap<Integer, LocalPort>();
private SessionHelper sessionHelper = new SessionHelper();
public Map<Integer, LocalPort> getScriptPortPool() {
return PortPoolService.ScriptPortPool;
}
public SessionHelper getSessionHelper() {
return sessionHelper;
}
@ -99,17 +91,58 @@ public class PortPoolService {
}
}
public LocalPort getAPortNotInUse() {
Iterator<LocalPort> iterator = ScriptPortPool.values().iterator();
LocalPort localPort = new LocalPort();
while (iterator.hasNext()) {
localPort = iterator.next();
if (localPort.isInUse()) {
continue;
} else {
return localPort;
@SuppressWarnings("unchecked")
public Port getAPortNotInUse() {
// If i do the HA in the pool, shall i lock this change for this port
Session session = this.getSessionHelper().openSession();
Transaction transaction = session.beginTransaction();
Port port = null;
try {
List<Port> portList = (List<Port>) session
.createCriteria(Port.class)
.add(Restrictions.eq("inUse", false)).list();
if (portList == null) {
return null;
}
port = portList.get(0);
port.setInUse(true);
transaction.commit();
return port;
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
return null;
} finally {
if (session != null) {
session.close();
}
}
}
public boolean backThePortToPool(int port) {
Session session = this.getSessionHelper().openSession();
Transaction transaction = session.beginTransaction();
try {
Port portEntity = (Port) session.createCriteria(Port.class)
.add(Restrictions.eq("port", port)).uniqueResult();
if (portEntity == null) {
return false;
}
portEntity.setInUse(false);
transaction.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
return true;
} finally {
if (session != null) {
session.close();
}
}
return null;
}
}