flowable/flowable-engine · warning
Could not start JMXConnector thread at: {}. JMX Connector no
Error message
Could not start JMXConnector thread at: {}. JMX Connector not in use. What it means
This warning is logged when starting the JMX connector server thread fails with an IOException that is NOT a NameAlreadyBoundException, so the JMX connector is not in use/available. The connector server (cs.start()) could not bind or export the RMI stub, and the exception is logged with the URL and stack trace for diagnosis. Remote JMX management will be unavailable for this engine instance.
Source
Thrown at modules/flowable-jmx/src/main/java/org/flowable/management/jmx/DefaultManagementAgent.java:235
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
// use async thread for starting the JMX Connector
// (no need to use a thread pool or enlist in JMX as this thread is
// terminated when the JMX connector has been started)
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
LOGGER.debug("Staring JMX Connector thread to listen at: {}", url);
cs.start();
LOGGER.info("JMX Connector thread started and listening at: {}", url);
} catch (IOException ioe) {
if (ioe.getCause() instanceof javax.naming.NameAlreadyBoundException) {
LOGGER.warn("JMX connection:{} already exists.", url);
} else {
LOGGER.warn("Could not start JMXConnector thread at: {}. JMX Connector not in use.", url, ioe);
}
}
}
}, "jmxConnectorStarterThread");
thread.start();
}
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Read the logged IOException stack trace to find the root cause (most commonly BindException on the connector/registry port).
- Choose free ports for registryPort and connectorPort (check with netstat/lsof) and update the configuration.
- If running multi-node or in containers, ensure the published ports and java.rmi.server.hostname match the actual interfaces.
- Restart the process after fixing config so a fresh registry and connector are created.
- Disable JMX if remote monitoring is not required.
Example fix
// before flowable.jmx.connectorPort=6789 // already used by another process // after flowable.jmx.connectorPort=6790 // free port
Defensive patterns
Strategy: try-catch
Validate before calling
try (ServerSocket ss = new ServerSocket(connectorPort)) {
// port is free
} catch (IOException e) {
throw new IllegalStateException("JMX connectorPort " + connectorPort + " already in use", e);
} Try / catch
try {
connectorServer.start();
} catch (IOException ioe) {
log.error("Failed to start JMX connector at {} — check port availability and hostname settings", url, ioe);
// continue without remote JMX or rethrow depending on requirements
} Prevention
- Pre-check that registryPort/connectorPort are free at deployment time
- Set java.rmi.server.hostname correctly in containers/NAT environments
- Monitor startup logs for this warning to catch port conflicts early
When it happens
Trigger: JMXConnectorServer.start() throws IOException — e.g. the configured registry/connector port is already bound by another process, the RMI registry disappeared, or network interface binding fails — in the jmxConnectorStarterThread inside createJmxConnector.
Common situations: Another application already occupies the connector port (port conflict); firewall or host/port mismatch; registry created on a different host/interface than the connector URL; port privileged or in use after an unclean restart.
Related errors
- Could not create and start JMX connector.
- Registry port is null. JMX connector creation skipped.
- JMX connection:{} already exists.
- ${e.getMessage()}
- @ManagedAttribute can only be used on Java bean methods, was
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/86d50183dce5a29e.
Report an issue: GitHub.