aeron-io/aeron · error · IllegalArgumentException

unsupported unicast flow control strategy: fc=

Error message

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

What it means

DefaultUnicastFlowControlSupplier.newInstance throws IllegalArgumentException if a fc= flow control parameter is present on a unicast channel URI, because the default unicast supplier supports no strategy selection at all.

Solutions

  1. Remove the fc= parameter from the unicast channel URI
  2. Use a custom FlowControlSupplier if you need selectable strategies on unicast
  3. Use a multicast endpoint if you actually need the multicast flow control options

Example fix

// before
"aeron:udp?endpoint=localhost:40456|fc=min" // throws on unicast
// after
"aeron:udp?endpoint=localhost:40456" // fc param removed
Defensive patterns

Strategy: validation

Validate before calling

java.net.URI u = java.net.URI.create(channel); if (u.getQuery() != null && u.getQuery().contains("fc=")) throw new IllegalArgumentException("fc= not supported on unicast channels");

Prevention

When it happens

Trigger: Adding |fc=... to a unicast (non-multicast) UDP channel URI while the default unicast flow control supplier is configured.

Common situations: Copy-pasting a multicast channel URI (which uses fc= for Min/Max/Tagged strategies) onto a unicast endpoint, or a shared channel template that includes fc= unconditionally.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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

Appendix: source

Thrown at aeron-driver/src/main/java/io/aeron/driver/DefaultUnicastFlowControlSupplier.java:48

    /**
     * Default constructor.
     */
    public DefaultUnicastFlowControlSupplier()
    {
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public FlowControl newInstance(final UdpChannel udpChannel, final int streamId, final long registrationId)
    {
        final String fcStr = udpChannel.channelUri().get(CommonContext.FLOW_CONTROL_PARAM_NAME);
        FlowControl flowControl = null;

        if (null != fcStr)
        {
            throw new IllegalArgumentException("unsupported unicast flow control strategy: fc=" + fcStr);
        }

        if (UnicastFlowControl.class.getName().equals(UNICAST_FLOW_CONTROL_STRATEGY))
        {
            return new UnicastFlowControl();
        }

        try
        {
            flowControl = (FlowControl)Class.forName(UNICAST_FLOW_CONTROL_STRATEGY)
                .getConstructor()
                .newInstance();
        }
        catch (final Exception ex)
        {
            LangUtil.rethrowUnchecked(ex);
        }

View on GitHub (pinned to 6d60124e15)