IsolateIdentity class

Which isolate of the app this code is running in.

An app with AppConfig.workers greater than 1 runs the same program in several isolates. They are identical by construction, which is the point — and also the problem, because some things an app talks to identify their clients by name. A message broker that tracks unacknowledged work per consumer name will hand every worker the same name, and each worker's pending messages become invisible to the others. Telling the isolates apart requires knowing which one you are.

Statics in Dart are per-isolate. Each isolate gets its own copy of top-level and static state — nothing is shared, and there is no race to guard against. That is not a caveat, it is the whole mechanism: a static can describe "which isolate am I" precisely because every isolate has a different one. It is the same reason the private _revaliIsWorker flag in the generated server file works.

Read it from anywhere, including code that has no way to be handed configuration — an AppConfig.createBroker override, for instance, takes no arguments.

The common use is work that must happen once for the process rather than once per isolate:

@override
Future<void> configureDependencies(DI di) async {
  if (!IsolateIdentity.current.isWorker) {
    di.registerSingleton<NightlyReport>(NightlyReport()..start());
  }
}

Note that RedisBroker names its own consumers from this — through scopeName — so an app does not have to work the index into consumerName itself. Doing so anyway produces orders-1-1.

A broker written outside this repository carries the same obligation and cannot inherit the fix, which is why scopeName is public rather than private to RedisBroker. See scopeName and AppConfig.createBroker.

Unset, it describes the parent of a single-isolate app: index 0, not a worker, one isolate in total. So a unit test, a dart test run, or an app that never spawns workers observes something true without configuring anything, and there is no null to handle.

Constructors

IsolateIdentity({required int index, required int workerCount})
const

Properties

hashCode int
The hash code for this object.
no setterinherited
index int
Position in the fleet: 0 is the parent, 1..workerCount - 1 a worker.
final
isWorker bool
Whether this is a spawned worker rather than the parent.
no setter
runtimeType Type
A representation of the runtime type of the object.
no setterinherited
workerCount int
How many isolates the app was configured for — AppConfig.workers.
final

Methods

noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() String
A string representation of this object.
override

Operators

operator ==(Object other) bool
The equality operator.
inherited

Static Properties

current IsolateIdentity
The identity of the isolate this code is running in.
no setter

Static Methods

scopeName(String name) String
Distinguishes a name this isolate registers with an external system.
setCurrentForGeneratedCode(IsolateIdentity identity) → void
Framework plumbing — called by generated code, not by app authors.

Constants

single → const IsolateIdentity
The parent isolate of an app that runs in one isolate.