*
* @param grinderProperties {@link GrinderProperties} which contains grinder agent base configuration.
* @throws GrinderException If an error occurs.
*/
public void run(GrinderProperties grinderProperties) throws GrinderException {
StartGrinderMessage startMessage = null;
ConsoleCommunication consoleCommunication = null;
m_fanOutStreamSender = new FanOutStreamSender(GrinderConstants.AGENT_FANOUT_STREAM_THREAD_COUNT);
m_timer = new Timer(false);
try {
while (true) {
m_logger.info(GrinderBuild.getName());
ScriptLocation script = null;
GrinderProperties properties;
do {
properties = createAndMergeProperties(grinderProperties,
startMessage != null ? startMessage.getProperties() : null);
properties.setProperty(GrinderProperties.CONSOLE_HOST, m_agentConfig.getControllerIP());
m_agentIdentity.setName(m_agentConfig.getAgentHostID());
final Connector connector = m_connectorFactory.create(properties);
// We only reconnect if the connection details have changed.
if (consoleCommunication != null && !consoleCommunication.getConnector().equals(connector)) {
shutdownConsoleCommunication(consoleCommunication);
consoleCommunication = null;
// Accept any startMessage from previous console - see
// bug 2092881.
}
if (consoleCommunication == null && connector != null) {
try {
consoleCommunication = new ConsoleCommunication(connector, grinderProperties.getProperty(
"grinder.user", "_default"));
consoleCommunication.start();
m_logger.info("Connect to console at {}", connector.getEndpointAsString());
} catch (CommunicationException e) {
if (m_proceedWithoutConsole) {
m_logger.warn("{}, proceeding without the console; set "
+ "grinder.useConsole=false to disable this warning.", e.getMessage());
} else {
m_logger.error(e.getMessage());
return;
}
}
}
if (consoleCommunication != null && startMessage == null) {
m_logger.info("Waiting for console signal");
m_consoleListener.waitForMessage();
if (m_consoleListener.received(ConsoleListener.START)) {
startMessage = m_consoleListener.getLastStartGrinderMessage();
continue; // Loop to handle new properties.
} else {
break; // Another message, check at end of outer while loop.
}
}
if (startMessage != null) {
final GrinderProperties messageProperties = startMessage.getProperties();
final Directory fileStoreDirectory = m_fileStore.getDirectory();
// Convert relative path to absolute path.
messageProperties.setAssociatedFile(fileStoreDirectory.getFile(messageProperties
.getAssociatedFile()));
final File consoleScript = messageProperties.resolveRelativeFile(messageProperties.getFile(
GrinderProperties.SCRIPT, GrinderProperties.DEFAULT_SCRIPT));
// We only fall back to the agent properties if the start message
// doesn't specify a script and there is no default script.
if (messageProperties.containsKey(GrinderProperties.SCRIPT) || consoleScript.canRead()) {
// The script directory may not be the file's direct parent.
script = new ScriptLocation(fileStoreDirectory, consoleScript);
}
m_agentIdentity.setNumber(startMessage.getAgentNumber());
} else {
m_agentIdentity.setNumber(-1);
}
if (script == null) {