[jboss-svn-commits] JBL Code SVN: r23329 - in labs/jbosstm/trunk/ArjunaCore: arjuna/classes/com/arjuna/ats/arjuna/common and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Oct 6 12:50:14 EDT 2008
Author: mark.little at jboss.com
Date: 2008-10-06 12:50:13 -0400 (Mon, 06 Oct 2008)
New Revision: 23329
Added:
labs/jbosstm/trunk/ArjunaCore/Readme.txt
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/ExecProcessId.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/MBeanProcessId.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/ManualProcessId.java
Modified:
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/common/Environment.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/utils/Process.java
Log:
https://jira.jboss.org/jira/browse/JBTM-407
Added: labs/jbosstm/trunk/ArjunaCore/Readme.txt
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/Readme.txt (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/Readme.txt 2008-10-06 16:50:13 UTC (rev 23329)
@@ -0,0 +1,4 @@
+If you are going to use the ExecProcessId implementation to obtain a pid, rather than one of the other implementations,
+then you need to download getpids.exe if you are also running on Windows.
+
+Download from http://www.scheibli.com/projects/getpids/ and place it within your classpath.
\ No newline at end of file
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/common/Environment.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/common/Environment.java 2008-10-06 15:43:04 UTC (rev 23328)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/common/Environment.java 2008-10-06 16:50:13 UTC (rev 23329)
@@ -146,7 +146,8 @@
public static final String SOCKET_PROCESS_ID_PORT= "com.arjuna.ats.internal.arjuna.utils.SocketProcessIdPort";
public static final String SOCKET_PROCESS_ID_MAX_PORTS= "com.arjuna.ats.internal.arjuna.utils.SocketProcessIdMaxPorts";
public static final String PROCESS_IMPLEMENTATION = "com.arjuna.ats.internal.arjuna.utils.processImplementation";
-
+ public static final String PROCESS_IDENTIFIER = "com.arjuna.ats.internal.arjuna.utils.pid";
+
/**
* Constant that holds the name of the environment property
* for specifying the bind address for transaction services
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/utils/Process.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/utils/Process.java 2008-10-06 15:43:04 UTC (rev 23328)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/utils/Process.java 2008-10-06 16:50:13 UTC (rev 23329)
@@ -33,8 +33,8 @@
/**
* Provides a configurable way to get a unique process id.
- *
- * @version $Id: Process.java 2342 2006-03-30 13:06:17Z $
+ *
+ * @version $Id: Process.java 2342 2006-03-30 13:06:17Z $
* @since JTS 1.0.
*/
@@ -42,12 +42,11 @@
{
/**
- * @return the process id. This had better be unique between processes
- * on the same machine. If not we're in trouble!
- *
+ * @return the process id. This had better be unique between processes on
+ * the same machine. If not we're in trouble!
* @since JTS 2.1.
*/
-
-public int getpid ();
-
+
+ public int getpid ();
+
}
Added: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/ExecProcessId.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/ExecProcessId.java (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/ExecProcessId.java 2008-10-06 16:50:13 UTC (rev 23329)
@@ -0,0 +1,196 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * 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,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+/*
+ * Copyright (C) 2001,
+ *
+ * Hewlett-Packard Arjuna Labs,
+ * Newcastle upon Tyne,
+ * Tyne and Wear,
+ * UK.
+ *
+ * $Id: SocketProcessId.java 2342 2006-03-30 13:06:17Z $
+ */
+
+package com.arjuna.ats.internal.arjuna.utils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.StringTokenizer;
+
+import com.arjuna.ats.arjuna.logging.tsLogger;
+
+import com.arjuna.ats.arjuna.exceptions.FatalError;
+
+/**
+ * Obtains a unique value to represent the process id via reflection.
+ */
+
+public class ExecProcessId implements com.arjuna.ats.arjuna.utils.Process
+{
+
+ /**
+ * @return the process id. This had better be unique between processes on
+ * the same machine. If not we're in trouble!
+ * @message com.arjuna.ats.internal.arjuna.utils.ExecProcessId_1
+ * [com.arjuna.ats.internal.arjuna.utils.ExecProcessId_1]-
+ * Could not get back a valid pid.
+ * @message com.arjuna.ats.internal.arjuna.utils.ExecProcessId_2
+ * [com.arjuna.ats.internal.arjuna.utils.ExecProcessId_2] -
+ * Problem executing getpids utility:
+ * @message com.arjuna.ats.internal.arjuna.utils.ExecProcessId_3
+ * [com.arjuna.ats.internal.arjuna.utils.ExecProcessId_3] -
+ * Problem executing command:
+ * @message com.arjuna.ats.internal.arjuna.utils.ExecProcessId_4
+ * [com.arjuna.ats.internal.arjuna.utils.ExecProcessId_4] -
+ * Problem getting pid information from stream:
+ * @message com.arjuna.ats.internal.arjuna.utils.ExecProcessId_5
+ * [com.arjuna.ats.internal.arjuna.utils.ExecProcessId_5] -
+ * Encountered a problem when closing the data stream {0}
+ */
+
+ public int getpid ()
+ {
+ synchronized (ExecProcessId._lock)
+ {
+ if (_pid == -1)
+ {
+ String cmd[] = null;
+ File tempFile = null;
+
+ if (System.getProperty("os.name").toLowerCase().indexOf(
+ "windows") == -1)
+ cmd = new String[]
+ { "/bin/sh", "-c", "echo $$ $PPID" };
+ else
+ {
+ try
+ {
+ // http://www.scheibli.com/projects/getpids/index.html (GPL)
+ tempFile = File.createTempFile("getpids", "ts");
+
+ byte[] bytes = new byte[1024];
+ int read;
+ InputStream in = ExecProcessId.class.getResourceAsStream("getpids.exe");
+ OutputStream out = new FileOutputStream(tempFile);
+
+ try
+ {
+ while ((read = in.read(bytes)) != -1)
+ out.write(bytes, 0, read);
+ }
+ finally
+ {
+ in.close();
+ out.close();
+ }
+
+ cmd = new String[] { tempFile.getAbsolutePath() };
+ }
+ catch (final Exception ex)
+ {
+ throw new FatalError(
+ tsLogger.log_mesg
+ .getString("com.arjuna.ats.internal.arjuna.utils.ExecProcessId_2")+" "+ex);
+ }
+ }
+
+ if (cmd != null)
+ {
+ Process p = null;
+
+ try
+ {
+ p = Runtime.getRuntime().exec(cmd);
+ }
+ catch (final IOException ex)
+ {
+ throw new FatalError(
+ tsLogger.log_mesg
+ .getString("com.arjuna.ats.internal.arjuna.utils.ExecProcessId_3")+" "+ex);
+ }
+
+ ByteArrayOutputStream bstream = new ByteArrayOutputStream();
+ byte[] bytes = new byte[1024];
+ int read;
+
+ try
+ {
+ while ((read = p.getInputStream().read(bytes)) != -1)
+ bstream.write(bytes, 0, read);
+ }
+ catch (final Exception ex)
+ {
+ throw new FatalError(
+ tsLogger.log_mesg
+ .getString("com.arjuna.ats.internal.arjuna.utils.ExecProcessId_4")+" "+ex);
+ }
+ finally
+ {
+ try
+ {
+ bstream.close();
+ }
+ catch (final Exception ex)
+ {
+ if (tsLogger.arjLoggerI18N.isWarnEnabled())
+ {
+ tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.utils.ExecProcessId_5", new Object[]
+ { ex });
+ }
+ }
+ }
+
+ if (tempFile != null)
+ tempFile.delete();
+
+ StringTokenizer theTokenizer = new StringTokenizer(bstream.toString());
+ theTokenizer.nextToken();
+
+ String pid = theTokenizer.nextToken();
+
+ try
+ {
+ _pid = Integer.parseInt(pid);
+ }
+ catch (final Exception ex)
+ {
+
+ }
+ }
+ }
+ }
+
+ if (_pid == -1)
+ throw new FatalError(
+ tsLogger.log_mesg
+ .getString("com.arjuna.ats.internal.arjuna.utils.ExecProcessId_1"));
+
+ return _pid;
+ }
+
+ private static final Object _lock = new Object();
+
+ private int _pid = -1;
+}
Added: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/MBeanProcessId.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/MBeanProcessId.java (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/MBeanProcessId.java 2008-10-06 16:50:13 UTC (rev 23329)
@@ -0,0 +1,90 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * 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,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+/*
+ * Copyright (C) 2001,
+ *
+ * Hewlett-Packard Arjuna Labs,
+ * Newcastle upon Tyne,
+ * Tyne and Wear,
+ * UK.
+ *
+ * $Id: SocketProcessId.java 2342 2006-03-30 13:06:17Z $
+ */
+
+package com.arjuna.ats.internal.arjuna.utils;
+
+import com.arjuna.ats.arjuna.logging.tsLogger;
+
+import java.lang.management.ManagementFactory;
+
+import com.arjuna.ats.arjuna.exceptions.FatalError;
+
+/**
+ * Obtains a unique value to represent the process id via ManagementFactory.getRuntimeMXBean().getName().
+ *
+ * WARNING: use with care because the contents of getName may change between OSes and versions of
+ * JDK.
+ */
+
+public class MBeanProcessId implements com.arjuna.ats.arjuna.utils.Process
+{
+
+ /**
+ * @return the process id. This had better be unique between processes on
+ * the same machine. If not we're in trouble!
+ * @message com.arjuna.ats.internal.arjuna.utils.MBeanProcessId_1
+ * [com.arjuna.ats.internal.arjuna.utils.MBeanProcessId_1]-
+ * Could not get back a valid pid.
+ * @message com.arjuna.ats.internal.arjuna.utils.MBeanProcessId_2
+ * [com.arjuna.ats.internal.arjuna.utils.MBeanProcessId_2] -
+ * getName returned unrecognized format:
+ */
+
+ public int getpid ()
+ {
+ synchronized (MBeanProcessId._lock)
+ {
+ if (_pid == -1)
+ {
+ String name = ManagementFactory.getRuntimeMXBean().getName();
+ String[] parsed = name.split("@");
+
+ try
+ {
+ _pid = Integer.valueOf(parsed[0]);
+ }
+ catch (final Exception ex)
+ {
+ throw new FatalError(tsLogger.log_mesg.getString("com.arjuna.ats.internal.arjuna.utils.MBeanProcessId_2")+" "+name);
+ }
+ }
+ }
+
+ if (_pid == -1)
+ throw new FatalError(tsLogger.log_mesg.getString("com.arjuna.ats.internal.arjuna.utils.MBeanProcessId_1"));
+
+ return _pid;
+ }
+
+ private static final Object _lock = new Object();
+
+ private int _pid = -1;
+}
Added: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/ManualProcessId.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/ManualProcessId.java (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/ManualProcessId.java 2008-10-06 16:50:13 UTC (rev 23329)
@@ -0,0 +1,132 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * 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,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+/*
+ * Copyright (C) 2001,
+ *
+ * Hewlett-Packard Arjuna Labs,
+ * Newcastle upon Tyne,
+ * Tyne and Wear,
+ * UK.
+ *
+ * $Id: SocketProcessId.java 2342 2006-03-30 13:06:17Z $
+ */
+
+package com.arjuna.ats.internal.arjuna.utils;
+
+import com.arjuna.ats.arjuna.logging.tsLogger;
+
+import com.arjuna.ats.arjuna.common.Environment;
+import com.arjuna.ats.arjuna.common.arjPropertyManager;
+import com.arjuna.ats.arjuna.exceptions.FatalError;
+
+/**
+ * Obtains a unique value to represent the process id via configuration.
+ *
+ * Other options include ...
+ *
+ * int pid = Integer.parseInt((new File("/proc/self")).getCanonicalFile().getName()); // linux specific
+ *
+ * Un*x specific ...
+ *
+ * String[] cmd = {"/bin/sh", "-c", "echo $PPID"};
+ * Process proc = Runtime.getRuntime().exec(cmd);
+ *
+ * Field field = proc.getClass().getDeclaredField("pid");
+ * field.setAccessible(true);
+ *
+ * _pid = field.getInt(proc); // although this is the child pid!
+ *
+ * proc.destroy();
+ *
+ * byte[] ba = new byte[100];
+ * String[] cmd = {"/bin/sh", "-c", "echo $PPID"};
+ * Process proc = Runtime.getRuntime().exec(cmd);
+ * proc.getInputStream().read(ba);
+ * System.out.println(new String(ba));
+ *
+ * http://java.sun.com/javase/6/docs/jdk/api/attach/spec/com/sun/tools/attach/VirtualMachine.html // JDK 6 only
+ *
+ * and ...
+ *
+ * MonitoredHost host = MonitoredHost.getMonitoredHost(null);
+ *
+ * for (Object activeVmPid : host.activeVms())
+ * int pid = (Integer) activeVmPid;
+ *
+ * and ...
+ *
+ * Process proc = Runtime.getRuntime().exec(cmd);
+ *
+ * Field field = proc.getClass().getDeclaredField("pid");
+ * field.setAccessible(true);
+ *
+ * _pid = field.getInt(proc); // although this is the child pid!
+ */
+
+public class ManualProcessId implements com.arjuna.ats.arjuna.utils.Process
+{
+
+ /**
+ * @return the process id. This had better be unique between processes on
+ * the same machine. If not we're in trouble!
+ * @message com.arjuna.ats.internal.arjuna.utils.ManualProcessId_1
+ * [com.arjuna.ats.internal.arjuna.utils.ManualProcessId_1]-
+ * Could not get back a valid pid.
+ * @message com.arjuna.ats.internal.arjuna.utils.ManualProcessId_2
+ * [com.arjuna.ats.internal.arjuna.utils.ManualProcessId_2] -
+ * No process identifier specified in configuration!
+ * @message com.arjuna.ats.internal.arjuna.utils.ManualProcessId_3
+ * [com.arjuna.ats.internal.arjuna.utils.ManualProcessId_3] -
+ * Invalid process identifier specified:
+ */
+
+ public int getpid ()
+ {
+ synchronized (ManualProcessId._lock)
+ {
+ if (_pid == -1)
+ {
+ String pid = arjPropertyManager.getPropertyManager().getProperty(Environment.PROCESS_IDENTIFIER);
+
+ if (pid == null)
+ throw new FatalError(tsLogger.log_mesg.getString("com.arjuna.ats.internal.arjuna.utils.ManualProcessId_1"));
+
+ try
+ {
+ _pid = Integer.parseInt(pid);
+ }
+ catch (final Exception ex)
+ {
+ throw new FatalError(tsLogger.log_mesg.getString("com.arjuna.ats.internal.arjuna.utils.ManualProcessId_3")+" "+pid);
+ }
+ }
+ }
+
+ if (_pid == -1)
+ throw new FatalError(tsLogger.log_mesg.getString("com.arjuna.ats.internal.arjuna.utils.ManualProcessId_1"));
+
+ return _pid;
+ }
+
+ private static final Object _lock = new Object();
+
+ private int _pid = -1;
+}
More information about the jboss-svn-commits
mailing list