Commit a4fc7dca authored by Andre Freyssinet's avatar Andre Freyssinet

Multiple enhancements.

parent dddb5cde
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
*/ */
package org.ow2.joram.tools.jmscheck; package org.ow2.joram.tools.jmscheck;
import javax.naming.InitialContext; import javax.naming.InitialContext;
import org.objectweb.util.monolog.api.BasicLevel; import org.objectweb.util.monolog.api.BasicLevel;
...@@ -32,6 +31,32 @@ import org.osgi.framework.BundleContext; ...@@ -32,6 +31,32 @@ import org.osgi.framework.BundleContext;
import fr.dyade.aaa.agent.AgentServer; import fr.dyade.aaa.agent.AgentServer;
import fr.dyade.aaa.common.Debug; import fr.dyade.aaa.common.Debug;
/**
* This component regularly tests the state of a JMS connector and publishes the results to JMX.
* <br>
* It is configured through a set of OSGi properties:<ul>
* <li>org.ow2.joram.check.jndi.file: Path of JNDI properties file. If not defined, Joram's
* default are used. "fr.dyade.aaa.jndi2.client.NamingContextFactory" for JNDI Factory,
* "localhost", and 16400 for host and port.<br>
* These values can be overloaded by specific properties below.</li>
* <li>org.ow2.joram.check.jndi.factory: Classname of the JNDI factory (cf java.naming.factory.initial
* property).</li>
* <li>org.ow2.joram.check.jndi.host: Hostname ou IP address of JNDI server.</li>
* <li>org.ow2.joram.check.jndi.port: Listening port of JNDI server.</li>
* <li>org.ow2.joram.check.period: Period between 2 checks, by default 60s.</li>
* <li>org.ow2.joram.check.timeout: Maximum amount of time to wait connecting and receiving
* messages, by default 10s.</li>
* </ul>
* For each JMS connector to monitor there is 4 properties to define:<ul>
* <li>org.ow2.joram.check.cf: JNDI name of the ConnectionFactory to use.</li>
* <li>org.ow2.joram.check.queue: Internal name of JMS destination.</li>
* <li>org.ow2.joram.check.user: User name for authentication, if no defined uses the
* ConnectionFactory default.</li>
* <li>org.ow2.joram.check.pass: Password for authentication, if no defined uses the
* ConnectionFactory default.</li>
* </ul>
* If there are multiple connectors to monitor, suffix each property with 1, 2, etc.
*/
public class Activator implements BundleActivator { public class Activator implements BundleActivator {
public static final Logger logger = Debug.getLogger(Activator.class.getName()); public static final Logger logger = Debug.getLogger(Activator.class.getName());
...@@ -144,7 +169,6 @@ public class Activator implements BundleActivator { ...@@ -144,7 +169,6 @@ public class Activator implements BundleActivator {
jmsStatus.start(); jmsStatus.start();
} }
// public synchronized Object lookup(String name) throws NamingException { // public synchronized Object lookup(String name) throws NamingException {
// if (logger.isLoggable(BasicLevel.DEBUG)) // if (logger.isLoggable(BasicLevel.DEBUG))
// logger.log(BasicLevel.DEBUG, "Helper.lookup " + name); // logger.log(BasicLevel.DEBUG, "Helper.lookup " + name);
......
/*
* Copyright (C) 2020 ScalAgent Distributed Technologies
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Initial developer(s): ScalAgent Distributed Technologies
* Contributor(s):
*/
package org.ow2.joram.tools.jmscheck; package org.ow2.joram.tools.jmscheck;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import javax.naming.InitialContext; import javax.naming.InitialContext;
...@@ -8,31 +32,120 @@ import org.objectweb.util.monolog.api.Logger; ...@@ -8,31 +32,120 @@ import org.objectweb.util.monolog.api.Logger;
import fr.dyade.aaa.common.Debug; import fr.dyade.aaa.common.Debug;
/**
* This client regularly tests the state of a JMS connector and publishes the results to JMX.
* <br><br>
* usage: java -DJNDI_FILE=./jndi.properties -DPERIOD=1 -DTIMEOUT=5000<br>
* <dd>-DCF=cf -DQUEUE=queue</dd>
* <dd>-jar jmscheck.jar [help]</dd>
* <br>
* Options, set by Java environment variable ("-Dproperty=value" in command line):<ul>
* <li>JNDI_FILE: Path of JNDI properties file. If not defined, Joram's default are
* used. "fr.dyade.aaa.jndi2.client.NamingContextFactory" for JNDI Factory,
* "localhost", and 16400 for host and port.<br>
* These values can be overloaded by specific properties below.</li>
* <li>JNDI_FACTORY: Classname of the JNDI factory (cf java.naming.factory.initial
* property).</li>
* <li>JNDI_HOST: Hostname ou IP address of JNDI server.</li>
* <li>JNDI_PORT: Listening port of JNDI server.</li>
*
* <li>PERIOD: Period between 2 checks, by default 60s.</li>
* <li>TIMEOUT: Maximum amount of time to wait connecting and receiving messages,
* by default 10s.</li>
* <br>
* For each JMS connector to monitor there is 4 properties to define:<ul>
* <li>CF: JNDI name of the ConnectionFactory to use.</li>
* <li>QUEUE: Internal name of JMS destination.</li>
* <li>USER: User name for authentication, if no defined uses the ConnectionFactory
* default.</li>
* <li>PASS: Password for authentication, if no defined uses the ConnectionFactory
* default.</li>
* </ul>
* If there are multiple connectors to monitor, suffix each property with 1, 2,
* 3, etc.
* <br>
* All these properties can be defined in a file whose name is given by the
* CONF_FILE property. In this case the other properties defined in the command
* line are ignored.
*/
public class JMSCheck { public class JMSCheck {
public static final Logger logger = Debug.getLogger(JMSCheck.class.getName()); public static final Logger logger = Debug.getLogger(JMSCheck.class.getName());
public final static String GLOBAL_PERIOD = "period"; public final static String GLOBAL_PERIOD = "PERIOD";
public final static String GLOBAL_TIMEOUT = "timeout"; public final static String GLOBAL_TIMEOUT = "TIMEOUT";
public final static String JNDI_FILE = "jndi.file"; public static final String JNDI_FILE = "JNDI_FILE";
public final static String JNDI_FACTORY = "jndi.factory";
public final static String JNDI_HOST = "jndi.host";
public final static String JNDI_PORT = "jndi.port";
public static final String CF_NAME = "cf"; public static final String JNDI_FACTORY = "JNDI_FACTORY";
public static final String JNDI_HOST = "JNDI_HOST";
public static final String JNDI_PORT = "JNDI_PORT";
public static final String CF_NAME = "CF";
public static final String USER_NAME = "user"; public static final String USER_NAME = "USER";
public static final String PASSWORD = "password"; public static final String PASSWORD = "PASS";
public static final String QUEUE_NAME = "QUEUE";
public static final String CONF_FILE = "CONF_FILE";
public static final String QUEUE_NAME = "queue";
static int period, timeout; static int period, timeout;
static JMSStatus jmsStatus; static JMSStatus jmsStatus;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
if (args.length != 0) {
System.out.println("usage: java -DJNDI_FILE=./jndi.properties -DPERIOD=1 -DTIMEOUT=5000\n" +
"\t-DCF=cf -DQUEUE=queue\n" +
"\t-jar jmscheck.jar [help]\n");
System.err.println("Options, set by Java environment variable (\"-Dproperty=value\" in command line)");
System.err.println(" - JNDI_FILE: Path of JNDI properties file. If not defined, Joram's default are\n" +
" used. \"fr.dyade.aaa.jndi2.client.NamingContextFactory\" for JNDI Factory,\n" +
" \"localhost\", and 16400 for host and port.\n" +
" These values can be overloaded by specific properties below.");
System.err.println(" - JNDI_FACTORY: Classname of the JNDI factory (cf java.naming.factory.initial\n" +
" property).");
System.err.println(" - JNDI_HOST: Hostname ou IP address of JNDI server.");
System.err.println(" - JNDI_PORT: Listening port of JNDI server.\n");
System.err.println(" - PERIOD: Period between 2 checks, by default 60s.");
System.err.println(" - TIMEOUT: Maximum amount of time to wait connecting and receiving messages,\n" +
" by default 10s.\n");
System.err.println("For each JMS connector to monitor there is 4 properties to define:");
System.err.println(" - CF: JNDI name of the ConnectionFactory to use.");
System.err.println(" - QUEUE: Internal name of JMS destination.");
System.err.println(" - USER: User name for authentication, if no defined uses the ConnectionFactory\n" +
" default.");
System.err.println(" - PASS: Password for authentication, if no defined uses the ConnectionFactory\n" +
" default.");
System.err.println("If there are multiple connectors to monitor, suffix each property with 1, 2, \n" +
" 3, etc.\n");
System.err.println("All these properties can be defined in a file whose name is given by the \n" +
"CONF_FILE property. In this case the other properties defined in the command\n" +
"line are ignored.");
System.exit(0);
}
String conf = System.getProperty(CONF_FILE);
Properties props = null;
if (conf != null) {
try {
props = new Properties();
props.load(new FileInputStream(conf));
} catch (IOException exc) {
System.err.println("Cannot read properties from \"" + conf + "\": " + exc.getMessage());
System.exit(-1);
}
} else {
props = System.getProperties();
}
// Gets the global period. // Gets the global period.
period = JMSStatus.DFLT_PERIOD; period = JMSStatus.DFLT_PERIOD;
String value = System.getProperty(GLOBAL_PERIOD); String value = props.getProperty(GLOBAL_PERIOD);
if (value != null) { if (value != null) {
try { try {
period = Integer.parseInt(value); period = Integer.parseInt(value);
...@@ -46,7 +159,7 @@ public class JMSCheck { ...@@ -46,7 +159,7 @@ public class JMSCheck {
// Gets the global timeout. // Gets the global timeout.
timeout = JMSStatus.DFLT_TIMEOUT; timeout = JMSStatus.DFLT_TIMEOUT;
value = System.getProperty(GLOBAL_TIMEOUT); value = props.getProperty(GLOBAL_TIMEOUT);
if (value != null) { if (value != null) {
try { try {
timeout = Integer.parseInt(value); timeout = Integer.parseInt(value);
...@@ -59,16 +172,16 @@ public class JMSCheck { ...@@ -59,16 +172,16 @@ public class JMSCheck {
jmsStatus = new JMSStatus("Joram", period, timeout, null, 0, 0); jmsStatus = new JMSStatus("Joram", period, timeout, null, 0, 0);
String jndiFile = System.getProperty(JNDI_FILE); String jndiFile = props.getProperty(JNDI_FILE);
String jndiFactory = System.getProperty(JNDI_FACTORY); String jndiFactory = props.getProperty(JNDI_FACTORY);
String jndiHost = System.getProperty(JNDI_HOST); String jndiHost = props.getProperty(JNDI_HOST);
String jndiPort = System.getProperty(JNDI_PORT); String jndiPort = props.getProperty(JNDI_PORT);
InitialContext ictx = jmsStatus.getInitialContext(jndiFile, jndiFactory, jndiHost, jndiPort); InitialContext ictx = jmsStatus.getInitialContext(jndiFile, jndiFactory, jndiHost, jndiPort);
createConnector(jmsStatus, "", ictx); createConnector(props, jmsStatus, "", ictx);
for (int i=1;; i++) { for (int i=1;; i++) {
if (!createConnector(jmsStatus, "." + i, ictx)) break; if (!createConnector(props, jmsStatus, "." + i, ictx)) break;
} }
jmsStatus.start(); jmsStatus.start();
...@@ -82,12 +195,12 @@ public class JMSCheck { ...@@ -82,12 +195,12 @@ public class JMSCheck {
* @param ictx The InitialContext to use. * @param ictx The InitialContext to use.
* @return True if the component is successively created. * @return True if the component is successively created.
*/ */
private static boolean createConnector(JMSStatus jmsStatus, String suffix, InitialContext ictx) { private static boolean createConnector(Properties props, JMSStatus jmsStatus, String suffix, InitialContext ictx) {
String cfname = System.getProperty(CF_NAME + suffix); String cfname = props.getProperty(CF_NAME + suffix);
if (cfname != null) { if (cfname != null) {
String user = System.getProperty(USER_NAME + suffix); String user = props.getProperty(USER_NAME + suffix);
String pass = System.getProperty(PASSWORD + suffix); String pass = props.getProperty(PASSWORD + suffix);
String qname = System.getProperty(QUEUE_NAME + suffix); String qname = props.getProperty(QUEUE_NAME + suffix);
// TODO (AF): Allow to override period and timeout. // TODO (AF): Allow to override period and timeout.
jmsStatus.addConnectorStatus(cfname, ictx, user, pass, qname, period, timeout); jmsStatus.addConnectorStatus(cfname, ictx, user, pass, qname, period, timeout);
......
...@@ -44,12 +44,12 @@ import org.objectweb.util.monolog.api.Logger; ...@@ -44,12 +44,12 @@ import org.objectweb.util.monolog.api.Logger;
import fr.dyade.aaa.common.Debug; import fr.dyade.aaa.common.Debug;
import fr.dyade.aaa.util.management.MXWrapper; import fr.dyade.aaa.util.management.MXWrapper;
public class JMSConnectorStatus implements JMSConnectorStatusMBean { class JMSConnectorStatus implements JMSConnectorStatusMBean {
public static Logger logger = Debug.getLogger(JMSConnectorStatus.class.getName()); static Logger logger = Debug.getLogger(JMSConnectorStatus.class.getName());
public static final int RUNNING = 0; public static final int RUNNING = 0;
public static final int UNREACHABLE = 1; public static final int UNREACHABLE = 1;
public static String[] info = { "RUNNING", "UNREACHABLE" }; static String[] info = { "RUNNING", "UNREACHABLE" };
/** retryStatusCount == 0 => RUNNING, retryStatusCount > 0 => UNREACHABLE */ /** retryStatusCount == 0 => RUNNING, retryStatusCount > 0 => UNREACHABLE */
private int retryStatusCount = UNREACHABLE; private int retryStatusCount = UNREACHABLE;
...@@ -187,6 +187,7 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean { ...@@ -187,6 +187,7 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean {
ScheduledFuture<?> callableHandle; ScheduledFuture<?> callableHandle;
/** /**
* Creates a JMS connectors healthcheck component.
* *
* @param jmsStatus Root component. * @param jmsStatus Root component.
* @param cfname JNDI name of the ConnectionFactory to use. * @param cfname JNDI name of the ConnectionFactory to use.
...@@ -198,7 +199,7 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean { ...@@ -198,7 +199,7 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean {
* @param period Period (in seconds) between 2 attempts of check. * @param period Period (in seconds) between 2 attempts of check.
* @param timeOut Maximum amount of time to wait either the connection or the message. * @param timeOut Maximum amount of time to wait either the connection or the message.
*/ */
public JMSConnectorStatus(JMSStatus jmsStatus, JMSConnectorStatus(JMSStatus jmsStatus,
String cfname, String cfname,
InitialContext ictx, InitialContext ictx,
String user, String pass, String user, String pass,
...@@ -242,33 +243,35 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean { ...@@ -242,33 +243,35 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean {
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
private void schedule() { private void schedule() {
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").schedule #1"); if (logger.isLoggable(BasicLevel.DEBUG))
logger.log(BasicLevel.DEBUG, "JMSConnectorStatus(" + cfname + ").schedule: " + period);
if (callableHandle != null && !callableHandle.isCancelled()) { if (callableHandle != null && !callableHandle.isCancelled()) {
callableHandle.cancel(true); callableHandle.cancel(true);
} }
if (period > 0) { if (period > 0) {
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").schedule #2");
callableHandle = JMSStatus.scheduler.scheduleAtFixedRate(new Runnable() { callableHandle = JMSStatus.scheduler.scheduleAtFixedRate(new Runnable() {
public void run() { public void run() {
try { try {
call(); check();
} catch (Throwable t) { } catch (Throwable t) {
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").schedule", t); logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").schedule", t);
} }
} }
}, period, period, TimeUnit.SECONDS); }, period, period, TimeUnit.SECONDS);
} }
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").schedule #3");
} }
public void call() { /**
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #1"); * Checks the related JMS connector, creates a connection, then sends and receives a message.
nbtry += 1; */
private void check() {
if (logger.isLoggable(BasicLevel.DEBUG))
logger.log(BasicLevel.DEBUG, "JMSConnectorStatus(" + cfname + ").check");
nbtry += 1;
try { try {
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #2 -> " + cf);
getConnectionFactory(); getConnectionFactory();
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #3 -> " + cf);
} catch (NamingException exc) { } catch (NamingException exc) {
failures += 1; failures += 1;
setStatus(getStatus()+1); setStatus(getStatus()+1);
...@@ -286,12 +289,10 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean { ...@@ -286,12 +289,10 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean {
try { try {
long start = System.nanoTime(); long start = System.nanoTime();
cf.getParameters().connectingTimer = timeout; cf.getParameters().connectingTimer = timeout;
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #4");
if ((user == null) || (pass == null)) if ((user == null) || (pass == null))
cnx = cf.createConnection(); cnx = cf.createConnection();
else else
cnx = cf.createConnection(user, pass); cnx = cf.createConnection(user, pass);
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #5");
long dt = System.nanoTime() - start; long dt = System.nanoTime() - start;
setLatencyConnect(dt / 1000000L); setLatencyConnect(dt / 1000000L);
lastConnectTime = DateFormat.getDateTimeInstance().format(new Date()); lastConnectTime = DateFormat.getDateTimeInstance().format(new Date());
...@@ -309,31 +310,24 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean { ...@@ -309,31 +310,24 @@ public class JMSConnectorStatus implements JMSConnectorStatusMBean {
} }
try { try {
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #6");
Session sess = cnx.createSession(false, Session.AUTO_ACKNOWLEDGE); Session sess = cnx.createSession(false, Session.AUTO_ACKNOWLEDGE);
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #7");
if (queue == null) if (queue == null)
queue = (Queue) sess.createQueue(qname); queue = (Queue) sess.createQueue(qname);
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #8");
MessageProducer producer = sess.createProducer(queue); MessageProducer producer = sess.createProducer(queue);
MessageConsumer cons = sess.createConsumer(queue); MessageConsumer cons = sess.createConsumer(queue);
cnx.start(); cnx.start();
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #9");
TextMessage sent = sess.createTextMessage("Test number " + nbtry); TextMessage sent = sess.createTextMessage("Test number " + nbtry);
long start = System.nanoTime(); long start = System.nanoTime();
producer.send(sent, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, timeout *1000); producer.send(sent, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, timeout *1000);
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #10");
Message received = cons.receive(timeout *1000); Message received = cons.receive(timeout *1000);
logger.log(BasicLevel.WARN, "JMSConnectorStatus(" + cfname + ").call #11 -> " + received);
long dt = System.nanoTime() - start; long dt = System.nanoTime() - start;
if (received == null) { if (received == null) {
failures += 1; failures += 1;
setStatus(getStatus()+1); setStatus(getStatus()+1);
setLatencyPubSub(-1L); setLatencyPubSub(-1L);
errorMsg = "Message not received"; errorMsg = "Message not received";
logger.log(BasicLevel.WARN, "JMSConnectorStatus.check(" + cfname + ") message not received." + dt);
} else { } else {
retryStatusCount = 0; retryStatusCount = 0;
setLatencyPubSub(dt / 1000000L); setLatencyPubSub(dt / 1000000L);
......
...@@ -34,13 +34,15 @@ import javax.naming.NamingException; ...@@ -34,13 +34,15 @@ import javax.naming.NamingException;
import org.objectweb.util.monolog.api.BasicLevel; import org.objectweb.util.monolog.api.BasicLevel;
import org.objectweb.util.monolog.api.Logger; import org.objectweb.util.monolog.api.Logger;
import fr.dyade.aaa.agent.AgentServer;
import fr.dyade.aaa.agent.SCServer; import fr.dyade.aaa.agent.SCServer;
import fr.dyade.aaa.common.Debug; import fr.dyade.aaa.common.Debug;
import fr.dyade.aaa.util.management.MXWrapper; import fr.dyade.aaa.util.management.MXWrapper;
/**
* Root component managing all JMS connector healthcheck components.
*/
public class JMSStatus implements JMSStatusMBean { public class JMSStatus implements JMSStatusMBean {
public static final Logger logger = Debug.getLogger(JMSStatus.class.getName()); static final Logger logger = Debug.getLogger(JMSStatus.class.getName());
@Override @Override
public int getStatus() { public int getStatus() {
...@@ -113,10 +115,17 @@ public class JMSStatus implements JMSStatusMBean { ...@@ -113,10 +115,17 @@ public class JMSStatus implements JMSStatusMBean {
private HashMap<String, JMSConnectorStatus> connectors; private HashMap<String, JMSConnectorStatus> connectors;
// public void add(String name, JMSConnectorStatus connector) { /**
// connectors.put(name, connector); * Adds an healthcheck for the specified JMS connector.
// } *
* @param cfname JNDI name of the ConnectionFactory to use.
* @param ictx JNDI context allowing to retrieve ConnectionFactory.
* @param user User name for authentication, if no defined uses the ConnectionFactory default.
* @param pass Password for authentication, if no defined uses the ConnectionFactory default.
* @param qname Internal name of JMS destination.
* @param period Period between 2 checks, by default 60s.
* @param timeout Maximum amount of time to wait connecting and receiving messages, by default 10s.
*/
public void addConnectorStatus(String cfname, InitialContext ictx, public void addConnectorStatus(String cfname, InitialContext ictx,
String user, String pass, String qname, String user, String pass, String qname,
int period, int timeout) { int period, int timeout) {
...@@ -130,7 +139,7 @@ public class JMSStatus implements JMSStatusMBean { ...@@ -130,7 +139,7 @@ public class JMSStatus implements JMSStatusMBean {
static long lastDump = 0L; static long lastDump = 0L;
public static void checkDump(String name, int retry) { static void checkDump(String name, int retry) {
if ((dumpFilePath == null) || (threshold <= 0) || (delay <= 0)) if ((dumpFilePath == null) || (threshold <= 0) || (delay <= 0))
return; return;
...@@ -151,11 +160,12 @@ public class JMSStatus implements JMSStatusMBean { ...@@ -151,11 +160,12 @@ public class JMSStatus implements JMSStatusMBean {
private String name; private String name;
public String getName() { String getName() {
return name; return name;