Hi, 1/ Looking at the code, I think there might be a side effect of this. With this commit, in JMeterThread we now call SampleListener#sampleStarted and sampleStopped around sampler.sample(). It was not the case previously. There might be strange side effect if any 3rd party implements sampleStarted/sampleStopped.
By the way, I must say it's not clear for me when sampleStarted/sampleStopped were called before this commit. 2/ So, I wonder if it's a good idea to use this SampleListener interface ? 3/ I also wonder if we should not split SampleListener into 2 interfaces and deprecate it (as we did with TestListener which we deprecated). Indeed I looked at all implementations of it, even in 3rd party JMeterPlugins and no implementation uses sampleStarted/sampleStopped, all implement sampleOccured() Regards Philippe On Mon, Dec 14, 2015 at 9:52 PM, <[email protected]> wrote: > Author: sebb > Date: Mon Dec 14 20:52:19 2015 > New Revision: 1720012 > > URL: http://svn.apache.org/viewvc?rev=1720012&view=rev > Log: > Add Sample Timeout support > Bugzilla Id: 58736 > > Added: > > jmeter/trunk/src/components/org/apache/jmeter/modifiers/SampleTimeout.java > (with props) > > jmeter/trunk/src/components/org/apache/jmeter/modifiers/gui/SampleTimeoutGui.java > (with props) > jmeter/trunk/xdocs/images/screenshots/sample_timeout.png (with props) > Modified: > jmeter/trunk/bin/jmeter.properties > jmeter/trunk/bin/saveservice.properties > jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties > > jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties > jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java > jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java > jmeter/trunk/xdocs/changes.xml > jmeter/trunk/xdocs/usermanual/component_reference.xml > > Modified: jmeter/trunk/bin/jmeter.properties > URL: > http://svn.apache.org/viewvc/jmeter/trunk/bin/jmeter.properties?rev=1720012&r1=1720011&r2=1720012&view=diff > > ============================================================================== > --- jmeter/trunk/bin/jmeter.properties (original) > +++ jmeter/trunk/bin/jmeter.properties Mon Dec 14 20:52:19 2015 > @@ -1035,6 +1035,11 @@ beanshell.server.file=../extras/startup. > # Uncomment the following line to revert to the original behaviour > #jmeterthread.reversePostProcessors=true > > +# (2.14) JMeterThread behaviour has changed: it now implements > sampleStarted/sampleStopped > +# This is necessary for the test element Sample Timeout > +# Uncomment the following line to revert to the original behaviour > (Sample Timeout will no longer work) > +#JMeterThread.sampleStarted=false > + > # (2.2) StandardJMeterEngine behaviour has been changed to notify the > listeners after > # the running version is enabled. This is so they can access variables. > # In case this causes problems, the previous behaviour can be restored by > uncommenting > > Modified: jmeter/trunk/bin/saveservice.properties > URL: > http://svn.apache.org/viewvc/jmeter/trunk/bin/saveservice.properties?rev=1720012&r1=1720011&r2=1720012&view=diff > > ============================================================================== > --- jmeter/trunk/bin/saveservice.properties (original) > +++ jmeter/trunk/bin/saveservice.properties Mon Dec 14 20:52:19 2015 > @@ -269,6 +269,8 @@ ResultSaverGui=org.apache.jmeter.reporte > RunTime=org.apache.jmeter.control.RunTime > RunTimeGui=org.apache.jmeter.control.gui.RunTimeGui > SampleSaveConfiguration=org.apache.jmeter.samplers.SampleSaveConfiguration > +SampleTimeout=org.apache.jmeter.modifiers.SampleTimeout > +SampleTimeoutGui=org.apache.jmeter.modifiers.gui.SampleTimeoutGui > SimpleConfigGui=org.apache.jmeter.config.gui.SimpleConfigGui > SimpleDataWriter=org.apache.jmeter.visualizers.SimpleDataWriter > SizeAssertion=org.apache.jmeter.assertions.SizeAssertion > > Added: > jmeter/trunk/src/components/org/apache/jmeter/modifiers/SampleTimeout.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/modifiers/SampleTimeout.java?rev=1720012&view=auto > > ============================================================================== > --- > jmeter/trunk/src/components/org/apache/jmeter/modifiers/SampleTimeout.java > (added) > +++ > jmeter/trunk/src/components/org/apache/jmeter/modifiers/SampleTimeout.java > Mon Dec 14 20:52:19 2015 > @@ -0,0 +1,230 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You under the Apache License, Version 2.0 > + * (the "License"); you may not use this file except in compliance with > + * the License. You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + * > + */ > + > +package org.apache.jmeter.modifiers; > + > +import java.io.Serializable; > +import java.util.concurrent.Callable; > +import java.util.concurrent.Executors; > +import java.util.concurrent.ScheduledExecutorService; > +import java.util.concurrent.ScheduledFuture; > +import java.util.concurrent.ThreadFactory; > +import java.util.concurrent.TimeUnit; > + > +import org.apache.jmeter.samplers.Interruptible; > +import org.apache.jmeter.samplers.SampleEvent; > +import org.apache.jmeter.samplers.SampleListener; > +import org.apache.jmeter.samplers.Sampler; > +import org.apache.jmeter.testelement.AbstractTestElement; > +import org.apache.jmeter.testelement.TestElement; > +import org.apache.jmeter.testelement.ThreadListener; > +import org.apache.jmeter.threads.JMeterContext; > +import org.apache.jmeter.threads.JMeterContextService; > +import org.apache.jmeter.util.JMeterUtils; > +import org.apache.jorphan.logging.LoggingManager; > +import org.apache.log.Logger; > + > +/** > + * > + * Sample timeout implementation using Executor threads > + * > + */ > +public class SampleTimeout extends AbstractTestElement implements > Serializable, ThreadListener, SampleListener { > + > + private static final long serialVersionUID = 1L; > + > + private static final Logger LOG = LoggingManager.getLoggerForClass(); > + > + private static final String TIMEOUT = "InterruptTimer.timeout"; > //$NON-NLS-1$ > + > + private final boolean useRunnable = > JMeterUtils.getPropDefault("InterruptTimer.useRunnable", false); > + > + private static class TPOOLHolder { > + static final ScheduledExecutorService EXEC_SERVICE = > + Executors.newScheduledThreadPool(1, > + new ThreadFactory() { > + public Thread newThread(Runnable r) { > + Thread t = > Executors.defaultThreadFactory().newThread(r); > + t.setDaemon(true); // also ensures that > Executor thread is daemon > + return t; > + } > + }); > + } > + > + private static ScheduledExecutorService getExecutorService() { > + return TPOOLHolder.EXEC_SERVICE; > + } > + > + private JMeterContext context; // Cache this here to avoid refetching > + > + private ScheduledFuture<?> future; > + > + private final transient ScheduledExecutorService execService; > + > + private final boolean debug; > + > + /** > + * No-arg constructor. > + */ > + public SampleTimeout() { > +// LOG.setPriority(org.apache.log.Priority.DEBUG); // for local > debugging when enabled > + debug = LOG.isDebugEnabled(); > + execService = getExecutorService(); > + if (debug) { > + LOG.debug(whoAmI("InterruptTimer()", this)); > + } > + } > + > + /** > + * Set the timeout for this timer. > + * @param timeout The timeout for this timer > + */ > + public void setTimeout(String timeout) { > + setProperty(TIMEOUT, timeout); > + } > + > + /** > + * Get the timeout value for display. > + * > + * @return the timeout value for display. > + */ > + public String getTimeout() { > + return getPropertyAsString(TIMEOUT); > + } > + > + @Override > + public void sampleStarted(SampleEvent e) { > + if (debug) { > + LOG.debug(whoAmI("sampleStarted()", this)); > + } > + createTask(); > + } > + > + @Override > + public void sampleStopped(SampleEvent e) { > + if (debug) { > + LOG.debug(whoAmI("sampleStopped()", this)); > + } > + cancelTask(); > + } > + > + private void createTask() { > + long timeout = getPropertyAsLong(TIMEOUT); // refetch each time > so it can be a variable > + if (timeout <= 0) { > + return; > + } > + final Sampler samp = context.getCurrentSampler(); > + if (!(samp instanceof Interruptible)) { // may be applied to a > whole test > + return; // Cannot time out in this case > + } > + final Interruptible sampler = (Interruptible) samp; > + > + if (useRunnable) { > + Runnable run=new Runnable() { > + public void run() { > + long start = System.nanoTime(); > + boolean interrupted = sampler.interrupt(); > + String elapsed = > Double.toString((double)(System.nanoTime()-start)/ 1000000000)+" secs"; > + if (interrupted) { > + LOG.warn("Run Done interrupting " + getInfo(samp) > + " took " + elapsed); > + } else { > + if (debug) { > + LOG.debug("Run Didn't interrupt: " + > getInfo(samp) + " took " + elapsed); > + } > + } > + } > + }; > + // schedule the interrupt to occur and save for possible > cancellation > + future = execService.schedule(run, timeout, > TimeUnit.MILLISECONDS); > + } else { > + Callable<Object> call = new Callable<Object>() { > + @Override > + public Object call() throws Exception { > + long start = System.nanoTime(); > + boolean interrupted = sampler.interrupt(); > + String elapsed = > Double.toString((double)(System.nanoTime()-start)/ 1000000000)+" secs"; > + if (interrupted) { > + LOG.warn("Call Done interrupting " + > getInfo(samp) + " took " + elapsed); > + } else { > + if (debug) { > + LOG.debug("Call Didn't interrupt: " + > getInfo(samp) + " took " + elapsed); > + } > + } > + return null; > + } > + > + }; > + // schedule the interrupt to occur and save for possible > cancellation > + future = execService.schedule(call, timeout, > TimeUnit.MILLISECONDS); > + } > + if (debug) { > + LOG.debug("Scheduled timer: @" + > System.identityHashCode(future) + " " + getInfo(samp)); > + } > + } > + > + @Override > + public void threadStarted() { > + if (debug) { > + LOG.debug(whoAmI("threadStarted()", this)); > + } > + context = JMeterContextService.getContext(); > + } > + > + @Override > + public void threadFinished() { > + if (debug) { > + LOG.debug(whoAmI("threadFinished()", this)); > + } > + cancelTask(); // cancel final if any > + } > + > + /** > + * Provide a description of this class. > + * > + * @return the description of this class. > + */ > + @Override > + public String toString() { > + return JMeterUtils.getResString("sample_timeout_memo"); > //$NON-NLS-1$ > + } > + > + private String whoAmI(String id, TestElement o) { > + return id + " @" + System.identityHashCode(o)+ " '"+ o.getName() > + "' " + (debug ? Thread.currentThread().getName() : ""); > + } > + > + private String getInfo(TestElement o) { > + return whoAmI(o.getClass().getSimpleName(), o); > + } > + > + private void cancelTask() { > + if (future != null) { > + if (!future.isDone()) { > + boolean cancelled = future.cancel(false); > + if (debug) { > + LOG.debug("Cancelled timer: @" + > System.identityHashCode(future) + " with result " + cancelled); > + } > + } > + future = null; > + } > + } > + > + @Override > + public void sampleOccurred(SampleEvent e) { > + // Not used > + } > +} > > Propchange: > jmeter/trunk/src/components/org/apache/jmeter/modifiers/SampleTimeout.java > > ------------------------------------------------------------------------------ > svn:eol-style = native > > Added: > jmeter/trunk/src/components/org/apache/jmeter/modifiers/gui/SampleTimeoutGui.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/modifiers/gui/SampleTimeoutGui.java?rev=1720012&view=auto > > ============================================================================== > --- > jmeter/trunk/src/components/org/apache/jmeter/modifiers/gui/SampleTimeoutGui.java > (added) > +++ > jmeter/trunk/src/components/org/apache/jmeter/modifiers/gui/SampleTimeoutGui.java > Mon Dec 14 20:52:19 2015 > @@ -0,0 +1,133 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You under the Apache License, Version 2.0 > + * (the "License"); you may not use this file except in compliance with > + * the License. You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + * > + */ > + > +package org.apache.jmeter.modifiers.gui; > + > +import javax.swing.Box; > +import javax.swing.JComponent; > +import javax.swing.JLabel; > +import javax.swing.JOptionPane; > +import javax.swing.JTextField; > + > +import org.apache.jmeter.modifiers.SampleTimeout; > +import org.apache.jmeter.processor.gui.AbstractPreProcessorGui; > +import org.apache.jmeter.testelement.TestElement; > +import org.apache.jmeter.util.JMeterUtils; > +import org.apache.jorphan.gui.layout.VerticalLayout; > + > +/** > + * The GUI for SampleTimeout. > + */ > +public class SampleTimeoutGui extends AbstractPreProcessorGui { > + > + private static final long serialVersionUID = 240L; > + > + /** > + * The default value for the timeout. > + */ > + private static final String DEFAULT_TIMEOUT = "10000"; > + > + private JTextField timeoutField; > + > + /** > + * No-arg constructor. > + */ > + public SampleTimeoutGui() { > + init(); > + } > + > + /** > + * Handle an error. > + * > + * @param e > + * the Exception that was thrown. > + * @param thrower > + * the JComponent that threw the Exception. > + */ > + public static void error(Exception e, JComponent thrower) { > + JOptionPane.showMessageDialog(thrower, e, "Error", > JOptionPane.ERROR_MESSAGE); > + } > + > + @Override > + public String getLabelResource() { > + return "sample_timeout_title"; // $NON-NLS-1$ > + } > + > + /** > + * Create the test element underlying this GUI component. > + * > + * @see org.apache.jmeter.gui.JMeterGUIComponent#createTestElement() > + */ > + @Override > + public TestElement createTestElement() { > + SampleTimeout timer = new SampleTimeout(); > + modifyTestElement(timer); > + return timer; > + } > + > + /** > + * Modifies a given TestElement to mirror the data in the gui > components. > + * > + * @see > org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement) > + */ > + @Override > + public void modifyTestElement(TestElement timer) { > + this.configureTestElement(timer); > + ((SampleTimeout) timer).setTimeout(timeoutField.getText()); > + } > + > + /** > + * Configure this GUI component from the underlying TestElement. > + * > + * @see > org.apache.jmeter.gui.JMeterGUIComponent#configure(TestElement) > + */ > + @Override > + public void configure(TestElement el) { > + super.configure(el); > + timeoutField.setText(((SampleTimeout) el).getTimeout()); > + } > + > + /** > + * Initialize this component. > + */ > + private void init() { > + setLayout(new VerticalLayout(5, VerticalLayout.BOTH, > VerticalLayout.TOP)); > + > + setBorder(makeBorder()); > + add(makeTitlePanel()); > + > + Box timeoutPanel = Box.createHorizontalBox(); > + JLabel timeoutLabel = new > JLabel(JMeterUtils.getResString("sample_timeout_timeout"));//$NON-NLS-1$ > + timeoutPanel.add(timeoutLabel); > + > + timeoutField = new JTextField(6); > + timeoutField.setText(DEFAULT_TIMEOUT); > + timeoutPanel.add(timeoutField); > + > + add(timeoutPanel); > + } > + > + /** > + * {@inheritDoc} > + */ > + @Override > + public void clearGui() { > + timeoutField.setText(DEFAULT_TIMEOUT); > + super.clearGui(); > + } > +} > > Propchange: > jmeter/trunk/src/components/org/apache/jmeter/modifiers/gui/SampleTimeoutGui.java > > ------------------------------------------------------------------------------ > svn:eol-style = native > > Modified: > jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1720012&r1=1720011&r2=1720012&view=diff > > ============================================================================== > --- jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties > (original) > +++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties > Mon Dec 14 20:52:19 2015 > @@ -914,6 +914,9 @@ sampler_on_error_start_next_loop=Start N > sampler_on_error_stop_test=Stop Test > sampler_on_error_stop_test_now=Stop Test Now > sampler_on_error_stop_thread=Stop Thread > +sample_timeout_memo=Interrupt the sampler if it times out > +sample_timeout_timeout=Sample timeout (in milliseconds)\: > +sample_timeout_title=Sample Timeout > save=Save > save?=Save? > save_all_as=Save Test Plan as > > Modified: > jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1720012&r1=1720011&r2=1720012&view=diff > > ============================================================================== > --- > jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties > (original) > +++ > jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties > Mon Dec 14 20:52:19 2015 > @@ -893,6 +893,9 @@ sample_scope_children=Les ressources li\ > sample_scope_parent=L'\u00E9chantillon > sample_scope_variable=Une variable \: > sampler_label=Libell\u00E9 > +sample_timeout_memo=Interrompre l'\u00E9chantillon si le d\u00E9lai est > d\u00E9pass\u00E9 > +sample_timeout_timeout=D\u00E9lai d'attente avant interruption (en > millisecondes) \: > +sample_timeout_title=Compteur Interruption > sampler_on_error_action=Action \u00E0 suivre apr\u00E8s une erreur > d'\u00E9chantillon > sampler_on_error_continue=Continuer > sampler_on_error_start_next_loop=D\u00E9marrer it\u00E9ration suivante > > Modified: jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java?rev=1720012&r1=1720011&r2=1720012&view=diff > > ============================================================================== > --- jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java > (original) > +++ jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java Mon Dec > 14 20:52:19 2015 > @@ -192,7 +192,7 @@ public class SaveService { > private static String fileVersion = ""; // computed from > saveservice.properties file// $NON-NLS-1$ > // Must match the sha1 checksum of the file saveservice.properties > (without newline character), > // used to ensure saveservice.properties and SaveService are updated > simultaneously > - static final String FILEVERSION = > "3136d9168702a07555b110a86f7ba4da4ab88346"; // Expected value $NON-NLS-1$ > + static final String FILEVERSION = > "7bc78392d5d18fc977b789d99aea6e790f9816f2"; // Expected value $NON-NLS-1$ > > private static String fileEncoding = ""; // read from properties > file// $NON-NLS-1$ > > > Modified: jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java?rev=1720012&r1=1720011&r2=1720012&view=diff > > ============================================================================== > --- jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java > (original) > +++ jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java Mon > Dec 14 20:52:19 2015 > @@ -65,6 +65,11 @@ import org.apache.log.Logger; > public class JMeterThread implements Runnable, Interruptible { > private static final Logger log = LoggingManager.getLoggerForClass(); > > + public static final boolean IMPLEMENTS_SAMPLE_STARTED = > JMeterUtils.getPropDefault("temp.sampleStarted", true); > + static { > + log.info("IMPLEMENTS_SAMPLE_STARTED="+IMPLEMENTS_SAMPLE_STARTED); > + } > + > public static final String PACKAGE_OBJECT = "JMeterThread.pack"; // > $NON-NLS-1$ > > public static final String LAST_SAMPLE_OK = > "JMeterThread.last_sample_ok"; // $NON-NLS-1$ > @@ -449,7 +454,24 @@ public class JMeterThread implements Run > > // Perform the actual sample > currentSampler = sampler; > + if (IMPLEMENTS_SAMPLE_STARTED) { > + for(SampleListener listener : pack.getSampleListeners()) { > + try { > + TestBeanHelper.prepare((TestElement) listener); > + listener.sampleStarted(null); > + } catch (RuntimeException e) { > + log.error("Detected problem in Listener: ", e); > + log.info("Continuing to process further listeners"); > + } > + } > + } > SampleResult result = sampler.sample(null); // TODO: remove this > useless Entry parameter > + if (IMPLEMENTS_SAMPLE_STARTED) { > + for(SampleListener listener : pack.getSampleListeners()) { > + // We don't need to prepare these again here > + listener.sampleStopped(null); > + } > + } > currentSampler = null; > > // If we got any results, then perform processing on the result > > Modified: jmeter/trunk/xdocs/changes.xml > URL: > http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1720012&r1=1720011&r2=1720012&view=diff > > ============================================================================== > --- jmeter/trunk/xdocs/changes.xml (original) > +++ jmeter/trunk/xdocs/changes.xml Mon Dec 14 20:52:19 2015 > @@ -134,6 +134,7 @@ Summary > > <h3>General</h3> > <ul> > +<li><bug>58736</bug>Add Sample Timeout support</li> > <li><bug>57913</bug>Automated backups of last saved JMX files. > Contributed by Benoit Vatan (benoit.vatan at gmail.com)</li> > <li><bug>57988</bug>Shortcuts > (<keycombo><keysym>Ctrl</keysym><keysym>1</keysym></keycombo> … > <keycombo><keysym>Ctrl</keysym><keysym>9</keysym></keycombo>) to > quick add elements into test plan. > > Added: jmeter/trunk/xdocs/images/screenshots/sample_timeout.png > URL: > http://svn.apache.org/viewvc/jmeter/trunk/xdocs/images/screenshots/sample_timeout.png?rev=1720012&view=auto > > ============================================================================== > Binary file - no diff available. > > Propchange: jmeter/trunk/xdocs/images/screenshots/sample_timeout.png > > ------------------------------------------------------------------------------ > svn:mime-type = image/png > > Modified: jmeter/trunk/xdocs/usermanual/component_reference.xml > URL: > http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=1720012&r1=1720011&r2=1720012&view=diff > > ============================================================================== > --- jmeter/trunk/xdocs/usermanual/component_reference.xml (original) > +++ jmeter/trunk/xdocs/usermanual/component_reference.xml Mon Dec 14 > 20:52:19 2015 > @@ -5613,6 +5613,36 @@ this one will be used by "<code>Calculat > <link href="../demos/RegEx-User-Parameters.jmx">Test Plan showing > how to use RegEx User Parameters</link> > </links> > > +<component name="Sample Timeout" index="§-num;.7.11" > anchor="interrupt" width="316" height="138" screenshot="sample_timeout.png"> > +<description> > +<note>BETA CODE - the test element may be moved or replaced in a future > release</note> > +<p>This Pre-Processor schedules a timer task to interrupt a sample if it > takes too long to complete. > +The timeout is ignored if it is zero or negative. > +For this to work, the sampler must implement Interruptible. > +The following samplers are known to do so:<br></br> > +AJP, BeanShell, FTP, HTTP, Soap, AccessLog, MailReader, JMS Subscriber, > TCPSampler, TestAction, JavaSampler > +</p> > +<p> > +The test element is intended for use where individual timeouts such as > Connection Timeout or Response Timeout are insufficient, > +or where the Sampler does not support timeouts. > +The timeout should be set sufficiently long so that it is not triggered > in normal tests, but short enough that it interrupts samples > +that are stuck. > +</p> > +<p> > +[By default, JMeter uses a Callable to interrupt the sampler. > +This executes in the same thread as the timer, so if the interrupt takes > a long while, > +it may delay the processing of subsequent timeouts. > +This is not expected to be a problem, but if necessary the property > <code>InterruptTimer.useRunnable</code> > +can be set to <code>true</code> to use a separate Runnable thread instead > of the Callable.] > +</p> > +</description> > + > +<properties> > + <property name="Name" required="No">Descriptive name for this > timer that is shown in the tree.</property> > + <property name="Sampler Timeout" required="Yes">If the sample > takes longer to complete, it will be interrupted.</property> > +</properties> > +</component> > + > <a href="#">^</a> > > </section> > > > -- Cordialement. Philippe Mouawad.
