Bluetooth Headset

I switched to Linux on my main machine about two years ago and use the Ubuntu LTS (currently 20.04) version for my everyday work. In time of pandemic, the remote communication became vital, so I wanted to use my BT headset (Teufel Airy, Apple Airpods) for conferencing.

Apparently, the current version of PulseAudio has an open issue with using the headset not only in A2DP profile (that is headphone mode, mic disabled) but in the HSP/HFP profile (lower quality of the headphones, but enabled microphone).

You have to ask the correct question on Google to find a hint, how to…


Cascate del Varone, © Simon Zambrovski

If you are a passionate open-source developer, you are probably not only contributing to existing free and open source software (FOSS) projects started by others, but already started your own. If not — the time will come and you will start one.

A bunch of activities arises around such a project, from pure project management and release planning to management of source code and publishing the deliverable artifact. In the last decade, the process of delivering the artifacts from the source code is usually performed automatically through the continuous delivery (CD) pipeline. A delivery pipeline is a set of tools…


Falls in Yosemite, © Simon Zambrovski

While designing Microservices architectures communicating with messages I discovered an interesting paradigm mismatch. If remains unaddressed, it leads to strange design glitches, so I decided to share my thoughts on it.

TL;DR

The two paradigms can be used combined if certain considerations are made beforehand regarding the following topics:

  • synchronization,
  • backpressure,
  • correlation,
  • semantic message aggregation,
  • de-duplication and idempotent processing
  • and finally transactions.

Ignoring those considerations fosters bad design, limitations in scaling, concurrency issues and troubles in operations.

Design considerations

The growing popularity of reactive architecture leads to a raising number of frameworks for implementation of backend systems like RxJava, Project Reactor, Spring Cloud…


Designing process data access API

© PeterFrankfurt

In the first part of the article, I discussed strategies of loading, storing and serializing data as a payload of processes in the Camunda BPM process engine. I believe that the described decisions are important for your process application design. In the same time, they should be supported or even enforced by the API of process data access. This article focuses on the topic of access to process data, API styles and API construction.

Camunda BPM provides several APIs to read, write and delete process instance payload. These are:

  • (Un-typed) Java Object Value API
  • Typed Java API
  • Expression Language
  • REST…

Decisions on process data

© PantheraLeo1359531

Introduction

Control flow and data flow form the essence of business processes expressed in BPMN 2.x. Data is loaded during the execution of service tasks, provided as user input in user tasks and is possibly changed during event correlations. In general, process automation using a process engine relies on data accessible to the process instance to drive the execution. Modern process engines offer an API for access instance-specific data.

But data is not data… I would like to share some thoughts on data modeling, scoping, naming, strategies of loading, serialization and implementation patterns on and around data in Camunda BPM engine…


I strongly believe that orchestration of Microservices will become the next big thing to solve. At the time of writing, several solutions try to compete in this area, mostly building their own (textual) domain-specific languages to describe the orchestration. In my opinion orchestration should be expressed in BPMN 2.x instead, since it is a well-adopted, understandable and mature language designed exactly for this purpose.

The term Orchestration in Microservice context might be ambiguous. To get it clearer, I would like to propose the following classification:

SOA-like orchestration

SOA focuses on remote communication between services, built around business capabilities. Central process engine synchronously…


Use Kotlin data classes for your Camunda BPM payload and use Jackson, when accessing it via External Task Client for Java.

Camunda provides an External Task Client library for building Java applications serving as Camunda External Clients connected via REST API. For using it, you simple need to put the library to the class path. In Apache Maven, the following dependency provides this:

<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-external-task-client</artifactId>
<version>${camunda-external-client.version}</version>
</dependency>

For using Jackson with Kotlin, you probably put the Jackson-Kotlin module on your classpath:

<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>${jackson.version}</version>
</dependency>

By default, the External Task Client will use an empty Jackson Object Mapper…


Automation of business processes is the core domain and one of the purposes of process engines. Camunda BPM being a very popular, lightweight open-source process engine is not an exception. It executes BPMN 2.x directly and provides very high coverage of the BPMN 2.x standard.

In the last few years, Microservices became one of the utmost important trends in modern software industry. I’m not going to talk about pros and contras, chances and pitfalls — I just observe a shift at my customers’ projects towards thinking in separated contexts instead of monoliths. My effort is usually on creation of a…


Camunda SPIN is a framework used by Camunda engine for serialization and de-serialization of payload. It is pre-configured for the usage, but can be extended if needed as described in this example.

In my current project, I had to use Camunda SPIN together with a decent version of SpringBoot and Kotlin and wanted to rely on Jackson JSON serialization.

In order to use Camunda SPIN, the following Maven Modules should be available on the classpath (I use Engine 7.9.0 and SPIN 1.5.1):

<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-plugin-spin</artifactId>
<version>${camunda.version}</version>
</dependency>
<dependency>
<groupId>org.camunda.spin</groupId>
<artifactId>camunda-spin-dataformat-json-jackson</artifactId>
<version>${version.camunda.spin}</version>
</dependency>

For usage of Jackson (including Java8 time and…


As described in my previous post, one of the implementation strategies for Batch Processing is the creation of a custom job in Camunda.

For doing so, a custom job handler needs to be implemented which is based on job handler configuration and has a type. In order to start a job, a message of that type and containing the configuration of the job instance needs to be passed to the internal Camunda API using the command pattern. The following diagram depicts the relationships between the concepts.

Concept map Camunda Job Handler

The configuration of the job instance supplied by the message is serialized to a…

Simon Zambrovski

Senior IT-Consultant, BPM-Craftsman, Architect, Developer, Scrum Master, Writer, Coach

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store