else if (args[argOffset].equalsIgnoreCase(CMD_STARTRECORDING)) { System.out.println("Record: #1) " + args[argOffset]+" #2) "+args[argOffset+1]+" #3) "+args[argOffset+2]+ " #4) "+args[argOffset+3] ); AppConextName context = new AppConextName(args[argOffset+1], true); String connectsName = MBEANNAME+":vHosts=VHosts,vHostName="+context.vhostName+",applications=Applications,applicationName="+context.appName+",applicationInstances=ApplicationInstances,applicationInstanceName="+context.appInstName+",name=ApplicationInstance"; ObjectName connectsObjName = new ObjectName(connectsName); // pass 0 and true as second and third arguments Object[] arguments = {args[argOffset+2], "0", "true", args[argOffset+3]}; String[] signature = {"java.lang.String", "int", "boolean", "java.lang.String"}; [B]doInvoke(connection, connectsObjName, "recordStream", arguments, signature);[/B] }
Answer by Richard Lanham · Nov 02, 2010 at 07:51 PM
AppConextName context = new AppConextName(args[argOffset+1], true); String connectsName = MBEANNAME+":vHosts=VHosts,vHostName="+context.vhostName+",applications=Applications,applicationName="+context.appName+",applicationInstances=ApplicationInstances,applicationInstanceName="+context.appInstName+",name=ApplicationInstance"; ObjectName connectsObjName = new ObjectName(connectsName);
./run.sh -jmx service:jmx:rmi://h264web.com:8084/jndi/rmi://h264web.com:8085/jmxrmi -user ***** -pass ***** recordStream _defaultVHost_:rtplive/_definst_ rtplive 1.stream /root/foobar.mp4 Record: #1) recordStream #2) _defaultVHost_:rtplive/_definst_ #3) rtplive #4) 1.stream ERROR: doInvoke: javax.management.MBeanException: Cannot find operation recordStream
import java.util.*; import javax.management.*; import javax.management.remote.*; public class JMXCommandLine { public static final String MBEANNAME = "WowzaMediaServerPro"; public static final String CMD_STARTRECORDING = "recordStream"; public static final String CMD_STOPRECORDING = "stopRecording"; public static final String DEFAULT_VHOST = "_defaultVHost_"; public static final String DEFAULT_APPLICATION = "_defapp_"; public static final String DEFAULT_APPINSTANCE = "_definst_"; public static class AppConextName { String vhostName = null; String appName = null; String appInstName = null; public AppConextName() { } public AppConextName(String fullname, boolean startWithDefaults) { if (startWithDefaults) { vhostName = DEFAULT_VHOST; appName = DEFAULT_APPLICATION; appInstName = DEFAULT_APPINSTANCE; } int qloc = fullname.indexOf(":"); if (qloc >= 0) { vhostName = fullname.substring(0, qloc); fullname = fullname.substring(qloc+1); } else vhostName = DEFAULT_VHOST; if (fullname.length() > 0) { appName = fullname; int sloc = fullname.indexOf("/"); if (sloc >= 0) { appName = fullname.substring(0, sloc); appInstName = fullname.substring(sloc+1); } } } String getObjName() { String ret = ""; while(true) { if (vhostName == null) break; ret += "vHosts=VHosts,vHostName="+vhostName; if (appName == null) break; ret += ",applications=Applications,applicationName="+appName; if (appInstName == null) break; ret += ",applicationInstances=ApplicationInstances,applicationInstanceName="+appInstName; break; } return ret; } } public static void printUsage() { System.out.println(""); System.out.println("Usage:"); System.out.println(""); System.out.println("[command] -[switch [value]...] [command] [params...]"); System.out.println(""); System.out.println("Switches:"); System.out.println(""); System.out.println(" -jmx [jmx-url]"); System.out.println(" -user [jmx-username]"); System.out.println(" -pass [jmx-password]"); System.out.println(""); System.out.println("Commands:"); System.out.println(""); System.out.println(" " + CMD_STARTRECORDING + " [vhost:application/appInstance] [stream-name] path"); System.out.println(" " + CMD_STOPRECORDING + " [vhost:application/appInstance] [stream-name]"); System.out.println(""); } public static long objToLong(Object valueObj) { long ret = 0; if (valueObj != null) { try { ret = Long.parseLong(valueObj.toString()); } catch(Exception e) { } } return ret; } public static Object doInvoke(MBeanServerConnection connection, ObjectName connectsObjName, String cmdStr, Object[] arguments, String[] signature) { Object returnObj = null; try { returnObj = connection.invoke(connectsObjName, cmdStr, arguments, signature); } catch(Exception e) { System.out.println("ERROR: doInvoke: "+e.toString()); } return returnObj; } public static Object doGetAttribute(MBeanServerConnection connection, ObjectName connectsObjName, String attributeName) { Object returnObj = null; try { returnObj = connection.getAttribute(connectsObjName, attributeName); } catch(Exception e) { } return returnObj; } public static void main(String[] args) { try { for(int i=0;i<args.length;i++) args[i] = args[i].trim(); String host = "localhost"; String username = null; String password = null; String jmxURL = "service:jmx:rmi://"+host+":8084/jndi/rmi://"+host+":8085/jmxrmi"; int argOffset = 0; while(true) { if (argOffset >= args.length) break; if (!args[argOffset].startsWith("-")) break; if (args[argOffset].startsWith("-host")) { argOffset++; host = args[argOffset]; jmxURL = "service:jmx:rmi://"+host+":8084/jndi/rmi://"+host+":8085/jmxrmi"; } else if (args[argOffset].startsWith("-jmx")) { argOffset++; jmxURL = args[argOffset]; } else if (args[argOffset].startsWith("-user")) { argOffset++; username = args[argOffset]; } else if (args[argOffset].startsWith("-pass")) { argOffset++; password = args[argOffset]; } argOffset++; } if (argOffset >= args.length) { printUsage(); return; } // create a connection URL JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); // create a environment hash with username and password Map<String, Object> env = new HashMap<String, Object>(); if (username != null && password != null) { String[] creds = {username, password}; env.put(JMXConnector.CREDENTIALS, creds); } JMXConnector connector = JMXConnectorFactory.connect(serviceURL, env); MBeanServerConnection connection = connector.getMBeanServerConnection(); if (connection == null) { System.out.println("ERROR: Cannot connect to JMX interface: "+jmxURL); return; } if (args[argOffset].equalsIgnoreCase(CMD_STARTRECORDING)) { System.out.println("Record: #1) " + args[argOffset]+" #2) "+args[argOffset+1]+" #3) "+args[argOffset+2]+ " #4) "+args[argOffset+3] ); AppConextName context = new AppConextName(args[argOffset+1], true); String connectsName = MBEANNAME+":vHosts=VHosts,vHostName="+context.vhostName+",applications=Applications,applicationName="+context.appName+",applicationInstances=ApplicationInstances,applicationInstanceName="+context.appInstName+",name=ApplicationInstance"; ObjectName connectsObjName = new ObjectName(connectsName); // pass 0 and true as second and third arguments Object[] arguments = {args[argOffset+2], "0", "true", args[argOffset+3]}; String[] signature = {"java.lang.String", "int", "boolean", "java.lang.String"}; doInvoke(connection, connectsObjName, "recordStream", arguments, signature); } else if (args[argOffset].equalsIgnoreCase(CMD_STOPRECORDING)) { System.out.println(args[argOffset]+" "+args[argOffset+1]); AppConextName context = new AppConextName(args[argOffset+1], true); String connectsName = MBEANNAME+":vHosts=VHosts,vHostName="+context.vhostName+",applications=Applications,applicationName="+context.appName+",applicationInstances=ApplicationInstances,applicationInstanceName="+context.appInstName+",name=ApplicationInstance"; ObjectName connectsObjName = new ObjectName(connectsName); Object[] arguments = {args[argOffset+2]}; String[] signature = {"java.lang.String"}; doInvoke(connection, connectsObjName, "stopMediaCasterStream", arguments, signature); } else System.out.println("ERROR: Command not recognized: "+args[argOffset]); } catch (Exception e) { System.out.println("ERROR: "+e.toString()); } } }
Answer by Roger Littin · Nov 04, 2010 at 10:26 PM
WowzaMediaServerPro:vHosts=VHosts,vHostName=_defaultVHost_,applications=Applications,applicationName=live,applicationInstances=ApplicationInstances,applicationInstanceName=_definst_,modules=Modules,module=ModuleLiveStreamRecord,name=Instance
connectsName in your code should resolve to the same as the MBeanInfo / ObjectName value, in jconsole, for the MBean you are trying to work with.
Using: WowzaMediaServerPro:vHosts=VHosts,vHostName=_defaultVHost_,applications=Applications,applicationName=rtplive,applicationInstances=ApplicationInstances,applicationInstanceName=_definst_,modules=Modules,module=ModuleLiveStreamRecord,name=Instance ERROR: doInvoke: javax.management.ReflectionException: Cannot find method recordStream with this signature
import java.util.*; import javax.management.*; import javax.management.remote.*; public class JMXCommandLine { public static final String MBEANNAME = "WowzaMediaServerPro"; public static final String CMD_STARTRECORDING = "recordStream"; public static final String CMD_STOPRECORDING = "stopRecording"; public static final String DEFAULT_VHOST = "_defaultVHost_"; public static final String DEFAULT_APPLICATION = "_defapp_"; public static final String DEFAULT_APPINSTANCE = "_definst_"; public static class AppConextName { String vhostName = null; String appName = null; String appInstName = null; public AppConextName() { } public AppConextName(String fullname, final boolean startWithDefaults) { if (startWithDefaults) { vhostName = DEFAULT_VHOST; appName = DEFAULT_APPLICATION; appInstName = DEFAULT_APPINSTANCE; } final int qloc = fullname.indexOf(":"); if (qloc >= 0) { vhostName = fullname.substring(0, qloc); fullname = fullname.substring(qloc+1); } else vhostName = DEFAULT_VHOST; if (fullname.length() > 0) { appName = fullname; final int sloc = fullname.indexOf("/"); if (sloc >= 0) { appName = fullname.substring(0, sloc); appInstName = fullname.substring(sloc+1); } } } String getObjName() { String ret = ""; while(true) { if (vhostName == null) break; ret += "vHosts=VHosts,vHostName="+vhostName; if (appName == null) break; ret += ",applications=Applications,applicationName="+appName; if (appInstName == null) break; ret += ",applicationInstances=ApplicationInstances,applicationInstanceName="+appInstName; break; } return ret; } } public static void printUsage() { System.out.println(""); System.out.println("Usage:"); System.out.println(""); System.out.println("[command] -[switch [value]...] [command] [params...]"); System.out.println(""); System.out.println("Switches:"); System.out.println(""); System.out.println(" -jmx [jmx-url]"); System.out.println(" -user [jmx-username]"); System.out.println(" -pass [jmx-password]"); System.out.println(""); System.out.println("Commands:"); System.out.println(""); System.out.println(" " + CMD_STARTRECORDING + " [vhost:application/appInstance] [stream-name] path"); System.out.println(" " + CMD_STOPRECORDING + " [vhost:application/appInstance] [stream-name]"); System.out.println(""); } public static long objToLong(final Object valueObj) { long ret = 0; if (valueObj != null) { try { ret = Long.parseLong(valueObj.toString()); } catch(final Exception e) { } } return ret; } public static Object doInvoke(final MBeanServerConnection connection, final ObjectName connectsObjName, final String cmdStr, final Object[] arguments, final String[] signature) { Object returnObj = null; try { returnObj = connection.invoke(connectsObjName, cmdStr, arguments, signature); } catch(final Exception e) { System.out.println("ERROR: doInvoke: "+e.toString()); } return returnObj; } public static Object doGetAttribute(final MBeanServerConnection connection, final ObjectName connectsObjName, final String attributeName) { Object returnObj = null; try { returnObj = connection.getAttribute(connectsObjName, attributeName); } catch(final Exception e) { } return returnObj; } public static void main(final String[] args) { try { for(int i=0;i<args.length;i++) args[i] = args[i].trim(); String host = "localhost"; String username = null; String password = null; String jmxURL = "service:jmx:rmi://"+host+":8084/jndi/rmi://"+host+":8085/jmxrmi"; int argOffset = 0; while(true) { if (argOffset >= args.length) break; if (!args[argOffset].startsWith("-")) break; if (args[argOffset].startsWith("-host")) { argOffset++; host = args[argOffset]; jmxURL = "service:jmx:rmi://"+host+":8084/jndi/rmi://"+host+":8085/jmxrmi"; } else if (args[argOffset].startsWith("-jmx")) { argOffset++; jmxURL = args[argOffset]; } else if (args[argOffset].startsWith("-user")) { argOffset++; username = args[argOffset]; } else if (args[argOffset].startsWith("-pass")) { argOffset++; password = args[argOffset]; } argOffset++; } if (argOffset >= args.length) { printUsage(); return; } // create a connection URL final JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); final AppConextName context = new AppConextName(args[argOffset+1], true); final String connectsName = MBEANNAME+":vHosts=VHosts,vHostName="+context.vhostName+",applications=Applications,applicationName="+context.appName+",applicationInstances=ApplicationInstances,applicationInstanceName="+context.appInstName+",modules=Modules,module=ModuleLiveStreamRecord,name=Instance"; System.out.println( "Using: " + connectsName ); final ObjectName connectsObjName = new ObjectName(connectsName); // create a environment hash with username and password final Map<String, Object> env = new HashMap<String, Object>(); if (username != null && password != null) { final String[] creds = {username, password}; env.put(JMXConnector.CREDENTIALS, creds); } final JMXConnector connector = JMXConnectorFactory.connect(serviceURL, env); final MBeanServerConnection connection = connector.getMBeanServerConnection(); if (connection == null) { System.out.println("ERROR: Cannot connect to JMX interface: "+jmxURL); return; } if (args[argOffset].equalsIgnoreCase(CMD_STARTRECORDING)) { System.out.println("Record: #1) " + args[argOffset]+" #2) "+args[argOffset+1]+" #3) "+args[argOffset+2]+ " #4) "+args[argOffset+3] ); // pass 0 and true as second and third arguments final Object[] arguments = {args[argOffset+2], "0", "true", args[argOffset+3], true, true, true }; final String[] signature = {"java.lang.String", "int", "boolean", "java.lang.String", "boolean", "boolean", "boolean"}; doInvoke(connection, connectsObjName, "recordStream", arguments, signature); } else if (args[argOffset].equalsIgnoreCase(CMD_STOPRECORDING)) { System.out.println(args[argOffset]+" "+args[argOffset+1]); final Object[] arguments = {args[argOffset+2]}; final String[] signature = {"java.lang.String"}; doInvoke(connection, connectsObjName, "stopRecording", arguments, signature); } else System.out.println("ERROR: Command not recognized: "+args[argOffset]); } catch (final Exception e) { System.out.println("ERROR: "+e.toString()); } } }
Answer by Roger Littin · Nov 05, 2010 at 12:57 AM
public void recordStream(String streamName, int format, boolean append, String outputPath, boolean versionFile, boolean startOnKeyFrame, boolean recordData)
The error is telling you that it cannot find a method with the signiture
public void recordStream(String, int, boolean, String)
Answer by Roger Littin · Nov 05, 2010 at 01:55 AM
final Object[] arguments = {args[argOffset+2], "0", "true", args[argOffset+3], true, true, true };
final String[] signature = {"java.lang.String", "int", "boolean", "java.lang.String", "boolean", "boolean", "boolean"};
arg 1 should be an int and arg 2 should be a boolean. You have them as Strings.
Answer by Roger Littin · Dec 08, 2010 at 07:55 PM
Latest version of the app:
import java.util.*; import javax.management.*; import javax.management.remote.*; public class JMXCommandLine { public static final String MBEANNAME = "WowzaMediaServerPro"; public static final String CMD_STARTRECORDING = "recordStream"; public static final String CMD_STOPRECORDING = "stopRecording"; public static final String DEFAULT_VHOST = "_defaultVHost_"; public static final String DEFAULT_APPLICATION = "_defapp_"; public static final String DEFAULT_APPINSTANCE = "_definst_"; public static class AppConextName { String vhostName = null; String appName = null; String appInstName = null; public AppConextName() { } public AppConextName(String fullname, final boolean startWithDefaults) { if (startWithDefaults) { vhostName = DEFAULT_VHOST; appName = DEFAULT_APPLICATION; appInstName = DEFAULT_APPINSTANCE; } final int qloc = fullname.indexOf(":"); if (qloc >= 0) { vhostName = fullname.substring(0, qloc); fullname = fullname.substring(qloc+1); } else vhostName = DEFAULT_VHOST; if (fullname.length() > 0) { appName = fullname; final int sloc = fullname.indexOf("/"); if (sloc >= 0) { appName = fullname.substring(0, sloc); appInstName = fullname.substring(sloc+1); } } } String getObjName() { String ret = ""; while(true) { if (vhostName == null) break; ret += "vHosts=VHosts,vHostName="+vhostName; if (appName == null) break; ret += ",applications=Applications,applicationName="+appName; if (appInstName == null) break; ret += ",applicationInstances=ApplicationInstances,applicationInstanceName="+appInstName; break; } return ret; } } public static void printUsage() { System.out.println(""); System.out.println("Usage:"); System.out.println(""); System.out.println("[command] -[switch [value]...] [command] [params...]"); System.out.println(""); System.out.println("Switches:"); System.out.println(""); System.out.println(" -jmx [jmx-url]"); System.out.println(" -user [jmx-username]"); System.out.println(" -pass [jmx-password]"); System.out.println(""); System.out.println("Commands:"); System.out.println(""); System.out.println(" " + CMD_STARTRECORDING + " [vhost:application/appInstance] [stream-name] path"); System.out.println(" " + CMD_STOPRECORDING + " [vhost:application/appInstance] [stream-name]"); System.out.println(""); } public static long objToLong(final Object valueObj) { long ret = 0; if (valueObj != null) { try { ret = Long.parseLong(valueObj.toString()); } catch(final Exception e) { } } return ret; } public static Object doInvoke(final MBeanServerConnection connection, final ObjectName connectsObjName, final String cmdStr, final Object[] arguments, final String[] signature) { Object returnObj = null; try { returnObj = connection.invoke(connectsObjName, cmdStr, arguments, signature); } catch(final Exception e) { System.out.println("ERROR: doInvoke: "+e.toString()); } return returnObj; } public static Object doGetAttribute(final MBeanServerConnection connection, final ObjectName connectsObjName, final String attributeName) { Object returnObj = null; try { returnObj = connection.getAttribute(connectsObjName, attributeName); } catch(final Exception e) { } return returnObj; } public static void main(final String[] args) { try { for(int i=0;i<args.length;i++) args[i] = args[i].trim(); String host = "localhost"; String username = null; String password = null; String jmxURL = "service:jmx:rmi://"+host+":8084/jndi/rmi://"+host+":8085/jmxrmi"; int argOffset = 0; while(true) { if (argOffset >= args.length) break; if (!args[argOffset].startsWith("-")) break; if (args[argOffset].startsWith("-host")) { argOffset++; host = args[argOffset]; jmxURL = "service:jmx:rmi://"+host+":8084/jndi/rmi://"+host+":8085/jmxrmi"; } else if (args[argOffset].startsWith("-jmx")) { argOffset++; jmxURL = args[argOffset]; } else if (args[argOffset].startsWith("-user")) { argOffset++; username = args[argOffset]; } else if (args[argOffset].startsWith("-pass")) { argOffset++; password = args[argOffset]; } argOffset++; } if (argOffset >= args.length) { printUsage(); return; } // create a connection URL final JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); final AppConextName context = new AppConextName(args[argOffset+1], true); final String connectsName = MBEANNAME+":vHosts=VHosts,vHostName="+context.vhostName+",applications=Applications,applicationName="+context.appName+",applicationInstances=ApplicationInstances,applicationInstanceName="+context.appInstName+",modules=Modules,module=ModuleLiveStreamRecord,name=Instance"; System.out.println( "Using: " + connectsName ); final ObjectName connectsObjName = new ObjectName(connectsName); // create a environment hash with username and password final Map<String, Object> env = new HashMap<String, Object>(); if (username != null && password != null) { final String[] creds = {username, password}; env.put(JMXConnector.CREDENTIALS, creds); } final JMXConnector connector = JMXConnectorFactory.connect(serviceURL, env); final MBeanServerConnection connection = connector.getMBeanServerConnection(); if (connection == null) { System.out.println("ERROR: Cannot connect to JMX interface: "+jmxURL); return; } if (args[argOffset].equalsIgnoreCase(CMD_STARTRECORDING)) { System.out.println("Record: #1) " + args[argOffset]+" #2) "+args[argOffset+1]+" #3) "+args[argOffset+2]+ " #4) "+args[argOffset+3] ); // pass 0 and true as second and third arguments final Object[] arguments = {args[argOffset+2], "0", "true", args[argOffset+3], true, true, true }; final String[] signature = {"java.lang.String", "int", "boolean", "java.lang.String", "boolean", "boolean", "boolean"}; doInvoke(connection, connectsObjName, "recordStream", arguments, signature); } else if (args[argOffset].equalsIgnoreCase(CMD_STOPRECORDING)) { System.out.println(args[argOffset]+" "+args[argOffset+1]); final Object[] arguments = {args[argOffset+2]}; final String[] signature = {"java.lang.String"}; doInvoke(connection, connectsObjName, "stopRecording", arguments, signature); } else System.out.println("ERROR: Command not recognized: "+args[argOffset]); } catch (final Exception e) { System.out.println("ERROR: "+e.toString()); } } }
if (args[argOffset].equalsIgnoreCase(CMD_STARTRECORDING)) { System.out.println("Record: #1) " + args[argOffset]+" #2) "+args[argOffset+1]+" #3) "+args[argOffset+2]+ " #4) "+args[argOffset+3] ); // pass 0 and true as second and third arguments [b]final Object[] arguments = {args[argOffset+2], 0, true, args[argOffset+3], true, true, true };[/b] final String[] signature = {"java.lang.String", "int", "boolean", "java.lang.String", "boolean", "boolean", "boolean"}; doInvoke(connection, connectsObjName, "recordStream", arguments, signature); }
c:\Program Files\Java\jre6\bin>jmxcl -jmx service:jmx:rmi://localhost:8084/jndi/ rmi://localhost:8085/jmxrmi -user admin -pass admin recordStream _defaultVHost_: test/_definst_ test 1.stream foobar.mp4 c:\Program Files\Java\jre6\bin>java -cp . JMXCommandLine -jmx service:jmx:rmi:// localhost:8084/jndi/rmi://localhost:8085/jmxrmi -user admin -pass **** recordSt ream _defaultVHost_:test/_definst_ test 1.stream foobar.mp4 Using: WowzaMediaServerPro:vHosts=VHosts,vHostName=_defaultVHost_,applications=A pplications,applicationName=test,applicationInstances=ApplicationInstances,appli cationInstanceName=_definst_,modules=Modules,module=ModuleLiveStreamRecord,name= Instance Record: #1) recordStream #2) _defaultVHost_:test/_definst_ #3) test #4) 1.stream ERROR: doInvoke: javax.management.InstanceNotFoundException: WowzaMediaServerPro :vHosts=VHosts,vHostName=_defaultVHost_,applications=Applications,applicationNam e=test,applicationInstances=ApplicationInstances,applicationInstanceName=_defins t_,modules=Modules,module=ModuleLiveStreamRecord,name=Instance
ERROR: doInvoke: javax.management.InstanceNotFoundException: WowzaMediaServerPro
:vHosts=VHosts,vHostName=_defaultVHost_,applications=Applications,applicationNam
e=test,applicationInstances=ApplicationInstances,applicationInstanceName=_defins
t_,modules=Modules,module=ModuleLiveStreamRecord,name=Instance
any ideas?
Answer by Richard Lanham · Sep 28, 2011 at 03:38 PM
Answer by Richard Lanham · Oct 14, 2013 at 08:06 PM
java -cp . JMXCommandLine startAppInstance "live/_definst_"
Java Misson control 1 Answer
Disconnect ipcam stream 1 Answer
Ingest Shoutcast without using .stream files 3 Answers
Record one stream to two different files 1 Answer
IMediaStreamActionNotify3 vs streams started with MediaCasterStreamManager 2 Answers
© 2005–2018 Wowza Media Systems, LLC. All rights reserved. Terms | Privacy | Trademarks | Legal