[[kameletbindings-error-handler]]
= Kamelet Bindings Error Handler

Kamelet Binding`s offer a mechanism to specify an error policy to adopt in case an event produced by a `source` or consumed by a `sink`. Through the definition of an `errorHandler` you will be able to apply certain logic to the failing event, such as simply logging, ignoring the event or posting the event to a `Dead Letter Channel`.

[source,yaml]
----
apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
  name: my-kamelet-binding
spec:
  source: # <1>
...
  sink: # <2>
...
  errorHandler: # <3>
----
<1> Reference to the source that provides data
<2> Reference to the sink where data should be sent to
<3> Error Handler Configuration

[[kameletbindings-error-handler-types]]
== Error Handler Types

We have different types of error handler: `ǹone`, `log`, `dead-letter-channel`, `bean`, `ref`. The `errorHandler` parameter is optional.

[[kameletbindings-error-handler-none]]
=== No error handler

There may be certain cases where you want to just ignore any failure happening on your integration. In this situation just use a `ǹone` error handler.

[source,yaml]
----
apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
  name: my-kamelet-binding
spec:
  source:
...
  sink: 
...
  errorHandler: 
    none: # <1>
----
<1> `none` error handler does not expect any configuration

[[kameletbindings-error-handler-log]]
=== Log error handler

Apache Camel offers a default behavior for handling any failure: log to standard output. However you can use the `log` error handler to specify other behaviors such as redelivery or delay policy.

[source,yaml]
----
apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
  name: my-kamelet-binding
spec:
  source:
...
  sink: 
...
  errorHandler: 
    log:
      parameters: # <1>
        maximumRedeliveries: 3
        redeliveryDelay: 2000
----
<1> Parameters belonging to the `log` error handler type

[[kameletbindings-error-handler-dlc]]
=== Dead Letter Channel error handler

The `Dead Letter Channel` is probably the most interesting error handler type as it allows you to redirect any failing event to any other component, such as a third party URI, a queue or even another `Kamelet` which will be performing certain logic with the failing event.

[source,yaml]
----
apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
  name: my-kamelet-binding
spec:
  source:
...
  sink: 
...
  errorHandler: 
    dead-letter-channel:
      endpoint: 
        ref: # <1>
          kind: Kamelet
          apiVersion: camel.apache.org/v1alpha1
          name: error-handler
        properties:
          message: "ERROR!" # <2>
          ...
      parameters:
        maximumRedeliveries: 1 # <3>
        ... 
----
<1> You can use `ref` or `uri`. `ref` will be interpreted by the operator according the `kind`, `apiVersion` and `name`. You can use any `Kamelet`, `KafkaTopic` channel or `Knative` destination.
<2> Properties belonging to the endpoint (in this example, to the `Kamelet` named error handler)
<3> Parameters belonging to the `dead-letter-channel` error handler type

[[kameletbindings-error-handler-bean]]
=== Bean error handler

With the `Bean` error handler you can extend the functionality of the Error Handler by providing a custom bean to be used as Error Handler.

[source,yaml]
----
apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
  name: my-kamelet-binding
spec:
  source:
...
  sink: 
...
  errorHandler: 
    bean:
      type: "org.apache.camel.builder.DeadLetterChannelBuilder" # <1>
      properties: # <2>
        deadLetterUri: log:error
        ... 
----
<1> Fully qualified name of the ErrorHandlerBuilder
<2> Properties expected by your type

[[kameletbindings-error-handler-ref]]
=== Ref error handler

With the `Ref` error handler you can use any `Bean` that is expected to be found in the Camel registry at runtime.

[source,yaml]
----
apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
  name: my-kamelet-binding
spec:
  source:
...
  sink: 
...
  errorHandler: 
    ref: my-custom-builder # <1>
... 
----
<1> The name of the bean to be looked up at runtime

NOTE: make sure to have the `ref` correctly bind at runtime.
