100% Pure Java

  • You can exploit the complete range of Java features.
  • You can use your favorite development environment.
  • You can use Java tools for defining and editing workflows, for workflow definitions, for debugging and profiling, for test coverage analysis as well as for your teamwork support.
  • You do not need to spend precious time on familiarising yourself with additional languages, notations, tools and runtimes, as you would if you wanted to use BPEL or BPMN, for example.
    Graphical notations only work at a very abstract level. If you try to orchestrate complex business workflows with graphical notations such as BPEL, you'll soon end up with ridiculous big graphs which no one can understand anymore (real life example!).
  • Your application server runs on Java, your entire backend stack probably runs on Java, so why don't you use the language you know best for workflow description?!?
  • Plus, once you got COPPER up and running you can supervise COPPER online with its vast JMX management and monitoring capabilities.
Workflow example
public class PingWorkflow
        extends PersistentWorkflow<PingData>
{
    private PingAdapter pingAdapter;

    // The adapter is injected by the engine
    // due to the AutoWire annotation
    @AutoWire
    public void setPingAdapter(PingAdapter pingAdapter) {
        this.pingAdapter = pingAdapter;
    }

    @Override
    public void main() throws Interrupt {
        System.out.println("started");
        // Asynchronous call of the ping service
        String correlationId =
               pingAdapter.ping(getData().pingMessage);
        // Wait up to 60 seconds for the response
        wait(WaitMode.ALL, 60000, correlationId);
        // get the response from the engine
        // using the correlationId
        Response<String> response =
                 getAndRemoveResponse(correlationId);
        System.out.println("finished,
            response="+response.getResponse());
    }
}

Unlimited Number of Parallel Workflow Threads

  • COPPER provides the perfect support for an asynchronous processing of workflows by means of a Java notation.
  • If you want to process service calls to external systems or to a database asynchronously, COPPER offers a sequential notation, which allows for asynchronous waiting without binding or blocking the current thread.See example on the right.
  • While a workflow starts waiting, COPPER releases the current thread which then begins executing other workflow instances. As soon as the asynchronous response is received for the initial workflow, processing of this workflow instance continues using the next free thread. Thus, the number of workflow instances with asynchronous communication that can run in parallel is higher than the number of available operating system threads. It is possible for COPPER to process hundreds of thousands of workflow processes in parallel without facing thread count limitations.
  • No queue overflows! — as long as the data fits into the underlying database you can queue up as many processes as you want.
  • COPPER supports early responses, too. Early responses are those kind of responses which arrive before wait is called.
Example
String correlationId = pingAdapter.ping(getData().pingMessage);
// Wait up to 60 seconds for the response
wait(WaitMode.ALL, 60000, correlationId);
// get the response from the engine
// using the correlationId
...

Light-weight Solution

  • The COPPER core engine consists of less than 400 classes. Its JAR file size is less than 1 MB.
  • The COPPER core engine has only a few mandatory dependencies, for example ASM, slf4j and some Apache Commons libraries.
  • COPPER requires only a handful of database tables for processing of persistent workflows.
  • COPPER runs out-of-the-box with the following RDBMS: Oracle, MySQL, PostgreSQL, Apache DerbyDB.
    Support for any other database is easy to accomplish.
  • COPPER runs out-of-the-box with the following NoSQL database: Apache Cassandra
  • You can use COPPER in any container, eg. Spring, Guice, Tomcat, JBoss, Websphere etc.
  • Logging in COPPER uses slf4j, which enables seamless logging integration into your container/environment.