Thanks!
On 28 August 2015 at 21:03, Milamber <[email protected]> wrote: > > Done. > > > > On 28/08/2015 20:11, sebb AT ASF wrote: >> >> I've not updated messages_fr.properties - would one of you be able to >> do so please? >> >> On 28 August 2015 at 20:08, <[email protected]> wrote: >>> >>> Author: sebb >>> Date: Fri Aug 28 19:08:36 2015 >>> New Revision: 1698393 >>> >>> URL: http://svn.apache.org/r1698393 >>> Log: >>> Add interrupt Timer >>> Bugzilla Id: 58299 >>> >>> Added: >>> >>> jmeter/trunk/src/components/org/apache/jmeter/timers/InterruptTimer.java >>> (with props) >>> >>> jmeter/trunk/src/components/org/apache/jmeter/timers/gui/InterruptTimerGui.java >>> (with props) >>> jmeter/trunk/xdocs/images/screenshots/timers/interrupt_timer.png >>> (with props) >>> Modified: >>> jmeter/trunk/bin/saveservice.properties >>> >>> jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties >>> jmeter/trunk/xdocs/changes.xml >>> jmeter/trunk/xdocs/usermanual/component_reference.xml >>> >>> Modified: jmeter/trunk/bin/saveservice.properties >>> URL: >>> http://svn.apache.org/viewvc/jmeter/trunk/bin/saveservice.properties?rev=1698393&r1=1698392&r2=1698393&view=diff >>> >>> ============================================================================== >>> --- jmeter/trunk/bin/saveservice.properties (original) >>> +++ jmeter/trunk/bin/saveservice.properties Fri Aug 28 19:08:36 2015 >>> @@ -165,6 +165,8 @@ IncludeController=org.apache.jmeter.cont >>> IncludeControllerGui=org.apache.jmeter.control.gui.IncludeControllerGui >>> InterleaveControl=org.apache.jmeter.control.InterleaveControl >>> InterleaveControlGui=org.apache.jmeter.control.gui.InterleaveControlGui >>> +InterruptTimer=org.apache.jmeter.timers.InterruptTimer >>> +InterruptTimerGui=org.apache.jmeter.timers.gui.InterruptTimerGui >>> JavaConfig=org.apache.jmeter.protocol.java.config.JavaConfig >>> JavaConfigGui=org.apache.jmeter.protocol.java.config.gui.JavaConfigGui >>> JavaSampler=org.apache.jmeter.protocol.java.sampler.JavaSampler >>> >>> Added: >>> jmeter/trunk/src/components/org/apache/jmeter/timers/InterruptTimer.java >>> URL: >>> http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/timers/InterruptTimer.java?rev=1698393&view=auto >>> >>> ============================================================================== >>> --- >>> jmeter/trunk/src/components/org/apache/jmeter/timers/InterruptTimer.java >>> (added) >>> +++ >>> jmeter/trunk/src/components/org/apache/jmeter/timers/InterruptTimer.java Fri >>> Aug 28 19:08:36 2015 >>> @@ -0,0 +1,123 @@ >>> +package org.apache.jmeter.timers; >>> + >>> +import java.io.Serializable; >>> +import java.util.concurrent.Executors; >>> +import java.util.concurrent.ScheduledExecutorService; >>> +import java.util.concurrent.ScheduledFuture; >>> +import java.util.concurrent.TimeUnit; >>> + >>> +import org.apache.jmeter.engine.event.LoopIterationEvent; >>> +import org.apache.jmeter.engine.event.LoopIterationListener; >>> +import org.apache.jmeter.samplers.Interruptible; >>> +import org.apache.jmeter.samplers.Sampler; >>> +import org.apache.jmeter.testelement.AbstractTestElement; >>> +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; >>> + >>> +public class InterruptTimer extends AbstractTestElement implements >>> Timer, Serializable, LoopIterationListener { >>> + >>> + private static final long serialVersionUID = 1L; >>> + >>> + private static final Logger LOG = >>> LoggingManager.getLoggerForClass(); >>> + >>> + private static final String TIMEOUT = "InterruptTimer.timeout"; >>> //$NON-NLS-1$ >>> + >>> + private long timeout = 0; >>> + >>> + private JMeterContext context; >>> + >>> + private ScheduledFuture<?> future; >>> + >>> + private ScheduledExecutorService tpool; >>> + >>> + private final boolean debug; >>> + >>> + /** >>> + * No-arg constructor. >>> + */ >>> + public InterruptTimer() { >>> + debug = LOG.isDebugEnabled(); // TODO is this the best place for >>> 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); >>> + } >>> + >>> + /** >>> + * Retrieve the delay to use during test execution. >>> + * This is called just before starting a sampler. >>> + * It is used to schedule future task to interrupt the sampler. >>> + * >>> + * @return Always returns zero, because this timer does not wait >>> + */ >>> + @Override >>> + public long delay() { >>> + if (future != null) { >>> + if (!future.isDone()) { >>> + boolean cancelled = future.cancel(false); >>> + if (debug) { >>> + LOG.debug("Cancelled the task:" + future + " with >>> result " + cancelled); >>> + } >>> + } >>> + future = null; >>> + } >>> + if (timeout <= 0) { >>> + return 0; >>> + } >>> + final Sampler samp = context.getCurrentSampler(); >>> + if (!(samp instanceof Interruptible)) { >>> + // Log this? >>> + return 0; >>> + } >>> + final Interruptible sampler = (Interruptible) samp; >>> + Runnable run=new Runnable() { >>> + public void run() { >>> + boolean interrupted = sampler.interrupt(); >>> + if (interrupted) { >>> + LOG.warn("The sampler " + samp.getName() + " was >>> interrupted."); >>> + } >>> + } >>> + }; >>> + // schedule the interrupt to occur >>> + future = tpool.schedule(run, timeout, TimeUnit.MILLISECONDS); >>> + return 0; >>> + } >>> + >>> + /** >>> + * Provide a description of this timer class. >>> + * >>> + * @return the description of this timer class. >>> + */ >>> + @Override >>> + public String toString() { >>> + return JMeterUtils.getResString("interrupt_timer_memo"); >>> //$NON-NLS-1$ >>> + } >>> + >>> + /** >>> + * Gain access to any variables that have been defined. >>> + * >>> + * @see LoopIterationListener#iterationStart(LoopIterationEvent) >>> + */ >>> + @Override >>> + public void iterationStart(LoopIterationEvent event) { >>> + timeout = getPropertyAsLong(TIMEOUT); >>> + context = JMeterContextService.getContext(); // TODO is this >>> called from the correct thread? >>> + tpool = Executors.newScheduledThreadPool(1); // ditto >>> + } >>> +} >>> >>> Propchange: >>> jmeter/trunk/src/components/org/apache/jmeter/timers/InterruptTimer.java >>> >>> ------------------------------------------------------------------------------ >>> svn:eol-style = native >>> >>> Added: >>> jmeter/trunk/src/components/org/apache/jmeter/timers/gui/InterruptTimerGui.java >>> URL: >>> http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/timers/gui/InterruptTimerGui.java?rev=1698393&view=auto >>> >>> ============================================================================== >>> --- >>> jmeter/trunk/src/components/org/apache/jmeter/timers/gui/InterruptTimerGui.java >>> (added) >>> +++ >>> jmeter/trunk/src/components/org/apache/jmeter/timers/gui/InterruptTimerGui.java >>> Fri Aug 28 19:08:36 2015 >>> @@ -0,0 +1,131 @@ >>> +/* >>> + * 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.timers.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.testelement.TestElement; >>> +import org.apache.jmeter.timers.InterruptTimer; >>> +import org.apache.jmeter.util.JMeterUtils; >>> +import org.apache.jorphan.gui.layout.VerticalLayout; >>> + >>> +/** >>> + * The GUI for InterruptTimer. >>> + * >>> + */ >>> +public class InterruptTimerGui extends AbstractTimerGui { >>> + 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 InterruptTimerGui() { >>> + 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 "interrupt_timer_title"; // $NON-NLS-1$ >>> + } >>> + >>> + /** >>> + * Create the test element underlying this GUI component. >>> + * >>> + * @see org.apache.jmeter.gui.JMeterGUIComponent#createTestElement() >>> + */ >>> + @Override >>> + public TestElement createTestElement() { >>> + InterruptTimer timer = new InterruptTimer(); >>> + 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); >>> + ((InterruptTimer) 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(((InterruptTimer) 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("interrupt_timer_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/timers/gui/InterruptTimerGui.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=1698393&r1=1698392&r2=1698393&view=diff >>> >>> ============================================================================== >>> --- jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties >>> (original) >>> +++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties >>> Fri Aug 28 19:08:36 2015 >>> @@ -423,6 +423,9 @@ insert_after=Insert After >>> insert_before=Insert Before >>> insert_parent=Insert Parent >>> interleave_control_title=Interleave Controller >>> +interrupt_timer_memo=Interrupt the sampler if it times out >>> +interrupt_timer_timeout=Sampler timeout (in milliseconds)\: >>> +interrupt_timer_title=Interrupt Timer >>> intsum_param_1=First int to add. >>> intsum_param_2=Second int to add - further ints can be summed by adding >>> further arguments. >>> invalid_data=Invalid data >>> >>> Modified: jmeter/trunk/xdocs/changes.xml >>> URL: >>> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1698393&r1=1698392&r2=1698393&view=diff >>> >>> ============================================================================== >>> --- jmeter/trunk/xdocs/changes.xml (original) >>> +++ jmeter/trunk/xdocs/changes.xml Fri Aug 28 19:08:36 2015 >>> @@ -89,7 +89,7 @@ Summary >>> <h3>Other samplers</h3> >>> <ul> >>> <li><bug>57928</bug>Add ability to define protocol (http/https) to >>> AccessLogSampler GUI. Contributed by Jérémie Lesage (jeremie.lesage at >>> jeci.fr)</li> >>> - <li><bug>58300</bug> Make existing Java Samplers implement >>> interruptible</li> >>> + <li><bug>58300</bug> Make existing Java Samplers implement >>> Interruptible</li> >>> </ul> >>> >>> <h3>Controllers</h3> >>> @@ -104,6 +104,7 @@ Summary >>> >>> <h3>Timers, Assertions, Config, Pre- & Post-Processors</h3> >>> <ul> >>> +<li><bug>58299</bug>Add interrupt Timer</li> >>> </ul> >>> >>> <h3>Functions</h3> >>> >>> Added: jmeter/trunk/xdocs/images/screenshots/timers/interrupt_timer.png >>> URL: >>> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/images/screenshots/timers/interrupt_timer.png?rev=1698393&view=auto >>> >>> ============================================================================== >>> Binary file - no diff available. >>> >>> Propchange: >>> jmeter/trunk/xdocs/images/screenshots/timers/interrupt_timer.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=1698393&r1=1698392&r2=1698393&view=diff >>> >>> ============================================================================== >>> --- jmeter/trunk/xdocs/usermanual/component_reference.xml (original) >>> +++ jmeter/trunk/xdocs/usermanual/component_reference.xml Fri Aug 28 >>> 19:08:36 2015 >>> @@ -5236,6 +5236,23 @@ to the random delay.</property> >>> >>> </component> >>> >>> +<component name="Interrupt Timer" index="§-num;.6.1" >>> anchor="interrupt" width="336" height="148" >>> screenshot="timers/interrupt_timer.png"> >>> +<description> >>> +<p>This is not strictly a timer, as it does not cause a delay before a >>> sampler. >>> +Instead it interrupts the sampler if that has taken longer than the >>> timeout. >>> +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 >>> +</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 sampler >>> takes longer to complete, it will be interrupted.</property> >>> +</properties> >>> +</component> >>> + >>> + >>> <a href="#">^</a> >>> >>> </section> >>> >>> >
