flowable/flowable-engine · error · FlowableException

couldn't open resource stream:

Error message

couldn't open resource stream: 

What it means

Thrown by buildEventRegistryEngine when URL.openStream() on the configuration resource throws IOException, i.e. the resource cannot be opened or read. The configuration XML was located as a URL but its stream is unavailable, so the engine cannot be constructed.

Solutions

  1. Confirm the resource exists and is readable at the exact URL printed by the wrapped IOException
  2. If it's a classpath resource, verify it is packaged in the JAR/WAR (unzip -l | grep eventregistry)
  3. Fix file permissions or re-add the config file and redeploy/restart

Example fix

// before
URL url = getClass().getResource("/flowable-eventregistry.cfg.xml"); // null or stale path
EventRegistryEngines.buildEventRegistryEngine(url);
// after
URL url = getClass().getResource("/flowable-eventregistry.cfg.xml");
if (url == null) throw new IllegalStateException("event registry config missing from classpath");
EventRegistryEngines.buildEventRegistryEngine(url);
Defensive patterns

Strategy: validation

Validate before calling

URL u = getClass().getResource("/flowable-eventregistry.cfg.xml");
if (u == null) throw new IllegalStateException("config resource not on classpath");
try (InputStream probe = u.openStream()) { if (probe.read() == -1) throw new IllegalStateException("config resource is empty"); }

Try / catch

try {
    EventRegistryEngines.buildEventRegistryEngine(url);
} catch (FlowableException e) {
    throw new IllegalStateException("cannot read event registry config at " + url, e);
}

Prevention

When it happens

Trigger: EventRegistryEngines builds an engine from a URL whose openStream() fails: file removed/moved after enumeration, unreadable permissions, or an unreachable remote URL.

Common situations: Classpath resource deleted after being listed; JAR repackaged without the config file; filesystem permissions changed; network-mounted resource temporarily unavailable.

Understand the failure class

Background: "open() failed", "failed to open file", "cannot create file" — what a file open error means and how to fix it — this error's family across 42 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/9cab97b920b0d9da. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/EventRegistryEngines.java:162

            eventRegistryEngineInfo = new EngineInfo(eventRegistryEngineName, resourceUrlString, null);
            eventRegistryEngines.put(eventRegistryEngineName, eventRegistryEngine);
            eventRegistryEngineInfosByName.put(eventRegistryEngineName, eventRegistryEngineInfo);
        } catch (Throwable e) {
            LOGGER.error("Exception while initializing event registry engine: {}", e.getMessage(), e);
            eventRegistryEngineInfo = new EngineInfo(null, resourceUrlString, ExceptionUtils.getStackTrace(e));
        }
        eventRegistryEngineInfosByResourceUrl.put(resourceUrlString, eventRegistryEngineInfo);
        eventRegistryEngineInfos.add(eventRegistryEngineInfo);
        return eventRegistryEngineInfo;
    }

    protected static EventRegistryEngine buildEventRegistryEngine(URL resource) {
        try (InputStream inputStream = resource.openStream()) {
            EventRegistryEngineConfiguration eventRegistryEngineConfiguration = EventRegistryEngineConfiguration.createEventRegistryEngineConfigurationFromInputStream(inputStream);
            return eventRegistryEngineConfiguration.buildEventRegistryEngine();

        } catch (IOException e) {
            throw new FlowableException("couldn't open resource stream: " + e.getMessage(), e);
        }
    }

    /** Get initialization results. */
    public static List<EngineInfo> getEventRegistryEngineInfos() {
        return eventRegistryEngineInfos;
    }

    /**
     * Get initialization results. Only info will we available for event registry engines which were added in the 
     * {@link EventRegistryEngines#init()}. No {@link EngineInfo} is available for engines which were registered
     * programmatically.
     */
    public static EngineInfo getEventRegistryEngineInfo(String eventRegistryEngineName) {
        return eventRegistryEngineInfosByName.get(eventRegistryEngineName);
    }

    public static EventRegistryEngine getDefaultEventRegistryEngine() {

View on GitHub (pinned to d6d39ce1c6)