View Source Changelog
v1-4-1
v1.4.1
enhancements
Enhancements
- Retry command execution when the aggregate process is down (#494).
bug-fixes
Bug fixes
- Remove duplicate apply function call when receiving missed events published to an aggregate's event stream (364c877).
- Fix typespec typo in Commanded.Application (#503).
v1-4-0
v1.4.0
enhancements-1
Enhancements
- Allow a process manager to stop after dispatching a command (#460).
- Replace
use Mix.Config
withimport Config
in config files (#467). - Event handler concurrency (#486).
- Remove
elixir_uuid
dependency (#493). - Support and test for OTP 25 (#489).
v1-3-1
v1.3.1
bug-fixes-1
Bug fixes
- Event Handler not calling
init/1
callback function on restart (#463). - Call process manager
init/1
function on process restart (#464).
v1-3-0
v1.3.0
enhancements-2
Enhancements
- Allow command identity to be provided during dispatch (#406).
- Define
Commanded.Telemetry
module to emit consistent telemetry events (#414). - Telemetry
[:commanded, :aggregate, :execute]
events (#407). - Telemetry
[:commanded, :event, :handle]
events (#408). - Telemetry
[:commanded, :process_manager, :handle]
events (#418). - Telemetry
[:commanded, :application, :dispatch]
(#423). - Graceful shutdown of event handlers (#431).
- Ensure command dispatch metadata is a map (#432).
- Retry command execution on node down (#429).
- Dispatch returning resultant events (#444).
- Get aggregate state (#448).
- Support telemetry v1.0 (#456).
v1-2-0
v1.2.0
enhancements-3
Enhancements
- Add
init/1
callback function to event handlers and process managers (#393). - Include
application
andhandler_name
as additional event handler metadata (#396). - Allow
GenServer
start options to be provided when starting event handlers and process managers (#398). - Add
hibernate_after
option to application config (#399). - Add support for providing adapter-specific event store subscription options (#391).
- Support custom state for event handlers (#400).
- Allow event handlers and process manager
error
callback to return failure context struct (#397). - Allow a before execute function to be defined which is called with the command dispatch execution context and aggregate state before (#402).
bug-fixes-2
Bug fixes
- Allow process manager
error/3
callback to return:skip
for failed commands, not just failed events (#362).
v1-1-1
v1.1.1
enhancements-4
Enhancements
- Capture exception on Process Manager
apply/2
and callerror/3
callback functions (#380). - Include metadata in upcaster protocol (#389).
bug-fixes-3
Bug fixes
- Fix
Commanded.Aggregate.Multi.execute/2
calls which returnMulti
struct (#385).
v1-1-0
v1.1.0
enhancements-5
Enhancements
- Dynamic Commanded applications (#324).
- Log and ignore unexpected messages received by event handlers and process manager instances (#333)
- Process manager
identity/0
function (#334). - Extend
Commanded.AggregateCase
ExUnit case template to supportCommanded.Aggregate.Multi
. - Allow
Commanded.Aggregate.Multi
to return events as:ok
tagged tuples. - Run the formatter in CI (#341).
- Add stacktraces to EventHandler error logging (#340)
refute_receive_event/4
only tests newly created events (#347).- Allow Commanded Application name to be set dynamically in middleware (#352).
- Remove router module compile-time checking (#363).
- Reduce memory consumption during aggregate state rebuild (#368).
- Upgrade to
phoenix_pubsub
to 2.0 (#365). - Ignore
:not_found
error when resetting InMemory event store (#354). - Add
router/1
tolocals_without_parens
in Mix format config (#351). - Include stacktrace in event handler and process manager
error
callback functions (#342). - Call event handler's
error/3
callback function whenhandle/2
function returns an invalid value (#372).
bug-fixes-4
Bug fixes
- Fixes the typespec for command dispatch (#325).
- Process manager stops if
interested?/1
returns an empty list (#335).
v1-0-1
v1.0.1
enhancements-6
Enhancements
bug-fixes-5
Bug fixes
- Fix distributed subscription registration bug (#345).
- Retry event handler and process manager subscriptions on error (#348).
v1-0-0
v1.0.0
breaking-changes
Breaking changes
- Support multiple Commanded apps (#298).
enhancements-7
Enhancements
- Define adapter behaviour modules for event store, pubsub, and registry (#311).
- Add
AggregateCase
ExUnit case template to support aggregate unit testing (#315). - Application config lookup (#318).
bug-fixes-6
Bug fixes
- Fix process manager exception on start (#307).
- Fix commanded aggregate race (#308).
- Fix Dialyzer warnings and include in Travis CI (#317).
upgrading
Upgrading
Follow the upgrade guide to define and use your own Commanded application.
v0-19-1
v0.19.1
enhancements-8
Enhancements
- Reset event handler mix task
mix commanded.reset MyApp.Handler
(#293).
bug-fixes-7
Bug fixes
- Fix regression in
Commanded.Middleware.Logger.delta
(#295).
v0-19-0
v0.19.0
enhancements-9
Enhancements
- Update typespec for
data
andmetadata
fields inCommanded.EventStore.EventData
struct (#246). - Add
include_execution_result
andaggregate_version
to typespec for router command dispatch (#262). - Add
.formatter.exs
to Hex package (#247). - Event upcasting (#263).
- Support
:ok
tagged tuple events from aggregate (#268). - Modify
Commanded.Registration.start_child
to pass a child_spec (#273). - Add
supervisor_child_spec/2
toCommanded.Registration
behaviour (#277) used by Commanded Horde Registry. - Ensure Commanded can be compiled when optional Jason dependency is not present (#286).
- Fix Aggregate initialization races (#287).
- Support
{:system, varname}
format in Phoenix PubSub config (#291).
breaking-changes-1
Breaking changes
Use
DateTime
instead ofNaiveDateTime
for all datetimes (#254).This affects the
created_at
field defined in theCommanded.EventStore.RecordedEvent
. You will need to migrate fromNaiveDateTime
toDateTime
if you use this field in your code (such as in an event handler's metadata).
v0-18-1
v0.18.1
enhancements-10
Enhancements
- Process manager idle process timeout (#290).
- Register event handler and process manager subscriptions on process start (#272).
v0-18-0
v0.18.0
enhancements-11
Enhancements
- Rename
uuid
dependency toelixir_uuid
(#178). - Allow aggregate identity to be of any type that implements the
String.Chars
protocol (#166). - Process manager and event handler error & exception handling (#192).
- Process manager event handling timeout (#193).
- Allow event handlers to subscribe to individual streams (#203).
- Add new values for
expected_version
for event store append events behaviour (#127). - Export
Commanded.Commands.Router
macros in.formatter.exs
file (#204). - Generate specs and docs for Router dispatch functions only once (#206).
- Allow two-arity predicate function in
wait_for_event
receiving both event data and recorded event struct (#213). - Allow
:infinity
timeout on command dispatch (#227) - Strict process manager routing (#243).
- Allow
Commanded.Aggregate.Multi
to be nested (#244). - Add
child_spec/0
function toCommanded.EventStore
behaviour. - Add
delete_subscription/2
toCommanded.EventStore
behaviour (#245). - Add
refute_receive_event/2
toCommanded.Assertions.EventAssertions
test helpers.
bug-fixes-8
Bug fixes
- Fix typo in
include_execution_result
global router option (#216). - Handle the
{:ok, _}
tuple dispatch result in process manager command dispatch (#236). - Allow string keys for
Commanded.Middleware.Pipeline.assign_metadata/3
, atoms are being deprecated (#228) - Fix
Commanded.PubSub.subscribe
typespec (#222).
breaking-changes-2
Breaking changes
Migrate to Jason for JSON serialization (#234).
You will need to add Jason as a dependency in
mix.exs
:defp deps do [{:jason, "~> 1.2"}] end
Jason has no support for encoding arbitrary structs - explicit implementation of the
Jason.Encoder
protocol is always required. You must update all your domain event modules, aggregate state (when using state snapshotting), and process manager state to include@derive Jason.Encoder
as shown below:defmodule AnEvent do @derive Jason.Encoder defstruct [:field] end
Extend aggregate lifespan behaviour to include
after_error/1
andafter_command/1
callbacks (#210).Previously you only had to define an
after_event/1
callback function to implement theCommanded.Aggregates.AggregateLifespan
behaviour:defmodule BankAccountLifespan do @behaviour Commanded.Aggregates.AggregateLifespan def after_event(%BankAccountClosed{}), do: :stop def after_event(_event), do: :infinity end
Now you must also define
after_command/1
andafter_error/1
callback functions:defmodule BankAccountLifespan do @behaviour Commanded.Aggregates.AggregateLifespan def after_event(%BankAccountClosed{}), do: :stop def after_event(_event), do: :infinity def after_command(%CloseAccount{}), do: :stop def after_command(_command), do: :infinity def after_error(:invalid_initial_balance), do: :stop def after_error(_error), do: :stop end
upgrading-1
Upgrading
Please ensure you upgrade the following event store dependencies.
Using the Elixir EventStore:
Using EventStoreDB:
commanded_extreme_adapter
to v0.6.0
Commanded Ecto projections:
commanded_ecto_projections
to v0.8.0
Commanded scheduler:
commanded_scheduler
to v0.2.0
v0-17-5
v0.17.5
enhancements-12
Enhancements
- Process manager idle process timeout (#290).
v0-17-4
v0.17.4
bug-fixes-9
Bug fixes
- Register event handler and process manager subscriptions on process start (#272).
v0-17-3
v0.17.3
bug-fixes-10
Bug fixes
v0-17-2
v0.17.2
enhancements-13
Enhancements
- Remove default
error/4
callback function from process manager to silence deprecation warning.
v0-17-1
v0.17.1
enhancements-14
Enhancements
- Support
Phoenix.PubSub
v1.1.0.
bug-fixes-11
Bug fixes
- Set default aggregate lifespan timeout to
:infinity
(#200).
v0-17-0
v0.17.0
enhancements-15
Enhancements
- Ability to globally override
include_execution_result
andinclude_aggregate_version
in environment config (#168). - Handle custom type serialization in snapshot source type (#165).
- Fix compiler warnings in generated code (routers, event handlers, and process managers).
- Add
InMemory.reset!/0
for testing purposes (#175).
bug-fixes-12
Bug fixes
- Ensure process managers can be configured with
:strong
consistency. - Fix error when subscription process already tracked (#180).
v0-16-0
v0.16.0
- Support composite command routers (#111).
- Aggregate state snapshots (#121).
- New
error/3
callback for process manager and deprecatederror/4
(#124) - Router support for identity prefix function.
- Retry command execution on concurrency error (#132).
- Event handler
error/3
callback (#133). - Support distributed dispatch consistency (#135).
- Defer event handler and process router init until after subscribed (#138).
- Replace aggregate lifespan
after_command/1
callback withafter_event/1
(#139). - Support process manager routing to multiple instances (#141).
- Allow a default consistency to be set via the application env (#150).
- Command dispatch consistency using explicit handler names (#161).
breaking-changes-3
Breaking changes
- The
Commanded.Aggregates.AggregateLifespan
behaviour has been changed fromafter_command/1
toafter_event/1
. You will need to update your own lifespan modules to use events instead of commands to shutdown an aggregate process after an inactivity timeout.
upgrading-2
Upgrading
Please ensure you upgrade the following event store dependencies.
Using the Elixir EventStore:
Using EventStoreDB:
commanded_extreme_adapter
to v0.5.0
v0-15-1
v0.15.1
bug-fixes-13
Bug fixes
- Event handler
child_spec/1
must include config options defined by use macro.
v0-15-0
v0.15.0
enhancements-16
Enhancements
- Process manager command dispatch error handling (#93).
- Event handlers may define an
init/0
callback function to start any related processes. It must return:ok
, otherwise the handler process will be stopped. - Add
include_execution_result
option to command dispatch (#96). - Add
Commanded.Aggregate.Multi
(#98) as a way to return multiple events from a command dispatch that require aggregate state to be updated after each event. - Correlation and causation ids (#105).
- Initial support for running on a cluster of nodes (#80).
bug-fixes-14
Bug fixes
- Adding a prefix to the aggregate in the router breaks the strong consistency of command dispatch (#101).
upgrading-3
Upgrading
Please ensure you upgrade the following event store dependencies.
Using the Elixir EventStore:
Using EventStoreDB:
commanded_extreme_adapter
to v0.4.0
v0-14-0
v0.14.0
enhancements-17
Enhancements
- Dispatch command with
:eventual
or:strong
consistency guarantee (#82). - Additional stream prefix per aggregate (#77).
- Include custom metadata during command dispatch (#61).
- Validate command dispatch registration in router (59).
upgrading-4
Upgrading
Please ensure you upgrade the following event store dependencies.
Using the Elixir EventStore:
Using EventStoreDB:
commanded_extreme_adapter
to v0.3.0
v0-13-0
v0.13.0
enhancements-18
Enhancements
- Command dispatch optionally returns aggregate version, using
include_aggregate_version: true
during dispatch.
v0-12-0
v0.12.0
enhancements-19
Enhancements
Commanded.Event.Handler
andCommanded.ProcessManagers.ProcessManager
macros to simplify defining, and starting, event handlers and process managers. Note the previous approach to defining and starting may still be used, so this is not a breaking change.
v0-11-0
v0.11.0
enhancements-20
Enhancements
- Shutdown idle aggregate processes (#43).
v0-10-0
v0.10.0
enhancements-21
Enhancements
Extract event store integration to a behaviour (
Commanded.EventStore
). This defines the contract to be implemented by an event store adapter. It allows additional event store databases to be used with Commanded.By default, a
GenServer
in-memory event store adapter is used. This should only be used for testing as there is no persistence.The existing PostgreSQL-based eventstore integration has been extracted as a separate package (commanded_eventstore_adapter). There is also a new adapter for Greg Young's Event Store using the Extreme library (commanded_extreme_adapter).
You must install the required event store adapter package and update your environment configuration to specify the
:event_store_adapter
module. See the README for details.
v0-9-0
v0.9.0
enhancements-22
Enhancements
- Stream events from event store when rebuilding aggregate state.
v0-8-5
v0.8.5
enhancements-23
Enhancements
- Upgrade to Elixir 1.4 and remove compiler warnings.
v0-8-4
v0.8.4
enhancements-24
Enhancements
- Event handler and process manager subscriptions should be created from a given stream position (#14).
- Stop process manager instance after reaching its final state (#24).
v0-8-3
v0.8.3
enhancements-25
Enhancements
- Middleware
after_failure
callback is executed even when a middleware halts execution.
v0-8-2
v0.8.2
bug-fixes-15
Bug fixes
- JsonSerializer should ensure event type atom exists when deserializing (#28).
v0-8-1
v0.8.1
enhancements-26
Enhancements
- Command handlers should be optional by default (#30).
v0-8-0
v0.8.0
enhancements-27
Enhancements
- Simplify aggregates and process managers (#31).
v0-7-1
v0.7.1
bug-fixes-16
Bug fixes
- Restarting aggregate process should load all events from its stream in batches. The Event Store read stream default limit is 1,000 events.
v0-7-0
v0.7.0
enhancements-28
Enhancements
- Command handling middleware allows a command router to define middleware modules that are executed before, and after success or failure of each command dispatch (#12).
v0-6-3
v0.6.3
enhancements-29
Enhancements
- Process manager instance processes event non-blocking to prevent timeout during event processing and any command dispatching. It persists last seen event id to ensure events are handled only once.
v0-6-2
v0.6.2
enhancements-30
Enhancements
- Command dispatch timeout. Allow a
timeout
value to be configured during command registration or dispatch. This overrides the default timeout of 5 seconds. The same as the defaultGenServer
call timeout.
bug-fixes-17
Bug fixes
- Fix pending aggregates restarts: supervisor restarts aggregate process but it cannot accept commands (#22).
v0-6-1
v0.6.1
enhancements-31
Enhancements
- Upgrade
eventstore
mix dependency to v0.6.0 to use support for recorded events created_at asNaiveDateTime
.
v0-6-0
v0.6.0
enhancements-32
Enhancements
- Confirm receipt of events in event handler and process manager router (#19).
- Convert keys to atoms when decoding JSON using Poison decoder.
- Prefix process manager instance snapshot uuid with process manager name.
- Multi command dispatch registration in router (#16).
v0-5-0
v0.5.0
enhancements-33
Enhancements
- Include event metadata as second argument to event handlers. An event handler must now implement the
Commanded.Event.Handler
behaviour consisting of a singlehandle_event/2
function.
v0-4-0
v0.4.0
enhancements-34
Enhancements
- Macro to assist with building process managers (README).
v0-3-1
v0.3.1
enhancements-35
Enhancements
- Include unit test event assertion function:
assert_receive_event/2
(#13). - Include top level application in mix config.
v0-3-0
v0.3.0
enhancements-36
Enhancements
- Don't persist an aggregate's pending events when executing a command returns an error (#10).
bug-fixes-18
Bug fixes
- Ensure an aggregate's pending events are persisted in the order they were applied.
v0-2-1
v0.2.1
enhancements-37
Enhancements
- Support integer, atom or strings as an aggregate UUID (#7).
v0-1-0
v0.1.0
Initial release.