aeron-io/aeron · error · IllegalArgumentException

unsupported multicast flow control strategy: fc=

Error message

unsupported multicast flow control strategy: fc=${fcStr}

What it means

DefaultMulticastFlowControlSupplier.newInstance throws IllegalArgumentException when a multicast flow control strategy requested via the fc= URI parameter (or config) is not one of the supported strategies, and no custom strategy matched.

Solutions

  1. Use a supported fc= value (e.g. the ones mapped to Default, Min, Max, TaggedMulticastFlowControl)
  2. Register a custom FlowControlSupplier that supports your strategy string
  3. Remove the fc= parameter to accept the default strategy

Example fix

// before
"aeron:udp?endpoint=239.255.0.1:40456|fc=bogus" // -> IllegalArgumentException
// after
"aeron:udp?endpoint=239.255.0.1:40456|fc=tagged" // a supported strategy value
Defensive patterns

Strategy: validation

Validate before calling

if (fcStr != null && !Set.of("min","max","tagged" /* valid values */).contains(fcStr)) throw new IllegalArgumentException("unsupported fc=" + fcStr);

Prevention

When it happens

Trigger: Channel URI with fc= set to an unrecognized value while the configured MULTICAST_FLOW_CONTROL_STRATEGY class is DefaultMulticastFlowControlSupplier; the switch over FC_PARAM_VALUE falls to default.

Common situations: Typo like fc=min instead of a valid tag, using a unicast-only strategy name on a multicast channel, or a strategy added in a newer Aeron version than the one on the classpath.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of aeron-io/aeron@6d60124e15 (2026-09-12). Data as JSON: /api/errors/1f08a5f4c1496943. Report an issue: GitHub.

Appendix: source

Thrown at aeron-driver/src/main/java/io/aeron/driver/DefaultMulticastFlowControlSupplier.java:61

        final String fcStr = udpChannel.channelUri().get(CommonContext.FLOW_CONTROL_PARAM_NAME);
        if (null != fcStr)
        {
            final int delimiter = fcStr.indexOf(',');
            final String strategyStr = -1 == delimiter ? fcStr : fcStr.substring(0, delimiter);

            switch (strategyStr)
            {
                case MaxMulticastFlowControl.FC_PARAM_VALUE:
                    return new MaxMulticastFlowControl();

                case MinMulticastFlowControl.FC_PARAM_VALUE:
                    return new MinMulticastFlowControl();

                case TaggedMulticastFlowControl.FC_PARAM_VALUE:
                    return new TaggedMulticastFlowControl();

                default:
                    throw new IllegalArgumentException("unsupported multicast flow control strategy: fc=" + fcStr);
            }
        }

        if (MaxMulticastFlowControl.class.getName().equals(MULTICAST_FLOW_CONTROL_STRATEGY))
        {
            return new MaxMulticastFlowControl();
        }
        else if (MinMulticastFlowControl.class.getName().equals(MULTICAST_FLOW_CONTROL_STRATEGY))
        {
            return new MinMulticastFlowControl();
        }
        else if (TaggedMulticastFlowControl.class.getName().equals(MULTICAST_FLOW_CONTROL_STRATEGY))
        {
            return new TaggedMulticastFlowControl();
        }

        FlowControl flowControl = null;
        try

View on GitHub (pinned to 6d60124e15)