Posted on March 03, 2017

Spine 0.9.0

Core Java

This version is a finalization of the framework API and most of the core features, that are scheduled for 1.0 release.

It also includes a lot of API polishing. Some of the changes are breaking, some are not.

The inner code structure (packaging, visibility of classes etc) has been modified significantly in order to follow the Onion architecture and become easier for understanding.

Below is a list of the most valuable changes and the references to the corresponding pull requests. More feature details are available upon the PR link.

  • Multitenancy support. Please see org.spine3.server.tenant package for the details.

Client-side features:

  • ActorRequestFactory is introduced as a single client-side utility to produce Commands, Queries and Topics: #431.
  • IDs now belong to Command, Event and Failure, not to their contexts: #450, #452.
  • An ability to define the custom Command attributes is introduced to the public API (#448). Also, Command now has the system-only properties hidden from the public access (#455).
  • ActorContext is now a unified context, reflecting the properties of an environment, where a Command, Query or Topic instance is created.
  • Fail-fast Command creation is available via ValidatingBuilders. They are automatically generated for each Command and serve to validate the field values while building Command messages.
  • Stand input parameters are now validated according to the Protobuf annotations set for the requests: #437.

Server-side changes:

  • It is now possible to @Subscribe to Failures: #362, #299.
  • FailureThrowable API simplification: #454.
  • Entity lifecycle:
    • repository views for “archived” and “deleted” items;
    • lifecycle flags: #294, #352, #371, #372.
  • Improvements to entity versioning: #346.
  • AggregatePart and AggregateRoot API improvements: #347.
  • Changes to Command dispatchers and handlers: #354, #358.
  • Simpler routing of commands for Process Managers: #313.
  • StorageFactory is made more configurable for different environments. In particular, it is now easier to provide different Storage implementations for testing and production deployment cases: #289, #290.

    It is now possible to store some of Entity fields separately to allow the further efficient querying: #398.

  • CommandStore and EventStorage are now Repositories, based upon RecordStorage: #394, #395.


  • StringifierRegistry is introduced to organize and simplify string-to-object and object-to-string conversion for Entity state objects and other user-defined types: #389, #382, #383, #378, #423, #436.
  • Improvements to Date/Time API: #387.

Lots of less valuable changes were made as well, including performance improvements, extended configurability of the framework building blocks, more helper utilities and object factories for testing.

Version updates:

  • gRPC 1.1.2 (#341).
  • Gradle 3.5.

New test dependencies:

  • Guava-testlib.