This the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

About

FactCast is a 'good enough' Event-store based on PostgreSQL.
and also
Factus is an API to write Event-Sourced applications on the JVM using FactCast

Actions Status codecov CodeFactor Maven Central DockerHub License


FactCast is written in Java & Kotlin and serves as a basis for working in a distributed environment with loosely coupled software systems that communicate over events.

It provides two APIs for the JVM:

  1. FactCast client: low-level, un-opinionated GRPC library to publish / subscribe to facts
  2. Factus: high-level, opinionated library working with facts as Objects, as well as abstractions like Aggregates & Projections

and also a Schema-Registry that enables FactCast to validate & transform events on the fly.

If you are new here, you might want to read up on the motivation and design for the project.

The project is hosted on GitHub and any kind of contribution is very welcome.

If you have questions that are not easily answered by this website, feel free to open a ‘question’ issue on GitHub, or ask a question on gitter.

1 - Motivation

Event Sourcing

is a great pattern in many ways for technical as well as business reasons. There are a bunch of exciting EventStores, CEP and CQRS Frameworks / Templates out there.

Amongst others in no particular order:

All of these have a slightly different focus, but all of them deal with persisting, streaming and sometimes processing of Events.

The Problem at hand

In a micro-service world, teams choose their own tools of trade. This is a very important benefit of using Micro-services in the first place, and you do not want to mess with this principle. However, where Subsystems communicate with each other (most likely crossing those team borders) you need some common ground. Event Sourcing is a great pattern here (as well as within those subsystems) because of the decoupling effect of its use.

So, what is needed is some technical solution, that everyone can easily agree on, because it forces as little technical dependencies on the clients as possible.

GRPC and similar technological choices provide this solution including streaming, secure transport in a language agnostic way. Oh and one thing: Whatever solution we choose to store and stream forward needs to be failure tolerant, somewhat scalable and should pose minimal operational complexity and overhead to an existing system.

This is where some of the above solutions pose a possible problem:

While all of them are most probably great, when it comes to clustering, backup, data-/application-management and fail-over, none of these are trivial problems and most of them bring their own (certainly great) solution.

Gee, i wish there was a solution, that is flexible, platform neutral and could be operated at scale with what we already know.

2 - Design

Requirements

Some of the requirements that lead to the current design of FactStore are

  • minimal operational effort needed
  • Stateless for simple Fail-over
  • Stateless for horizontal scalability (for reading)
  • well-known data persistence layer for ease of operation
  • well-known data persistence layer to be future proof in the light of the german data protection laws (and yes, that’s not a trivial one)
  • fast enough when writing
  • fast for reading
  • simple (!) enough for teams with very different tools to be able to integrate with their chosen environment
NON-Requirements are
  • excessive write performance (as in high speed trading)
  • full-blown Application Framework

Choices

Based on the aforementioned requirements, let us highlight some technical choices.

PostgreSQL for persistence

Some Reasons for choosing PostgreSQL as persistence layer for the Events:

Serializability / Atomicity

Both technical requirements are trivial when choosing a RDBMS, due to its ACID nature and the availability of Sequences.

Familiarity

Monitoring, Alerting, Backup, Point in time recovery, Authentication / Authorization, read-replication, fail-over … All of those are properties of a good RDBMS and it is hard to find more mature solutions than the ones we can find there.

Flexible Queries

While Document datastores like MongoDB certainly have more to offer here, PostgreSQL is surprisingly good with JSON. FactCast uses GIN Indexes on JSONB Columns in order to find matching Facts for subscriptions easily.

Coordination

With LISTEN and NOTIFY PostgreSQL makes the transition from a passive Data-store to a reactive one, that can be used to guarantee low latency pushes of new Facts down to subscribers, irrelevant at which instance of FactCast the write has happened, without the need of any further message-bus/topic/whatever.

Read-Replicas

A solved problem, that might help you with more than moderate traffic. While we would rather consider partitioning your Facts, in the first place, it might be a welcome ’last resort’ when you have lots and lots of subscribers.

Cloud-ready

With AWS RDS for instance, it is rather trivial to setup and operate a PostgreSQL that satisfies the above needs. It is unlikely to find a respectable cloud platform without postgresql.

GRPC

When it comes to raw performance, REST might not always be the best option. In order to offer a more compact transport, but yet stay platform neutral, FactCast also has a GRPC API. GRPC has a lot of implementations in languages like:

  • C++
  • Java
  • Python
  • Go
  • Ruby
  • C#
  • Node.js
  • Android Java
  • Objective C
  • and even PHP

GRPC.io

Spring Boot (Server)

Spring Boot is a simple Framework to quickly spin up Java Servers. The FactCast Server is implemented using Spring Boot as a container.

Spring (GRPC Client)

In order to make it easy to use the GRPC Client from java, the factcast-client-grpc module depends on Spring as well. This dependency is not exactly tight, so if there is a good reason to, you might want to implement a GRPC Client free of Spring dependencies. If so, let us know.

Limitations

Multi-region distribution with Primary/Primary replication

FactCast is written (and works out of the box) for deployments that contain any number of FactCast Servers that share one PostgreSQL database. To be clear: the FactCast Server itself is horizontally scalable and capable of load-balancing and failover.

While this might sound like a major limitation, it actually hardly is due to several performance optimizations within the FactCast server, as well as the extensive scalability and failover options of today’s cloud offerings.

While there is no technical reason you cannot use FactCast in a multi-database scenario, you’ll have to give it a little thought. If you have doubts, feel free to contact us to discuss your situation.

High-speed trading or gambling

We easily publish thousands and serve and process hundreds of thousands of facts a second. However, if your requirements are in a completely different ballpark, you might want to look at different solutions.

3 - Releases

Only important releases are mentioned here.

For full overview, you can look at the changelog


RELEASE 0.4.3

0.4.3

Fixes

Factus: Important fix regarding threading when using Atomicity


RELEASE 0.4.2

0.4.2

Fixes

Fix AutoConfiguration and make BinarySnapshotSerializer configurable ConcurrentModificationException in SnapshotSerializerSupplier

Features

Factus: Add possibility to add meta K/V Pairs to a FactSpec via @Handler or @HandlerFor Annotations #1595

Documentation

Document hook methods of each Projection #1591 Hitchhikers Guide to Integration Testing #1160


RELEASE 0.4.1

0.4.1
Performance
  • Increase ingestion performance
  • Reduce load on follow subscriptions
Important bugfix
  • Fixes missing “_ser” and “_ts” attributes in header
  • see migration guide if you have been on 0.4.0 before

RELEASE 0.4.0

0.4.0

Feature

Release focuses on stability & performance

Stability

  • complete error handling overhaul
  • application level Keepalive & Retry
  • factus atomic (transactional) processing
  • use of GraalJS for transformation (as Nashorn is deprecated)
  • move to Java11 (for the server side of FactCast)

Performance

  • Tail indexing & Fast-Forward
  • FETCHING catchup strategy
  • Factus bulk processing
  • show progress on factus bulk application

… and a documentation overhaul. For details, see the changelog.


RELEASE 0.3.0

0.3.0

Feature

  • high-level API called Factus that should make application code MUCH easier when using FactCast
  • plenty of new modules:
    • factcast-test
    • factcast-factus
    • factcast-factus-event
    • factcast-factus-bin-snapser
    • factcast-itests-factus
    • factcast-snapshotcache-redisson
  • locking now based on arbitrary FactSpecs rather than only aggIds

Fix / Maint

  • fix important bug screwing with the Fact order in catchup phase if you have >1000 Facts to catch up to (thx, @dibimer)
  • the usual dependency upgrades
  • added switch to allow updates of SchemaRegistry (not a good idea in production, but handy on other stages)

RELEASE 0.2.5

0.2.5
  • important fix for detecting disappearing clients
  • self-defense against spinning clients by refusing excessive reoccurring subscription requests
  • added PID to subscription requests (compatible change)

RELEASE 0.2.4

0.2.4

RELEASE 0.2.1

0.2.1

RELEASE 0.2.0

0.2.0 (milestone)

major features

minor

  • FactCast-core does not include shaded jackson anymore
  • dropped Spring Boot1 support
  • dropped InMem impl of FactCast
  • FactCast Server includes lz4 by default

Past Releases

2019-06-24 0.1.0 (release)

  • Optimistic locking
  • GRPC dynamic compression
  • BASIC_AUTH based secret exchange
  • Spring Security (Reader role)

2018-12-08 0.0.34 (milestone)

2018-11-21 0.0.32 (milestone)

  • new example projects for TLS usage

2018-11-18 0.0.31 (milestone)

  • Introduces / switches to: JUnit5, Spring Boot 2, Testcontainers
  • new example projects
  • Not a drop-in replacement: See Migration Guide

2018-10-21 0.0.20 (milestone)

  • added CLI

2018-10-16 0.0.17 (minor bugfix release)

  • added some constraints on facts

2018-10-16 0.0.15 (emergency release)

  • fixed a potential NPE when using RDS

2018-10-09 0.0.14 (milestone)

  • GRPC API has changed to enable non-breaking changes later.

2018-10-03 0.0.12 (milestone)

  • Note that the jersey impl of the REST interface has its own place on github now. and got new coordinates: org.factcast:factcast-server-rest-jersey:0.0.12. If you use the REST Server, you’ll need to change your dependencies accordingly
  • There is a BOM within FactCast at org.factcast:factcast-bom:0.0.12 you can use to conveniently pin versions - remember that factcast-server-rest-jersey might not be available for every milestone and is not part of the BOM

4 - Changelog

from version 0.4.0 onward, the changelog can be found on github.

older changelogs will be migrated in the near future.


Older changelogs:

0.3.13 (2021-02-25)

Full Changelog

Fixed bugs:

Closed issues:

  • Catch exceptions happening during catchup phase #1183
  • Schema reg CLI: excluded Events are still used in Transformations (thus reported as missing) #1180

Merged pull requests:

0.3.12 (2021-02-25)

Full Changelog

Merged pull requests:

0.3.11 (2021-02-21)

Full Changelog

Fixed bugs:

0.3.10 (2021-02-21)

Full Changelog

Fixed bugs:

  • PGListener does not check if LISTENER is working as expected #1173

Closed issues:

  • Schema reg CLI: excluded Events are still used in Transformations (thus reported as missing) #1180
  • Release 0.3.10: Migration path for 0.3.10+ regarding metric name changes #1177

Merged pull requests:

0.3.9.2 (2021-02-21)

Full Changelog

Implemented enhancements:

  • Partition fact table by namespace #1150

Fixed bugs:

  • PGListener does not check if LISTENER is working as expected #1173

Closed issues:

  • Release 0.3.10: Migration path for 0.3.10+ regarding metric name changes #1177

Merged pull requests:

0.3.9.1 (2021-02-03)

Full Changelog

Closed issues:

  • incompatible dependencies grpc-* #1166
  • add factcast-test to bom #1164
  • Document all metrics (Server and Client) #1155

Merged pull requests:

0.3.9 (2021-01-30)

Full Changelog

Implemented enhancements:

  • Factus: lock on a list of FactSpecs (as avail in factcast interface) #1129
  • Add batch Notification type #1111
  • Verify and test QUEUE catchup strategy #1110
  • Check if lock is still held in subscribed projections #1108
  • Explore use of temp tables instead of catchup table #1107
  • Tweak AbstractIntegrationTest to reuse containers between classes in order to reduce build/test-time #1102
  • Implement callbacks & and interface for before/after update/catchup of projections #1090

Closed issues:

  • IllegalArgumentException with micrometer-registry-prometheus #1142
  • Introduce FETCHING catchup Strategy #1136
  • Consider the impact of multimaps for header.meta #1128
  • Add missing cleanup of ‘catchup’ table #1106

Merged pull requests:

0.3.8 (2020-12-15)

Full Changelog

Implemented enhancements:

  • Factus: lock on a list of FactSpecs (as avail in factcast interface) #1129

Closed issues:

  • Introduce callbacks for “beforeSnapshot” and “beforeHandle” & “afterHandle” #1123
  • Add hashcode/equals to aggregate defaulting to the id #1121
  • Suppress error logging in PgListener when shutting down #1105
  • Add whitelisting capability for schema registry #1092

Merged pull requests:

0.3.7 (2020-12-03)

Full Changelog

Implemented enhancements:

  • Use an explicit getId() call instead of class.getCanonicalName() to avoid conflicts when dealing with anonymous classes. #1084
  • Explore use of temp tables instead of catchup table #1107
  • Tweak AbstractIntegrationTest to reuse containers between classes in order to reduce build/test-time #1102
  • Implement callbacks & and interface for before/after update/catchup of projections #1090
  • #1098: added synchronization on catchup #1100 (uweschaefer)
  • #1090: afterUpdate callback in Snapshot/Managed-projection #1099 (uweschaefer)
  • Fixes #827 and improves other error message #1091 (samba2)

Fixed bugs:

  • set liberal limits in integrationTest #1114
  • GrpcFactStore: handshake happens too late (Other beans could already use it) #1086
  • Make sure Schemaregistry uses the same code for building transformationchains (during validation) than factcast itself. #1104
  • #1114: Bandwitdth protection: better fingerprinting, switch to disable… #1115 (uweschaefer)

Closed issues:

  • Suppress metrics for time diff on subscribed projections before catchup. #1109
  • make sure the update of snapshot projections is wrapped in synchronized in order make 100% sure that state is synced to heap before projection instance goes public #1098
  • Factus: Change locking of local projections to synchronize on a private mutex rather than the projection itself #1094
  • schema-registry-cli: Enrich validation result output. #827
  • Suppress error logging in PgListener when shutting down #1105
  • Add whitelisting capability for schema registry #1092

Merged pull requests:

0.3.6 (2020-10-21)

Full Changelog

Implemented enhancements:

  • Factus: When fetching SnapshotProjections takes a significant time, persist intermediate snapshots now and then in case another thread also fetches, or the fetching is interrupted before it ends. #1075
  • Use an explicit getId() call instead of class.getCanonicalName() to avoid conflicts when dealing with anonymous classes. #1084
  • Use an explicit getId() call instead of class.getCanonicalName() to avoid conflicts when dealing with anonymous classes. #1085 (uweschaefer)

Fixed bugs:

  • GrpcFactStore: handshake happens too late (Other beans could already use it) #1086
  • #1086_grpcfactstore–handshake-happe: initialize on construction #1087 (uweschaefer)

Closed issues:

  • Move metric collection regarding snapshots to snapshotcache #1080
  • Factus snapshot deserialization is a fatal error although it doesn’t have to #1040

Merged pull requests:

0.3.5 (2020-10-19)

Full Changelog

Implemented enhancements:

  • clear local redis in integration test #1071
  • Factus: When fetching SnapshotProjections takes a significant time, persist intermediate snapshots now and then in case another thread also fetches, or the fetching is interrupted before it ends. #1075
  • #1075 Factus: When fetching SnapshotProjections takes a significant time, persist intermediate snapshots now and then in case another thread also fetches, or the fetching is interrupted before it ends. #1082 (uweschaefer)

Closed issues:

  • Move metric collection regarding snapshots to snapshotcache #1080

Merged pull requests:

0.3.4 (2020-10-14)

Full Changelog

Implemented enhancements:

  • clear local redis in integration test #1071

Fixed bugs:

  • Unify naming (SnapshotCache vs SnapshotRepository) and fix Autoconfiguration for SnapshotCaches #1070
  • [Factus] Lock on non-existing aggregate leads to exception #1041
  • Issue1070 autoconfiguration & name unification of snapshotCaches #1072 (uweschaefer)

Closed issues:

  • Switch formatting to google format #1054
  • RedissonSnapshotCacheAutoConfiguration doesnt kick in #1052
  • Factus snapshot deserialization is a fatal error although it doesn’t have to #1040

Merged pull requests:

0.3.3 (2020-09-25)

Full Changelog

Closed issues:

  • RedissonSnapshotCacheAutoConfiguration doesnt kick in #1052

Merged pull requests:

0.3.2 (2020-09-10)

Full Changelog

Merged pull requests:

  • Fix: FactCastAutoConfiguration also configures EventSerializer #1025 (BernhardBln)
  • Update dependency com.diffplug.spotless:spotless-maven-plugin to v2.2.0 #1022 (renovate[bot])

0.3.1 (2020-09-08)

Full Changelog

Fixed bugs:

  • Factus autoconfiguration is always on #1023

Closed issues:

  • Implement filesystem based schemaregistry #965

Merged pull requests:

0.3.0 (2020-08-30)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • Mixed up fact order in catchup phase 1, if more than 1000 facts are waiting #1002
  • #1002: stable order for catchup beyond page-size #1006 (uweschaefer)

Closed issues:

  • Provide high-level client library for java #942
  • Introduce msgpack as optional format for (only) fact serialization #928

Merged pull requests:

factcast-0.1.4.3 (2020-08-28)

Full Changelog

Closed issues:

  • Fix Response Compression #959
  • Coordinate Schemaregistry updates between servers… #953
  • Add metrics for changes in #941 #950
  • Improve connection testing and keepalive while waiting for notifications #941
  • Introduce msgpack as optional format for (only) fact serialization #928
  • Add Module for integration Tests including GRPC #612

0.2.5 (2020-07-05)

Full Changelog

Fixed bugs:

  • Facts in recieve buffer may still be delivered after subscription.close() is called during onNext() #907

Closed issues:

  • Extract examples to extra project #923
  • add Coordinated subscription #450
  • Dangling subscriptions #937
  • Optimize startup time of factcast-docker #934
  • restructure modules (integration tests) #930
  • Create integration test for validation disabled mode #881

Merged pull requests:

0.2.4 (2020-07-02)

Full Changelog

Closed issues:

  • Prevent integration test artifacts from being deployed to central #924

Merged pull requests:

0.2.3 (2020-07-02)

Full Changelog

0.2.2 (2020-07-02)

Full Changelog

Implemented enhancements:

  • Simplify FactSpec generation from a list of classes. #888

Fixed bugs:

  • Fix VM base for docker image #917

Closed issues:

  • add database generated timestamp to metadata #910
  • Add retryer for IO actions #894
  • Switch CI from circleci to gh actions #877
  • Switch to gitflow maven plugin for release prep #921
  • Move to dockerfile-maven plugin for docker building and releasing #912
  • add fromNullable(UUID orNull) to the SubscriptionRequest api #908

Merged pull requests:

factcast-0.2.1 (2020-06-29)

Full Changelog

Closed issues:

  • Limit Auto-Reconnection behavior and escalate to application layer early. #889

Merged pull requests:

factcast-0.2.0 (2020-06-21)

Full Changelog

Closed issues:

  • Publish Docker Image during release #884

factcast-0.2.0-RC2 (2020-06-10)

Full Changelog

Closed issues:

  • Factcast throws Exception (on publish) if validation is disabled #880
  • replace LZ4 impl with commons-compress #861

factcast-0.2.0-RC (2020-06-01)

Full Changelog

Fixed bugs:

  • Ratrace in LISTENing for database notifications #780
  • #780: fixed pglistener to poll initially *after* reconnect #785 (uweschaefer)

Closed issues:

  • Fix usage of Nashorn (for now) in postQueryMatching #848
  • Prepare for building with JDK>8 #841
  • reduce codacy violations to 0 #834
  • ship lz4 codec with factcast server #832
  • cleanup inspired by to IDEA warnings #830
  • Update integration tests to use new API for transformation #828
  • Restore / extend fetchById #804
  • clear documentation regarding header field aggId(s) #788
  • DepShield encountered errors while building your project #768
  • [DepShield] (CVSS 9.8) Vulnerability due to usage of com.fasterxml.jackson.core:jackson-databind:2.9.10.3 #750

Merged pull requests:

factcast-0.2.0-M10 (2020-04-07)

Full Changelog

Closed issues:

  • DepShield encountered errors while building your project #759
  • stop registry cli from exiting when exitCode would be 0 #751
  • [DepShield] (CVSS 7.5) Vulnerability due to usage of commons-beanutils:commons-beanutils:1.7.0 #741
  • [DepShield] (CVSS 9.8) Vulnerability due to usage of commons-collections:commons-collections:3.2.1 #740
  • remove lombok from kotlin modules #732
  • Subscription without type does not return expected results #731
  • Remove unused Feature: ID-Subscriptions #725
  • Transformations #715
  • SchemaStore needs to depend on SpringLiquibase #712
  • Cleanup Security configuration #704
  • Wrap Schemaregistry cli into maven plugin #660
  • Integration Test #447

Merged pull requests:

factcast-0.2.0-M9 (2020-03-05)

Full Changelog

Closed issues:

  • FactValidatorConfiguration is not autoconfigured #700

Merged pull requests:

factcast-0.2.0-M8 (2020-03-04)

Full Changelog

Closed issues:

  • Client yields “UNAUTHENTICATED: Authentication failed” even if Factcast security is disabled #696

Merged pull requests:

  • build(deps): bump jackson-databind from 2.9.10.1 to 2.9.10.3 in /factcast-bom #698 (dependabot[bot])
  • Fixed non-matching passwords for unauthenticated access #697 (otbe)

factcast-0.2.0-M7 (2020-03-04)

Full Changelog

factcast-0.2.0-M6 (2020-03-03)

Full Changelog

factcast-0.2.0-M5 (2020-03-03)

Full Changelog

factcast-0.2.0-M4 (2020-03-03)

Full Changelog

factcast-0.2.0-M3 (2020-03-03)

Full Changelog

Closed issues:

  • Split secrets out of factcast-access.json #677

factcast-0.2.0-M2 (2020-03-03)

Full Changelog

Implemented enhancements:

  • Send version information when publishing (optional) in order to be able to validate against a schema #599
  • Schemaregistry that holds a catalog of schemas in order to validate on publish #598

Fixed bugs:

  • DDL and DML user separation doesn’t work as advertised #548

Closed issues:

  • Fix Kotlin formatting #691
  • fc-schema-cli does not compile on java 11 #688
  • [DepShield] (CVSS 9.8) Vulnerability due to usage of com.fasterxml.jackson.core:jackson-databind:2.9.10.1 #671
  • [DepShield] (CVSS 9.8) Vulnerability due to usage of com.fasterxml.jackson.core:jackson-databind:2.9.9.3 #661
  • disable shading of jackson into core #657
  • Factcast CLI fails on publishing events #643
  • Add sponsoring note #639
  • Flaky test PgQueryTest.testRoundtripCatchupEventsInsertedAfterStart #628
  • Implement Schemaregistry configuration #627
  • Flaky Test PgQueryTest.testRoundtripCatchupEventsInsertedAfterStart:164 #625
  • Module for reference server docker building #621
  • Remove the need for two maven profiles for spotless #618
  • Make site generation platform agnostic #614
  • Module for composite docker container with a factcast server & postgres embedded #610
  • Wrap site generation in docker container #608
  • Drop inMem impl of FactStore #607
  • Drop support for Spring-boot 1 #605
  • Extend Security configuration to assign roles to namespaces #604
  • Remove DDL/DML distinction as it causes more trouble than it is worth #601
  • [DepShield] (CVSS 9.8) Vulnerability due to usage of com.fasterxml.jackson.core:jackson-databind:2.9.9.2 #584
  • Jackson: CVE-2019-14379, CVE-2019-14439 #516
  • Improve developer experience for eclipse users #510
  • configure maven plugin version explicitly #507
  • use -RAM instance for postgres in circle-CI #505
  • Bump spring-grpc.version from 2.3.0.RELEASE to 2.4.0.RELEASE #445

Merged pull requests:

factcast-0.1.4.2 (2019-07-28)

Full Changelog

Closed issues:

  • Detach from mercateo oss parent pom #503

factcast-0.1.4.1 (2019-07-28)

Full Changelog

Fixed bugs:

  • 0.1.4 contains SLF4J-API classes #496

Closed issues:

  • [DepShield] (CVSS 10.0) Vulnerability due to usage of com.fasterxml.jackson.core:jackson-databind:2.8.11.3 #499
  • [DepShield] (CVSS 5.9) Vulnerability due to usage of com.fasterxml.jackson.core:jackson-databind:2.9.9 #498

Merged pull requests:

factcast-0.1.4 (2019-07-20)

Full Changelog

factcast-0.1.3 (2019-07-20)

Full Changelog

factcast-0.1.2 (2019-07-20)

Full Changelog

Closed issues:

  • Jackson Databind Security fix #489
  • pgsql-rds: TomcatJdbcDataSourceFactory properties (spring.datasource.tomcat.*) are not regarded #485
  • Shade jackson #470

Merged pull requests:

factcast-0.1.0 (2019-06-24)

Full Changelog

Implemented enhancements:

  • Fix initialization order of PG-Components #441
  • Unify autoconfiguration #310
  • Extend API to enumerate existing namespaces & types in store #153
  • Provide CLI Client for GRPC #152
  • Provide Builder for Fact to make sure it has a namespace #147
  • Add TLS for communication encryption #122
  • gRPC: add Codec for snappy or lz4 compression #77
  • Prepare for Compaction #60
  • Add Channel Authentication #55
  • Question about MarkFacts & sync UIs #44
  • Performance: Use Queue for Paging in Catchup process #38
  • Enable GZIP for REST-API #27
  • Try to change LISTEN strategy, so that traditional JDBC Driver can be used. #26
  • Introduce faster streams for REST and Document client setup #23
  • Add proper javadocs #22

Fixed bugs:

  • grpc client version 36 incompatible to master #432
  • Unexpected BuildError in circleCI that is not locally repoducable #430
  • dynamic AWS RDS-Settings doesn’t work with version 0.1.0-M1 #408
  • InMem FactCast doesn’t support lastKnownEventId #307
  • Fact.Builder needs public methods #165
  • Facts with same id are not reported as duplicate to grpc client #149
  • Update compilation problem with Java10 #139
  • Bug: GRPC API Accepts publishing of Facts without namespace #137
  • [emergency] RDS autoConfig throws NPE #135
  • Implement serialOf in grpc server #133
  • GRPC Service RemoteFactCast is not auto-configured #124
  • Flaky test setup with circleCI #59
  • Follow subscriptions no longer work after “Connection to [url] refused”. #56
  • flaky test #49
  • application.properties in server project with datasource parameters #42
  • Catchup: remove need for long running JDBC Connection #30
  • Renaming continous to continuous #28
  • Connection lost while subscribing #25

Closed issues:

  • added currentTimestamp() to store interface #459
  • Extend GRPC Protocol with a call to fetch the current database-time #458
  • Abstract filterScript to enable future extension with non-js scripts. #457
  • Security: jackson databind vulnerability #456
  • Bump spring-boot-dependencies from 2.1.5.RELEASE to 2.1.6.RELEASE #455
  • Bump postgresql from 42.2.5 to 42.2.6 #454
  • Bump spring-boot-maven-plugin from 2.1.5.RELEASE to 2.1.6.RELEASE #452
  • Bump spotless-maven-plugin from 1.23.0 to 1.23.1 #451
  • Bump guava from 27.1-jre to 28.0-jre #449
  • log as info. no need to log error within a working feature #448
  • fixed grpc.client properties in examples and doc #446
  • Bump mockito.version from 2.27.0 to 2.28.2 #444
  • Abstract javascript in subReq in order to be open to extensions #443
  • #441: serialized init order #442
  • Bump grpc.version from 1.18.0 to 1.21.0 #440
  • Bump postgresql from 1.11.2 to 1.11.3 #439
  • PgSQL test setup polish #438
  • #428: cli usage page #437
  • Issue432 JSON Deser problem on unknown properties #436
  • Bump oss-parent-pom from 1.0.7 to 1.0.9 #435
  • #430: flaky test #434
  • Move and rename PgSqlListenerTest.java #433
  • #430: build error - hanging test #431
  • Update XML formatter version #429
  • Document CLI #428
  • #424: fixed host/port -> address, added –basic #427
  • #425: added xml formatting config and reformatted accordingly #426
  • Align spotless formatting rules for xml with maven’s #425
  • Add BasicAuth capablity to CLI #424
  • #70: repeatedly check listen/notify on pgconnection #423
  • #407: added basicauth docs, reorganized menu #422
  • Issue#272 document good settings for keepalive #421
  • Fix Spring Boot 1 example client dependency #420
  • Bump spring-boot-maven-plugin from 2.1.4.RELEASE to 2.1.5.RELEASE #419
  • Bump spring-boot-starter-security from 2.1.4.RELEASE to 2.1.5.RELEASE #418
  • Bump spring-boot-dependencies from 2.1.4.RELEASE to 2.1.5.RELEASE #417
  • Bump jacoco-maven-plugin from 0.8.3 to 0.8.4 #416
  • Update Spotless Eclipse Formatter to 4.11 #415
  • pgsql: add micrometer metrics #414
  • Issue412 remove subscribeToIds etc #413
  • Remove caching & id-subscription #412
  • issue 408: #411
  • Bump lombok from 1.18.6 to 1.18.8 #410
  • #404: automatic reconnection in daemon thread #409
  • Document Basic-Auth setup #407
  • Issue405 site update #406
  • Update site #405
  • Change subscription follow behaviour to reconnecting #404
  • #212: moved property namespace #403
  • #401: guard against null returned from attempt() #402
  • Opt.Locking: Check against null returned from attempt() #401
  • Bump spotless-maven-plugin from 1.22.0 to 1.23.0 #400
  • #397: removed markfacts from docs #399
  • Issue390 #398
  • Remove MarkFacts from documentation #397
  • WIP Issue395 #396
  • Apply IDEA inspection suggestions #395
  • #251: removed marks #394
  • #210: removed metrics #393
  • Add proper Metrics using micrometer.io #392
  • #390: added snappy #391
  • Add Snappy compression Codec #390
  • Bump spring-boot-starter-security from 2.1.3.RELEASE to 2.1.4.RELEASE #389
  • postgres module uuid-oosp documentation #388
  • Bump spotless-maven-plugin from 1.21.1 to 1.22.0 #387
  • Bump postgresql from 1.11.1 to 1.11.2 #386
  • #140 lz4codec #385
  • #250-aggregate-validation-errors: aggregate validation errors #384
  • #382: oneliners #383
  • Cleanup all README.md #382
  • #234-gzip-compression-reenable: reenable gzip message compression #381
  • Refactor GrpcFactStore.java #380
  • #370-macosx-hugo: script dispatching to respective binary #379
  • #55-basicauth: added basicauth #378
  • Bump netty-tcnative-boringssl-static from 2.0.24.Final to 2.0.25.Final #377
  • pass along command line arguments to SpringApplication #376
  • Bump mockito.version from 2.26.0 to 2.27.0 #375
  • #373: hacky way to work with either version 2.1 and 2.3 of grpc-sprin… #374
  • Fix Spring Boot1 example dependencies #373
  • Bump grpc.version from 1.18.0 to 1.20.0 #371
  • Scripts starting Hugo should use a macos version on macos #370
  • DepShield encountered errors while building your project #369
  • Spotless polish #368
  • Bump junit-platform-commons from 1.4.1 to 1.4.2 #367
  • #issue353 : minor change : fixed typo in bash script output only #366
  • Issue364 upgrade to junit5 - coverage problem #365
  • Evaluate Coverage drop when updating to junit 5.4 #364
  • Issue332 Optimistic Locking Documentation #363
  • Bump junit-platform-engine from 1.4.0 to 1.4.2 #362
  • Bump junit-jupiter-engine from 5.3.2 to 5.4.2 #361
  • Bump spring-boot-maven-plugin from 2.1.3.RELEASE to 2.1.4.RELEASE #360
  • Bump junit-jupiter-api from 5.3.2 to 5.4.2 #359
  • Bump mockito.version from 2.25.1 to 2.26.0 #358
  • Bump spring-boot-dependencies from 2.1.3.RELEASE to 2.1.4.RELEASE #357
  • #355: Updated spring-grpc version #356
  • Bump spring-grpc.version from 2.1.0.RELEASE to 2.3.0.RELEASE #355
  • Issue353 spotless auto-apply #354
  • Add configuration option for spotless auto-apply #353
  • Issue351 fix maven plugin version warnings #352
  • fix version warnings for spring-maven-plugin #351
  • Issue189 spotless #350
  • Issue348 update to latest version of yidongnan/grpc-spring-boot-starter #349
  • Update to latest grpc/netty deps #348
  • removed unique_identifier feature #347
  • Remove unique_identifier #346
  • Issue239 factstore extensions #345
  • Issue338 transaction scoped locks #344
  • #341: add lockGlobally #343
  • Issue331 - implement optimistic locking via GRPC #342
  • Subtask to #325: allow for state capturing independent of namespace #341
  • Fix maven plugin configuration #340
  • improved usage of xmllint #339
  • Missing events due to race-condition during concurrent fact-publish #338
  • add test to reproduce missing events in subscription #337
  • Bump netty-tcnative-boringssl-static from 2.0.17.Final to 2.0.24.Final #336
  • Issue330: Implement optimistic locking aspect of PgFactStore #335
  • Issue330 #334
  • Issue329 PgTokenStore #333
  • Subtask to #325: Document optimistic locking #332
  • Subtask to #325: Extend GRPC protocol to support new methods on FactStore #331
  • Subtask to #325: Implement methods used by optimistic locking on PgFactStore #330
  • Subtask to #325: Implement Pg-based TokenStore #329
  • Bump postgresql from 1.11.0 to 1.11.1 #328
  • Bump postgresql from 1.10.7 to 1.11.0 #327
  • Bump netty-tcnative-boringssl-static from 2.0.17.Final to 2.0.23.Final #326
  • Optimistic locking #325
  • Issue312 fix documentation regarding project setup & examples #324
  • fix: class renamed, but not spring.factories #323
  • Bump junit-jupiter-engine from 5.3.2 to 5.4.1 #322
  • Bump junit-jupiter-api from 5.3.2 to 5.4.1 #321
  • Bump mockito.version from 2.25.0 to 2.25.1 #320
  • Bump junit-platform-engine from 1.4.0 to 1.4.1 #319
  • Bump assertj-core from 3.12.1 to 3.12.2 #318
  • Remove rest from site #317
  • Cleanup pg prefixes on classnames depends on pr315 #316
  • Issue310 autoconfiguration #315
  • DepShield encountered errors while building your project #314
  • Bump postgresql from 1.10.6 to 1.10.7 #313
  • Update the ‘Server Setup’ documentation #312
  • Issue310 autoconfiguration #311
  • Bump guava from 27.0.1-jre to 27.1-jre #309
  • Fix catchup with startingFrom-FactId #308
  • Bump mockito.version from 2.24.5 to 2.25.0 #306
  • Bump spring-cloud-dependencies from Greenwich.RELEASE to Greenwich.SR1 #305
  • Bump netty-tcnative-boringssl-static from 2.0.17.Final to 2.0.22.Final #304
  • Bump assertj-core from 3.12.0 to 3.12.1 #303
  • Bump grpc.version from 1.18.0 to 1.19.0 #302
  • Update pom.xml #301
  • Bump mockito.version from 2.24.0 to 2.24.5 #300
  • Bump junit-jupiter-engine from 5.3.2 to 5.4.0 #299
  • Bump slf4j-api.version from 1.7.25 to 1.7.26 #298
  • Bump junit-jupiter-api from 5.3.2 to 5.4.0 #297
  • Bump lombok from 1.18.4 to 1.18.6 #296
  • Bump assertj-core from 3.11.1 to 3.12.0 #295
  • Bump os-maven-plugin from 1.6.1 to 1.6.2 #294
  • Bump spring-grpc.version from 2.1.0.RELEASE to 2.2.1.RELEASE #293
  • Bump spring-boot-maven-plugin from 1.5.17.RELEASE to 2.1.3.RELEASE #292
  • Bump spring-boot-dependencies from 2.1.1.RELEASE to 2.1.3.RELEASE #291
  • Bump junit-platform-engine from 1.3.2 to 1.4.0 #290
  • Bump mockito.version from 2.23.4 to 2.24.0 #289
  • Bump liquibase-core from 3.6.2 to 3.6.3 #288
  • Bump postgresql from 1.10.5 to 1.10.6 #287
  • Bump jacoco-maven-plugin from 0.8.2 to 0.8.3 #286
  • Bump spring-cloud-dependencies from Finchley.SR2 to Greenwich.RELEASE #285
  • Bump grpc.version from 1.17.1 to 1.18.0 #284
  • Bump spring-boot-maven-plugin from 1.5.17.RELEASE to 2.1.2.RELEASE #283
  • Bump spring-boot-dependencies from 2.1.1.RELEASE to 2.1.2.RELEASE #282
  • Bump oss-parent-pom from 1.0.6 to 1.0.7 #281
  • Bump oss-parent-pom from 1.0.5 to 1.0.6 #280
  • Bump postgresql from 1.10.4 to 1.10.5 #279
  • Bump postgresql from 1.10.3 to 1.10.4 #278
  • Bump maven-failsafe-plugin from 3.0.0-M2 to 3.0.0-M3 #277
  • Bump maven-surefire-plugin from 3.0.0-M2 to 3.0.0-M3 #276
  • Bump spring-grpc.version from 2.1.0.RELEASE to 2.2.0.RELEASE #275
  • Bump postgresql from 1.10.2 to 1.10.3 #274
  • Bump jackson-databind from 2.9.7 to 2.9.8 #273
  • Document good settings for keepalive behaviour #272
  • #270: added –no-tls #271
  • Add –no-tls to CLI to connect using plaintext #270
  • print usage when cli options incomplete #269
  • CLI: Exceptions when Options incomplete #268
  • Bump maven-surefire-plugin from 3.0.0-M1 to 3.0.0-M2 #267
  • Bump maven-failsafe-plugin from 3.0.0-M1 to 3.0.0-M2 #266
  • #264: removed queued catchup strategy #265
  • Drop Queued Catchup #264
  • Issue260 #263
  • Bump grpc.version from 1.16.1 to 1.17.0 #262
  • Fix scope of test dependencies and some order shuffling. #261
  • Create abstraction for Retryable Exceptions between Store and FactCast #260
  • Bump spring-boot-dependencies from 2.1.0.RELEASE to 2.1.1.RELEASE #259
  • Bump spring-boot-maven-plugin from 1.5.17.RELEASE to 2.1.1.RELEASE #258
  • Bump postgresql from 1.10.1 to 1.10.2 #257
  • Bump junit-jupiter-api from 5.3.1 to 5.3.2 #256
  • Bump junit-platform-engine from 1.3.1 to 1.3.2 #255
  • Bump netty-tcnative-boringssl-static from 2.0.17.Final to 2.0.20.Final #254
  • Bump junit-jupiter-engine from 5.3.1 to 5.3.2 #253
  • Issue247 #252
  • Better validation errors on publishing #250
  • #246: more careful catchup mechanics #249
  • this should break the build due to formal incorrectnes #248
  • Check formal requirements on CI #247
  • Flaky test in InMemStore #246
  • CLI: add switch to talk to TLS #245
  • Issue240 make test methods package private #244
  • #240_coverage_analysis: baseline #243
  • Issue240 Rename TestCases and limit test method scopes (JUnit5) #242
  • Issue122 #241
  • Cleanup Tests #240
  • Extend API with prerequisites for optimistic locking #239
  • Issue122 TLS examples #238
  • Bump mockito.version from 2.23.0 to 2.23.4 #237
  • Issue235 copyright header migration from javadoc to slash-star #236
  • Migrate copyright headers from javadoc to slashstar #235
  • GRPC Client->Server communication regression #234
  • Bump guava from 27.0-jre to 27.0.1-jre #233
  • fixed empty catch block #232
  • Bump spring-boot-maven-plugin from 1.5.17.RELEASE to 2.1.0.RELEASE #231
  • Bump docker-maven-plugin from 0.4.9 to 1.2.0 #230
  • Bump guava from 26.0-jre to 27.0-jre #229
  • Bump slf4j-api from 1.7.22 to 1.7.25 #228
  • Bump protobuf-maven-plugin from 0.5.1 to 0.6.1 #227
  • Fix ‘Empty catch block.’ issue in factcast-server-grpc\src\main\java\org\factcast\server\grpc\FactStoreGrpcService.java #226
  • Fix ‘Empty catch block.’ issue in factcast-server-grpc\src\main\java\org\factcast\server\grpc\FactStoreGrpcService.java #225
  • Bump build-helper-maven-plugin from 1.8 to 3.0.0 #223
  • Bump postgresql from 42.2.5.jre7 to 42.2.5 #222
  • Bump assertj-core from 2.6.0 to 3.11.1 #221
  • Bump oss-parent-pom from 1.0.0 to 1.0.4 #220
  • Bump os-maven-plugin from 1.4.1.Final to 1.6.1 #219
  • Fix ‘Trailing spaces’ issue in .circleci\config.yml #218
  • Fix ‘Overload methods should not be split. Previous overloaded method located at line ‘104’.’ issue in factcast-grpc-api\src\main\java\org\factcast\grpc\api\conv\ProtoConverter.java #217
  • migration guide #216
  • Add migration Guide to documentation #215
  • store-pgsql: move auto-configuration out of module #214
  • Issue98 JUNIT5, Spring Boot2, better example projects (boot1.5 & boot2.1) #213
  • Sanitize properties #212
  • fix verson and scope for slf4j-simple dep. #211
  • Replace dropwizard Metrics by micrometer.io #210
  • Switch Server-side depenencies to boot2 #209
  • Introduce proper test categorization #208
  • [Snyk] Fix for 4 vulnerable dependencies #207
  • introduce impsort plugin and pre-commit hook #206
  • Unify and enforce import order on java sources #205
  • Issue203 #204
  • Consider using testcontainers for local testing with postgres instead of flapdoodle #203
  • minor changes suggested by IDEA inspection #202
  • Consider IDEAs analysis suggestions #201
  • Issue78 integrated spring-boot-2 branch #200
  • Issue190 applied review comments #199
  • [Snyk] Fix for 6 vulnerable dependencies #198
  • [Snyk] Fix for 6 vulnerable dependencies #197
  • #190: added log messages #196
  • Issue194 tried to limit memory usage again for use in circleci #195
  • Try to improve test flakyness by using different base image #194
  • minor changes #193
  • Upgrade dependencies to spring-grpc #192
  • Issue188 dependency cleanup #191
  • Handle unavailable Nashorn engine #190
  • Consider formatting with spotless #189
  • Remove direct dependencies from parent pom #188
  • Extract dependency management to factcast-dependencies project #187
  • #185: added @NonNull contract to obserer.onNext #186
  • GenericObserver.next should guarantee to not be called with null parameter #185
  • #183 remove use of powermock #184
  • replace use of powermock #183
  • #180 Recheck PGStore notification mechanism (follow-subscriptions sometimes seem to starve) #182
  • [WIP] Spring Boot 2 #181
  • Recheck pg store internal notification #180
  • #178: codacy review #179
  • Avoid unused local variables such as ‘sub’. #178
  • Avoid unused imports such as ‘org.factcast.grpc.compression.lz4.LZ4Codec’ #177
  • #175: added debug switch #176
  • CLI: add –debug to log at least info-level messages to the console #175
  • #169: added server impl version to handshake, and log it on the client #174
  • #170: added index for enumeration of ns and type #173
  • #171: added exception message to output #172
  • CLI: Print exception details when failing #171
  • PSQL Store: Create index to support enumeration queries #170
  • Add Server Implementation Version to ServerConfig #169
  • GRPC Response Compression via Interceptor #168
  • #153 add Namespace and Type enumeration #167
  • #165: opened Fact.Builder methods #166
  • Prettify JSON output #164
  • CLI: add -pretty option to format JSON in output #163
  • #161: added serialOf to CLI #162
  • CLI: Implement serialOf #161
  • compression config cleanup #160
  • Cleanup LZ4 & GZIP Configuration #159
  • #157: introduced FACTCAST_SERVER env variable #158
  • CLI: reintroduce getting defaults for -h and -p from environment #157
  • added CLI #156
  • Factory Method Fact.of(JsonNode, JsonNode) #155
  • Open SpecBuilder #154
  • #149: propage exception in GrpcFactStore::publish #151
  • #147: provide build for fact #150
  • WIP: ITD-55540: Added cli #148
  • #145: added constraints for header.ns and header.id, added migration … #146
  • store-pgsql must not accept facts without namespace #145
  • Issue135: add default values for tomcat properties #144
  • #142: some coverage improvements #143
  • Improve coverage #142
  • #140: prepared codec for grpc-spring-boot-starter/issues/96 #141
  • Add LZ4 Codecs according to upstream @GrpcCodec Feature #140
  • #137: enforce namespace attribute on publish #138
  • #135: reset RDS autoconfig to 0.0.6 #136
  • #133: added serialOf to GRPC Service #134
  • Reconsider usage of spring-starter for grpc client #132
  • #130: cleanup, added guava,pgsql versions to BOM #131
  • Cleanup for 0.0.14 release #130
  • Add credentials usage on GRPC (TLS a prereq) #129
  • #123: added handshake method that transports a string map & the proto… #128
  • Issue125 #127
  • added autoconfig #126
  • Upgrade grpc deps to 1.12.0 #125
  • Implement GRPC negotiation protocol #123
  • Issue119 #121
  • changed favicon #120
  • Replace favicon… #119
  • #117: added automatically generated changelog to site #118
  • Automatic changelog generation from Issue & PR Data #117
  • Issue84 #116
  • moved rest module to extra project #115
  • moved examples to dedicated directory #114
  • added BOM project for version pinning #113
  • Move server project to example-server #112
  • Provide a convenient solution for version pinning #111
  • Update maven-[surefire,failsafe]-plugin to 2.22.0 #110
  • Upgrade junit dependency to 5.3.1 #109
  • #99: switched tests to embed pgsql 10 #108
  • #106: updated dependency for pg-embed #107
  • Upgrade embedded postgres dependency #106
  • Issue87 #105
  • An instanceof check is being performed on the caught exception. Create a separate catch clause for this exception type. #104
  • Fields should be declared at the top of the class, before any method declarations, constructors, initializers or inner classes. #103
  • Fields should be declared at the top of the class, before any method declarations, constructors, initializers or inner classes. #102
  • #86: added rpc endpoint for protocol version in grpc #101
  • Issue96 #100
  • Move pg to version 10 #99
  • Migrate Tests to JUNIT5 #98
  • Issue95 #97
  • add repolocal githooks #96
  • fix hugo version #95
  • Issue79 #94
  • use provided pgsql in circleci #93
  • Document unique_identifier #92
  • unique_identifier added. fixes #82 #91
  • Issue53 #90
  • Update README.md #89
  • Deploy Milestone 0.10 to maven central #88
  • Document .clear in InMemFactStore #87
  • Add Version info procedure to GRPC protocol #86
  • Avoid embedded postgres if possible #85
  • Extract REST code to separate repo #84
  • In-memory FactStore clear #81
  • #53: add timeouts for pgsql #80
  • Switch to JUnit5 #79
  • Move Spring code to spring boot 2.x #78
  • fixes #45 #76
  • fixes #71 #75
  • added global server interceptor #74
  • add global gzip compression to all grpc communication server -> client #73
  • cannot run Target: org.factcast.server.grpc.TransportLayerException: null #72
  • Unregister call from Eventbus fails unexpectedly #71
  • Subscriptions can become stale? #70
  • Ignore .factorypath #68
  • added DSGVO/GDPR declaration #67
  • Add GDPR Declaration to website #66
  • Upgrade circleci to 2.0 #65
  • adapt oss-parent-pom #64
  • Adapt to use oss-parent-pom #63
  • added license plugin, #61 #62
  • Add License plugin to project #61
  • Remove wrapping of SQLException #58
  • Remove wrapping of SQLException #57
  • Upgrade dependencies #54
  • Add some Timeouts when working with PGSQL #53
  • Array of ids in meta data #52
  • Issue46 rework #51
  • testing snyk #50
  • Add imprint #48
  • Issue46 #47
  • Unclosed Subscriptions via Rest #46
  • Migrate all existing Facts by adding meta._ser #45
  • updated browser REST consumer example #41
  • issue#38 added queued catchup strategy #40
  • added mapping exception test #39
  • Coverage improved. #37
  • Rest: support for postQueryFiltering is missing? #36
  • Closing a subscription during catchup causes IOExceptions #34
  • data source initalization with remote aws rds call #33
  • renamed continuous #32
  • Issue#30 #31
  • Issue 23 #29
  • typo fix #24
  • unify schema for subscription-request between rest & grpc api #20
  • publish schema for subscriptionrequest #19
  • Add js based gRPC and REST consumer/producer usage exmaples #18
  • Publishing at high rates throws #17
  • Moving cursor without hit #16
  • Moving cursor without hit #15
  • renamed aggId to aggIds #14
  • Rename aggId to aggIds #13
  • many aggIds per Fact #12
  • liquibase support for event store #11
  • Supply proper metrics #10
  • Fields should be declared at the top of the class, before any method declarations, constructors, initializers or inner classes. #9
  • Avoid throwing raw exception types. #8
  • Switch statements should have a default label #7
  • Fields should be declared at the top of the class, before any method declarations, constructors, initializers or inner classes. #6
  • Add a Codacy badge to README.md #5
  • polish variable-/field-names #4
  • Pimp my Readme #3
  • remove Thread.sleep from tests #2
  • use spring support for jersey hyper schema generator #1

* This Changelog was automatically generated by github_changelog_generator

5 - Migration Guide

Upgrading to 0.4.1

This only applies if you used 0.4.0 on you data before.

If you rely on the header meta-attributes ‘_ser’ or ‘_ts’, there was a bug in 0.4.0 that has the consequence, of some events missing the mentioned attributes.

In order to add them where they are missing, you would want to execute the following SQL on your factstore database:

update fact set header =
        jsonb_set( header, '{meta}' ,
            COALESCE(header->'meta','{}')
                || concat('{"_ser":', ser ,
                    ', "_ts":', EXTRACT(EPOCH FROM now()::timestamptz(3))*1000, '}' )::jsonb
                , true)
    WHERE (header ->> 'meta')::jsonb ->> '_ser' is null

Obviously, the timestamp will not be correct here, but at least there is one. If you have a better indication of the publishing time in the payload of your events, you may want to use that one instead.

Upgrading to 0.4.0

Please make sure you followed the migration guide if your current version is <0.3.10.

Building

  • Java11 runtime is required for building and running the server

  • lombok val is disallowed by configuration

    Please use Java11’s final var instead.

Server

  • Java11 runtime is required for building and running the server

  • Default Postgres version shifted from 9.6 to 11.5

    While there is no indication that FactCast won’t run on 9.x or 10.x we test against 11 now, (as 14 already is around the corner)

  • Property namespace for the store has been changed from org.factcast.store.pg to org.factcast.store.

    While 0.4.0 still supports the older namespace, it is deprecated and should be migrated asap. Note that new properties are only added to the new namespace, so please adjust your projects accordingly.

  • Note that the default catchup strategy was changed from PAGED or TMPPAGED to FETCHING. Make sure your postgres does not timeout connections.

Client

  • The Subscription default for ‘maxBatchDelayInMs’ changed from 0msec to 10msec

    We feel like this is a good compromise between reducing the server load and minimizing latency. If you absolutely need minimum latency, you can still set it to 0 on a per-subscription basis.

  • The default for factcast.grpc.client.catchup-batchsize is set to 50.

    If, for some weird reason, you don’t want the transfer to be batched, you can set this down to 1 again.

  • The default for factcast.grpc.client.id is ${spring.application.name}

    The id is used for logging purposes on the server.

Upgrading to 0.3.10

0.3.10 changes the namespaces of the metrics. Also some metric names have been changed for consistency reasons. If you created dashboards for example based on those names, please be prepared to update them accordingly. You can find the current metric names here.

Upgrading to 0.3.0

There is a new module for use in projects that provide ‘EventObjects’ but do not want to depend on factcast-core, which is called “factcast-factus-event”. @Specification and interface EventObject have been moved there - please update your imports accordingly if necessary.

Another new module is factcast-test which is supposed to help with integration tests by adding a capability to dynamically alter namespaces in integration tests. See testing section

factcast.lockGlobally() has been removed. By adding the new locking capabilities, that define the scope of the lock not just by aggregate-ids, but by FactSpecs, ’lockGlobally()’ needed to be deleted, as there is no proper way to provide a compatible migration path. As most of the internals of FactCast rely on namespaces (for instance for authorization), you really need to enumerate all possible namespaces that are in scope for the lock. Please use factcast.lock(List<FactSpec>) instead. Sorry for the inconvenience.

Upgrading to 0.2.1

Reconnection behavior

Reconnecting due to connection/unknown errors has changed from an infinite loop to just try five times (in a window of three seconds) and escalate if they failed. Details can be found here.

Upgrading to 0.2.0 (quite a lot)

header field ‘aggId’ replaced by ‘aggIds’

This change was actually two years ago, but it was not documented well, and if you used certain factory methods of DefaultFact, a field ‘aggId’ was created/read. So, to make it perfectly clear, a Fact can have an ‘aggIds’ header field, which is an array of uuids.

A FactSpec, however has an optional ‘aggId’ (without the ’s’), as it is not an array, but a single one. We encourage you to update any header in your postgres, that contains ‘aggId’, rather than ‘aggIds’ in the course of migration to 0.2.0

basic-auth setup has changed

If you used a ‘factcast-security.json’ before, you will be please to learn that FactCast was extended to support role/namespace based authorisation. Also the filename changed to ‘factcast-access.json’.

see basicauth usage

basic-auth setup is enforced

By default, when executing without security enabled, you need to supply a property ‘factcast.security.enabled=false’ via commandline or propertyfile to get away with just a warning. If you don’t, FactCast will exit with errorcode 1.

fetching facts by ID has been extended

Next to fetchById(UUID) (asking for the event exactly the way it was published), there is a new fetchByIdAndVersion(UUID,int), that makes FactCast try to transform the event up/down to the requested version. Of course, the usage of a schema-registry is a precondition, as it provides the code to do that transformation.

Upgrading to 0.1.0

unique_identifier

If you used the uniqueidentifier feature before, it was removed. It was only a rouge hack that was used to coordinate two instance in case of publishing. By now, coordination can be done via optimistic locking, so that the need for _unique_identifier is no longer there.

optimistic locking

There is a section on optimistic locking as a new api feature.

Postgres module uuid-ossp

The Postgres module uuid-ossp is necessary for the new optimistic locking api feature. In order to install this extension, the user performing the Liquibase operations requires Postgres superuser permissions.

GRPC Protocol Version

The GRPC Protocol Version shifted from 1.0.0 to 1.1.0. That means, in order to talk to a FactCast server with version 0.1.0, you can use and client from 0.0.30 on, but in order to use a 0.1.0 client, you’d need to talk to a FactCast server with at least the same protocol version than your client. So the idea is: first update your servers, then update the clients.

GRPC Addresses, Hosts, Ports

We updated to yidongnan/grpc-spring-boot-starter. In order to direct your client to a particular target address of a FactCast server, you might have specified:

grpc.client.factstore.port=9443
grpc.client.factstore.host=localhost

this was replaced by

grpc.client.factstore.address=static://localhost:9443

or

grpc.client.factstore.address=dns:///some.host:9443

see https://github.com/yidongnan/grpc-spring-boot-starter for details

Upgrading to 0.0.30

Spring Boot 2

If you use Spring boot, please note, that all projects now depend on Spring Boot 2 artifacts. Support for Spring Boot 1.x was removed.

Plaintext vs TLS

There was a dependency upgrade of grpc-spring-boot-starter in order to support TLS. Note that the default client configuration is now switched to TLS. That means, if you want to continue communicating in an unencrypted fashion, you need to set an application property of ‘grpc.client.factstore.negotiation-type=PLAINTEXT’.

Testcontainers / Building and Testing

In order to run integration tests, that need a Postgres to run, FactCast now uses Testcontainers in order to download and run an ephemeral Postgres. For this to work, the machine that runs test must have docker installed and the current user needs to be able to run and stop docker containers.

You can still override this behavior by supplying an Environment-Variable ‘pg_url’ to use a particular postgres instead. This might be important for build agents that themselves run within docker and do not provide Docker-in-Docker.

Upgrading to 0.0.14

  • Incompatible change in GRPC API

The GRPC API has changed to enable non-breaking changes later. (Version endpoint added) The result is, that you have to use > 0.0.14 on Client and Server consistently.

Noteworthy 0.0.12

  • Note that the jersey impl of the REST interface has its own place on github now. and got new coordinates: org.factcast:factcast-server-rest-jersey:0.0.12. If you use the REST Server, you’ll need to change your dependencies accordingly

  • There is a BOM within FactCast at org.factcast:factcast-bom:0.0.12 you can use to conveniently pin versions - remember that factcast-server-rest-jersey might not be available for every milestone and is not part of the BOM

6 - Contribution

Any Contribution, be it code, issues, docs etc. are more than welcome if they comply with ASL2. Please head over to GitHub and help!

Have a look at the guide on contributing for the first steps.

Thank you

Contributors

3930 commits
480 commits
467 commits
375 commits
82 commits
55 commits
42 commits
31 commits
13 commits
11 commits
11 commits
8 commits
7 commits
7 commits
6 commits
6 commits
2 commits
2 commits
1 commits
1 commits
1 commits
1 commits
1 commits
1 commits
1 commits
1 commits

and also

7 - Legal Notice / Impressum (German)

Angaben gemäß § 5 TMG

Uwe Schäfer
Humboldtstr 14a
04105 Leipzig

Kontakt:
Telefon: 0341-35523665
E-Mail: fc-imprint-auth-63542f22leie878o2< At >codesmell.de

Haftungsausschluss:

Haftung für Inhalte

Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.

Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.

Urheberrecht

Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.

Datenschutz

Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben. Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich. Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.

Impressum vom impressum-generator.de der Kanzlei Hasselbach Rechtsanwälte


Datenschutzerklärung

Diese Datenschutzerklärung klärt Sie über die Art, den Umfang und Zweck der Verarbeitung von personenbezogenen Daten (nachfolgend kurz „Daten“) innerhalb unseres Onlineangebotes und der mit ihm verbundenen Webseiten, Funktionen und Inhalte sowie externen Onlinepräsenzen, wie z.B. unser Social Media Profile auf (nachfolgend gemeinsam bezeichnet als „Onlineangebot“). Im Hinblick auf die verwendeten Begrifflichkeiten, wie z.B. „Verarbeitung“ oder „Verantwortlicher“ verweisen wir auf die Definitionen im Art. 4 der Datenschutzgrundverordnung (DSGVO).

Verantwortlicher

Uwe Schäfer
Humboldtstr 14a
04105 Leipzig
fc-dsgvo-auth-71663 codesmell.de
Impressum siehe oben

Kontakt Datenschutzbeauftragter: fc-dsgvo-auth-71663 --at-- codesmell.de

Arten der verarbeiteten Daten:

- Bestandsdaten (z.B., Namen, Adressen).
- Kontaktdaten (z.B., E-Mail, Telefonnummern).
- Inhaltsdaten (z.B., Texteingaben, Fotografien, Videos).
- Nutzungsdaten (z.B., besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten).
- Meta-/Kommunikationsdaten (z.B., Geräte-Informationen, IP-Adressen).

Kategorien betroffener Personen

Besucher und Nutzer des Onlineangebotes (Nachfolgend bezeichnen wir die betroffenen Personen zusammenfassend auch als „Nutzer“).

Zweck der Verarbeitung

- Zurverfügungstellung des Onlineangebotes, seiner Funktionen und Inhalte.
- Beantwortung von Kontaktanfragen und Kommunikation mit Nutzern.
- Sicherheitsmaßnahmen.
- Reichweitenmessung/Marketing

Verwendete Begrifflichkeiten

„Personenbezogene Daten“ sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person (im Folgenden „betroffene Person“) beziehen; als identifizierbar wird eine natürliche Person angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung (z.B. Cookie) oder zu einem oder mehreren besonderen Merkmalen identifiziert werden kann, die Ausdruck der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen oder sozialen Identität dieser natürlichen Person sind.

„Verarbeitung“ ist jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang oder jede solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten. Der Begriff reicht weit und umfasst praktisch jeden Umgang mit Daten.

„Pseudonymisierung“ die Verarbeitung personenbezogener Daten in einer Weise, dass die personenbezogenen Daten ohne Hinzuziehung zusätzlicher Informationen nicht mehr einer spezifischen betroffenen Person zugeordnet werden können, sofern diese zusätzlichen Informationen gesondert aufbewahrt werden und technischen und organisatorischen Maßnahmen unterliegen, die gewährleisten, dass die personenbezogenen Daten nicht einer identifizierten oder identifizierbaren natürlichen Person zugewiesen werden.

„Profiling“ jede Art der automatisierten Verarbeitung personenbezogener Daten, die darin besteht, dass diese personenbezogenen Daten verwendet werden, um bestimmte persönliche Aspekte, die sich auf eine natürliche Person beziehen, zu bewerten, insbesondere um Aspekte bezüglich Arbeitsleistung, wirtschaftliche Lage, Gesundheit, persönliche Vorlieben, Interessen, Zuverlässigkeit, Verhalten, Aufenthaltsort oder Ortswechsel dieser natürlichen Person zu analysieren oder vorherzusagen.

Als „Verantwortlicher“ wird die natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet, bezeichnet.

„Auftragsverarbeiter“ eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die personenbezogene Daten im Auftrag des Verantwortlichen verarbeitet.

Maßgebliche Rechtsgrundlagen

Nach Maßgabe des Art. 13 DSGVO teilen wir Ihnen die Rechtsgrundlagen unserer Datenverarbeitungen mit. Sofern die Rechtsgrundlage in der Datenschutzerklärung nicht genannt wird, gilt Folgendes: Die Rechtsgrundlage für die Einholung von Einwilligungen ist Art. 6 Abs. 1 lit. a und Art. 7 DSGVO, die Rechtsgrundlage für die Verarbeitung zur Erfüllung unserer Leistungen und Durchführung vertraglicher Maßnahmen sowie Beantwortung von Anfragen ist Art. 6 Abs. 1 lit. b DSGVO, die Rechtsgrundlage für die Verarbeitung zur Erfüllung unserer rechtlichen Verpflichtungen ist Art. 6 Abs. 1 lit. c DSGVO, und die Rechtsgrundlage für die Verarbeitung zur Wahrung unserer berechtigten Interessen ist Art. 6 Abs. 1 lit. f DSGVO. Für den Fall, dass lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person eine Verarbeitung personenbezogener Daten erforderlich machen, dient Art. 6 Abs. 1 lit. d DSGVO als Rechtsgrundlage.

Sicherheitsmaßnahmen

Wir treffen nach Maßgabe des Art. 32 DSGVO unter Berücksichtigung des Stands der Technik, der Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeit und Schwere des Risikos für die Rechte und Freiheiten natürlicher Personen, geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes Schutzniveau zu gewährleisten.

Zu den Maßnahmen gehören insbesondere die Sicherung der Vertraulichkeit, Integrität und Verfügbarkeit von Daten durch Kontrolle des physischen Zugangs zu den Daten, als auch des sie betreffenden Zugriffs, der Eingabe, Weitergabe, der Sicherung der Verfügbarkeit und ihrer Trennung. Des Weiteren haben wir Verfahren eingerichtet, die eine Wahrnehmung von Betroffenenrechten, Löschung von Daten und Reaktion auf Gefährdung der Daten gewährleisten. Ferner berücksichtigen wir den Schutz personenbezogener Daten bereits bei der Entwicklung, bzw. Auswahl von Hardware, Software sowie Verfahren, entsprechend dem Prinzip des Datenschutzes durch Technikgestaltung und durch datenschutzfreundliche Voreinstellungen (Art. 25 DSGVO).

Zusammenarbeit mit Auftragsverarbeitern und Dritten

Sofern wir im Rahmen unserer Verarbeitung Daten gegenüber anderen Personen und Unternehmen (Auftragsverarbeitern oder Dritten) offenbaren, sie an diese übermitteln oder ihnen sonst Zugriff auf die Daten gewähren, erfolgt dies nur auf Grundlage einer gesetzlichen Erlaubnis (z.B. wenn eine Übermittlung der Daten an Dritte, wie an Zahlungsdienstleister, gem. Art. 6 Abs. 1 lit. b DSGVO zur Vertragserfüllung erforderlich ist), Sie eingewilligt haben, eine rechtliche Verpflichtung dies vorsieht oder auf Grundlage unserer berechtigten Interessen (z.B. beim Einsatz von Beauftragten, Webhostern, etc.).

Sofern wir Dritte mit der Verarbeitung von Daten auf Grundlage eines sog. „Auftragsverarbeitungsvertrages“ beauftragen, geschieht dies auf Grundlage des Art. 28 DSGVO.

Übermittlungen in Drittländer

Sofern wir Daten in einem Drittland (d.h. außerhalb der Europäischen Union (EU) oder des Europäischen Wirtschaftsraums (EWR)) verarbeiten oder dies im Rahmen der Inanspruchnahme von Diensten Dritter oder Offenlegung, bzw. Übermittlung von Daten an Dritte geschieht, erfolgt dies nur, wenn es zur Erfüllung unserer (vor)vertraglichen Pflichten, auf Grundlage Ihrer Einwilligung, aufgrund einer rechtlichen Verpflichtung oder auf Grundlage unserer berechtigten Interessen geschieht. Vorbehaltlich gesetzlicher oder vertraglicher Erlaubnisse, verarbeiten oder lassen wir die Daten in einem Drittland nur beim Vorliegen der besonderen Voraussetzungen der Art. 44 ff. DSGVO verarbeiten. D.h. die Verarbeitung erfolgt z.B. auf Grundlage besonderer Garantien, wie der offiziell anerkannten Feststellung eines der EU entsprechenden Datenschutzniveaus (z.B. für die USA durch das „Privacy Shield“) oder Beachtung offiziell anerkannter spezieller vertraglicher Verpflichtungen (so genannte „Standardvertragsklauseln“).

Rechte der betroffenen Personen

Sie haben das Recht, eine Bestätigung darüber zu verlangen, ob betreffende Daten verarbeitet werden und auf Auskunft über diese Daten sowie auf weitere Informationen und Kopie der Daten entsprechend Art. 15 DSGVO.

Sie haben entsprechend. Art. 16 DSGVO das Recht, die Vervollständigung der Sie betreffenden Daten oder die Berichtigung der Sie betreffenden unrichtigen Daten zu verlangen.

Sie haben nach Maßgabe des Art. 17 DSGVO das Recht zu verlangen, dass betreffende Daten unverzüglich gelöscht werden, bzw. alternativ nach Maßgabe des Art. 18 DSGVO eine Einschränkung der Verarbeitung der Daten zu verlangen.

Sie haben das Recht zu verlangen, dass die Sie betreffenden Daten, die Sie uns bereitgestellt haben nach Maßgabe des Art. 20 DSGVO zu erhalten und deren Übermittlung an andere Verantwortliche zu fordern.

Sie haben ferner gem. Art. 77 DSGVO das Recht, eine Beschwerde bei der zuständigen Aufsichtsbehörde einzureichen.

Widerrufsrecht

Sie haben das Recht, erteilte Einwilligungen gem. Art. 7 Abs. 3 DSGVO mit Wirkung für die Zukunft zu widerrufen

Widerspruchsrecht

Sie können der künftigen Verarbeitung der Sie betreffenden Daten nach Maßgabe des Art. 21 DSGVO jederzeit widersprechen. Der Widerspruch kann insbesondere gegen die Verarbeitung für Zwecke der Direktwerbung erfolgen.

Cookies und Widerspruchsrecht bei Direktwerbung

Als „Cookies“ werden kleine Dateien bezeichnet, die auf Rechnern der Nutzer gespeichert werden. Innerhalb der Cookies können unterschiedliche Angaben gespeichert werden. Ein Cookie dient primär dazu, die Angaben zu einem Nutzer (bzw. dem Gerät auf dem das Cookie gespeichert ist) während oder auch nach seinem Besuch innerhalb eines Onlineangebotes zu speichern. Als temporäre Cookies, bzw. „Session-Cookies“ oder „transiente Cookies“, werden Cookies bezeichnet, die gelöscht werden, nachdem ein Nutzer ein Onlineangebot verlässt und seinen Browser schließt. In einem solchen Cookie kann z.B. der Inhalt eines Warenkorbs in einem Onlineshop oder ein Login-Status gespeichert werden. Als „permanent“ oder „persistent“ werden Cookies bezeichnet, die auch nach dem Schließen des Browsers gespeichert bleiben. So kann z.B. der Login-Status gespeichert werden, wenn die Nutzer diese nach mehreren Tagen aufsuchen. Ebenso können in einem solchen Cookie die Interessen der Nutzer gespeichert werden, die für Reichweitenmessung oder Marketingzwecke verwendet werden. Als „Third-Party-Cookie“ werden Cookies bezeichnet, die von anderen Anbietern als dem Verantwortlichen, der das Onlineangebot betreibt, angeboten werden (andernfalls, wenn es nur dessen Cookies sind spricht man von „First-Party Cookies“).

Wir können temporäre und permanente Cookies einsetzen und klären hierüber im Rahmen unserer Datenschutzerklärung auf.

Falls die Nutzer nicht möchten, dass Cookies auf ihrem Rechner gespeichert werden, werden sie gebeten die entsprechende Option in den Systemeinstellungen ihres Browsers zu deaktivieren. Gespeicherte Cookies können in den Systemeinstellungen des Browsers gelöscht werden. Der Ausschluss von Cookies kann zu Funktionseinschränkungen dieses Onlineangebotes führen.

Ein genereller Widerspruch gegen den Einsatz der zu Zwecken des Onlinemarketing eingesetzten Cookies kann bei einer Vielzahl der Dienste, vor allem im Fall des Trackings, über die US-amerikanische Seite http://www.aboutads.info/choices/ oder die EU-Seite http://www.youronlinechoices.com/ erklärt werden. Des Weiteren kann die Speicherung von Cookies mittels deren Abschaltung in den Einstellungen des Browsers erreicht werden. Bitte beachten Sie, dass dann gegebenenfalls nicht alle Funktionen dieses Onlineangebotes genutzt werden können.

Löschung von Daten

Die von uns verarbeiteten Daten werden nach Maßgabe der Art. 17 und 18 DSGVO gelöscht oder in ihrer Verarbeitung eingeschränkt. Sofern nicht im Rahmen dieser Datenschutzerklärung ausdrücklich angegeben, werden die bei uns gespeicherten Daten gelöscht, sobald sie für ihre Zweckbestimmung nicht mehr erforderlich sind und der Löschung keine gesetzlichen Aufbewahrungspflichten entgegenstehen. Sofern die Daten nicht gelöscht werden, weil sie für andere und gesetzlich zulässige Zwecke erforderlich sind, wird deren Verarbeitung eingeschränkt. D.h. die Daten werden gesperrt und nicht für andere Zwecke verarbeitet. Das gilt z.B. für Daten, die aus handels- oder steuerrechtlichen Gründen aufbewahrt werden müssen.

Nach gesetzlichen Vorgaben in Deutschland, erfolgt die Aufbewahrung insbesondere für 10 Jahre gemäß §§ 147 Abs. 1 AO, 257 Abs. 1 Nr. 1 und 4, Abs. 4 HGB (Bücher, Aufzeichnungen, Lageberichte, Buchungsbelege, Handelsbücher, für Besteuerung relevanter Unterlagen, etc.) und 6 Jahre gemäß § 257 Abs. 1 Nr. 2 und 3, Abs. 4 HGB (Handelsbriefe).

Nach gesetzlichen Vorgaben in Österreich erfolgt die Aufbewahrung insbesondere für 7 J gemäß § 132 Abs. 1 BAO (Buchhaltungsunterlagen, Belege/Rechnungen, Konten, Belege, Geschäftspapiere, Aufstellung der Einnahmen und Ausgaben, etc.), für 22 Jahre im Zusammenhang mit Grundstücken und für 10 Jahre bei Unterlagen im Zusammenhang mit elektronisch erbrachten Leistungen, Telekommunikations-, Rundfunk- und Fernsehleistungen, die an Nichtunternehmer in EU-Mitgliedstaaten erbracht werden und für die der Mini-One-Stop-Shop (MOSS) in Anspruch genommen wird.

Kontaktaufnahme

Bei der Kontaktaufnahme mit uns (z.B. per Kontaktformular, E-Mail, Telefon oder via sozialer Medien) werden die Angaben des Nutzers zur Bearbeitung der Kontaktanfrage und deren Abwicklung gem. Art. 6 Abs. 1 lit. b) DSGVO verarbeitet. Die Angaben der Nutzer können in einem Customer-Relationship-Management System ("CRM System") oder vergleichbarer Anfragenorganisation gespeichert werden.

Wir löschen die Anfragen, sofern diese nicht mehr erforderlich sind. Wir überprüfen die Erforderlichkeit alle zwei Jahre; Ferner gelten die gesetzlichen Archivierungspflichten.

Hosting und E-Mail-Versand

Die von uns in Anspruch genommenen Hosting-Leistungen dienen der Zurverfügungstellung der folgenden Leistungen: Infrastruktur- und Plattformdienstleistungen, Rechenkapazität, Speicherplatz und Datenbankdienste, E-Mail-Versand, Sicherheitsleistungen sowie technische Wartungsleistungen, die wir zum Zwecke des Betriebs dieses Onlineangebotes einsetzen.

Hierbei verarbeiten wir, bzw. unser Hostinganbieter Bestandsdaten, Kontaktdaten, Inhaltsdaten, Vertragsdaten, Nutzungsdaten, Meta- und Kommunikationsdaten von Kunden, Interessenten und Besuchern dieses Onlineangebotes auf Grundlage unserer berechtigten Interessen an einer effizienten und sicheren Zurverfügungstellung dieses Onlineangebotes gem. Art. 6 Abs. 1 lit. f DSGVO i.V.m. Art. 28 DSGVO (Abschluss Auftragsverarbeitungsvertrag).

Erhebung von Zugriffsdaten und Logfiles

Wir, bzw. unser Hostinganbieter, erhebt auf Grundlage unserer berechtigten Interessen im Sinne des Art. 6 Abs. 1 lit. f. DSGVO Daten über jeden Zugriff auf den Server, auf dem sich dieser Dienst befindet (sogenannte Serverlogfiles). Zu den Zugriffsdaten gehören Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.

Logfile-Informationen werden aus Sicherheitsgründen (z.B. zur Aufklärung von Missbrauchs- oder Betrugshandlungen) für die Dauer von maximal 7 Tagen gespeichert und danach gelöscht. Daten, deren weitere Aufbewahrung zu Beweiszwecken erforderlich ist, sind bis zur endgültigen Klärung des jeweiligen Vorfalls von der Löschung ausgenommen.

Google Analytics

Wir setzen auf Grundlage unserer berechtigten Interessen (d.h. Interesse an der Analyse, Optimierung und wirtschaftlichem Betrieb unseres Onlineangebotes im Sinne des Art. 6 Abs. 1 lit. f. DSGVO) Google Analytics, einen Webanalysedienst der Google LLC („Google“) ein. Google verwendet Cookies. Die durch das Cookie erzeugten Informationen über Benutzung des Onlineangebotes durch die Nutzer werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.

Google ist unter dem Privacy-Shield-Abkommen zertifiziert und bietet hierdurch eine Garantie, das europäische Datenschutzrecht einzuhalten (https://www.privacyshield.gov/participant?id=a2zt000000001L5AAI&status=Active).

Google wird diese Informationen in unserem Auftrag benutzen, um die Nutzung unseres Onlineangebotes durch die Nutzer auszuwerten, um Reports über die Aktivitäten innerhalb dieses Onlineangebotes zusammenzustellen und um weitere, mit der Nutzung dieses Onlineangebotes und der Internetnutzung verbundene Dienstleistungen, uns gegenüber zu erbringen. Dabei können aus den verarbeiteten Daten pseudonyme Nutzungsprofile der Nutzer erstellt werden.

Wir setzen Google Analytics nur mit aktivierter IP-Anonymisierung ein. Das bedeutet, die IP-Adresse der Nutzer wird von Google innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt.

Die von dem Browser des Nutzers übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt. Die Nutzer können die Speicherung der Cookies durch eine entsprechende Einstellung ihrer Browser-Software verhindern; die Nutzer können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf ihre Nutzung des Onlineangebotes bezogenen Daten an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter folgendem Link verfügbare Browser-Plugin herunterladen und installieren: http://tools.google.com/dlpage/gaoptout?hl=de.

Weitere Informationen zur Datennutzung durch Google, Einstellungs- und Widerspruchsmöglichkeiten, erfahren Sie in der Datenschutzerklärung von Google (https://policies.google.com/technologies/ads) sowie in den Einstellungen für die Darstellung von Werbeeinblendungen durch Google (https://adssettings.google.com/authenticated).

Die personenbezogenen Daten der Nutzer werden nach 14 Monaten gelöscht oder anonymisiert.

Google Universal Analytics

Wir setzen Google Analytics in der Ausgestaltung als „Universal-Analytics“ ein. „Universal Analytics“ bezeichnet ein Verfahren von Google Analytics, bei dem die Nutzeranalyse auf Grundlage einer pseudonymen Nutzer-ID erfolgt und damit ein pseudonymes Profil des Nutzers mit Informationen aus der Nutzung verschiedener Geräten erstellt wird (sog. „Cross-Device-Tracking“).

Onlinepräsenzen in sozialen Medien

Wir unterhalten Onlinepräsenzen innerhalb sozialer Netzwerke und Plattformen, um mit den dort aktiven Kunden, Interessenten und Nutzern kommunizieren und sie dort über unsere Leistungen informieren zu können. Beim Aufruf der jeweiligen Netzwerke und Plattformen gelten die Geschäftsbedingungen und die Datenverarbeitungsrichtlinien deren jeweiligen Betreiber.

Soweit nicht anders im Rahmen unserer Datenschutzerklärung angegeben, verarbeiten wir die Daten der Nutzer sofern diese mit uns innerhalb der sozialen Netzwerke und Plattformen kommunizieren, z.B. Beiträge auf unseren Onlinepräsenzen verfassen oder uns Nachrichten zusenden.

Einbindung von Diensten und Inhalten Dritter

Wir setzen innerhalb unseres Onlineangebotes auf Grundlage unserer berechtigten Interessen (d.h. Interesse an der Analyse, Optimierung und wirtschaftlichem Betrieb unseres Onlineangebotes im Sinne des Art. 6 Abs. 1 lit. f. DSGVO) Inhalts- oder Serviceangebote von Drittanbietern ein, um deren Inhalte und Services, wie z.B. Videos oder Schriftarten einzubinden (nachfolgend einheitlich bezeichnet als “Inhalte”).

Dies setzt immer voraus, dass die Drittanbieter dieser Inhalte, die IP-Adresse der Nutzer wahrnehmen, da sie ohne die IP-Adresse die Inhalte nicht an deren Browser senden könnten. Die IP-Adresse ist damit für die Darstellung dieser Inhalte erforderlich. Wir bemühen uns nur solche Inhalte zu verwenden, deren jeweilige Anbieter die IP-Adresse lediglich zur Auslieferung der Inhalte verwenden. Drittanbieter können ferner so genannte Pixel-Tags (unsichtbare Grafiken, auch als "Web Beacons" bezeichnet) für statistische oder Marketingzwecke verwenden. Durch die "Pixel-Tags" können Informationen, wie der Besucherverkehr auf den Seiten dieser Website ausgewertet werden. Die pseudonymen Informationen können ferner in Cookies auf dem Gerät der Nutzer gespeichert werden und unter anderem technische Informationen zum Browser und Betriebssystem, verweisende Webseiten, Besuchszeit sowie weitere Angaben zur Nutzung unseres Onlineangebotes enthalten, als auch mit solchen Informationen aus anderen Quellen verbunden werden.

Vimeo

Wir können die Videos der Plattform “Vimeo” des Anbieters Vimeo Inc., Attention: Legal Department, 555 West 18th Street New York, New York 10011, USA, einbinden. Datenschutzerklärung: https://vimeo.com/privacy. WIr weisen darauf hin, dass Vimeo Google Analytics einsetzen kann und verweisen hierzu auf die Datenschutzerklärung (https://www.google.com/policies/privacy) sowie Opt-Out-Möglichkeiten für Google-Analytics (http://tools.google.com/dlpage/gaoptout?hl=de) oder die Einstellungen von Google für die Datennutzung zu Marketingzwecken (https://adssettings.google.com/.).

Youtube

Wir binden die Videos der Plattform “YouTube” des Anbieters Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA, ein. Datenschutzerklärung: https://www.google.com/policies/privacy/, Opt-Out: https://adssettings.google.com/authenticated.

Google Fonts

Wir binden die Schriftarten ("Google Fonts") des Anbieters Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA, ein. Datenschutzerklärung: https://www.google.com/policies/privacy/, Opt-Out: https://adssettings.google.com/authenticated.

Twitter

Innerhalb unseres Onlineangebotes können Funktionen und Inhalte des Dienstes Twitter, angeboten durch die Twitter Inc., 1355 Market Street, Suite 900, San Francisco, CA 94103, USA, eingebunden werden. Hierzu können z.B. Inhalte wie Bilder, Videos oder Texte und Schaltflächen gehören, mit denen Nutzer Inhalte dieses Onlineangebotes innerhalb von Twitter teilen können.
Sofern die Nutzer Mitglieder der Plattform Twitter sind, kann Twitter den Aufruf der o.g. Inhalte und Funktionen den dortigen Profilen der Nutzer zuordnen. Twitter ist unter dem Privacy-Shield-Abkommen zertifiziert und bietet hierdurch eine Garantie, das europäische Datenschutzrecht einzuhalten (https://www.privacyshield.gov/participant?id=a2zt0000000TORzAAO&status=Active). Datenschutzerklärung: https://twitter.com/de/privacy, Opt-Out: https://twitter.com/personalization.

Xing

Innerhalb unseres Onlineangebotes können Funktionen und Inhalte des Dienstes Xing, angeboten durch die XING AG, Dammtorstraße 29-32, 20354 Hamburg, Deutschland, eingebunden werden. Hierzu können z.B. Inhalte wie Bilder, Videos oder Texte und Schaltflächen gehören, mit denen Nutzer Inhalte dieses Onlineangebotes innerhalb von Xing teilen können. Sofern die Nutzer Mitglieder der Plattform Xing sind, kann Xing den Aufruf der o.g. Inhalte und Funktionen den dortigen Profilen der Nutzer zuordnen. Datenschutzerklärung von Xing: https://www.xing.com/app/share?op=data_protection..

LinkedIn

Innerhalb unseres Onlineangebotes können Funktionen und Inhalte des Dienstes LinkedIn, angeboten durch die inkedIn Ireland Unlimited Company Wilton Place, Dublin 2, Irland, eingebunden werden. Hierzu können z.B. Inhalte wie Bilder, Videos oder Texte und Schaltflächen gehören, mit denen Nutzer Inhalte dieses Onlineangebotes innerhalb von LinkedIn teilen können. Sofern die Nutzer Mitglieder der Plattform LinkedIn sind, kann LinkedIn den Aufruf der o.g. Inhalte und Funktionen den dortigen Profilen der Nutzer zuordnen. Datenschutzerklärung von LinkedIn: https://www.linkedin.com/legal/privacy-policy.. LinkedIn ist unter dem Privacy-Shield-Abkommen zertifiziert und bietet hierdurch eine Garantie, das europäische Datenschutzrecht einzuhalten (https://www.privacyshield.gov/participant?id=a2zt0000000L0UZAA0&status=Active). Datenschutzerklärung: https://www.linkedin.com/legal/privacy-policy, Opt-Out: https://www.linkedin.com/psettings/guest-controls/retargeting-opt-out.

Erstellt mit Datenschutz-Generator.de von RA Dr. Thomas Schwenke