# Configure routing to a Pulsar destination

## Routing

The routing section controls how Aerospike records are routed to a Pulsar destination. The following routing modes are available.

-   **static:** Always route to a static topic.
-   **skip** Skip dispatch of record to Pulsar and ack success to XDR.
-   **namespace:** Use the namespace of the Aerospike record as the Pulsar topic.
-   **set:** Use the set of the Aerospike record as the Pulsar topic.
-   **bin:** Sets the route based on the value of a bin in the record. Only string, blob and integer bin types are supported.
-   **custom** Route with custom code.

::: note
You have to specify the persistence nature of the pulsar topic in the configuration along with the topic name. For example, if you want to use a non-persistent topic `my-topic`, then you have to configure `non-persistent://public/default/my-topic` in the configuration. If you just specify `my-topic`, it will create/use `persistent://public/default/my-topic`. Namespace and tenant can also be specified in this topic URL
:::

### Static routing

For static routing the configuration options are:

| Option | Required | Expected value | Description |
| --- | --- | --- | --- |
| mode | yes | static | Selects static routing configuration. |
| destination | yes |  | Name of the destination Pulsar topic. |

#### Example

```yaml
routing:

  mode: static

  destination: pulsar-topic
```

### Skip routing

For skip routing the configuration options are

| Option | Required | Expected value | Description |
| --- | --- | --- | --- |
| `mode` | yes | `skip` | Skip dispatch of record to Pulsar and ack success to XDR. |

#### Example

```yaml
routing:

  mode: skip
```

### Set name routing

For record set name routing the configuration options are:

| Option | Required | Expected value | Description |
| --- | --- | --- | --- |
| mode | yes | set | Selects set name routing configuration. |
| default | no |  | Default destination topic to use in case the set name is missing in the record or the destination topic is not found. |
| transforms | no |  | List of transformations to apply to the set name. See [transforms](#transforms) section for details. |

#### Example

```yaml
routing:

  mode: set

  transforms:

    - trim

    - regex:

        pattern: '(.*):(.*)'

        replacement: '$2:$1'

    - regex:

        pattern: '$'

        replacement: ':please'

    - uppercase
```

### Namespace name routing

For record namespace name routing the configuration options are:

| Option | Required | Expected value | Description |
| --- | --- | --- | --- |
| mode | yes | namespace | Selects namespace name routing configuration. |
| default | no |  | Default destination topic to use in case the namespace name is missing in the record or the destination topic is not found. |
| transforms | no |  | List of transformations to apply to the namespace name. See [transforms](#transforms) section for details. |

#### Example

```yaml
routing:

  mode: namespace

  default: default-topic

  transforms:

    - trim

    - regex:

        pattern: '(.*):(.*)'

        replacement: '$2:$1'

    - regex:

        pattern: '$'

        replacement: ':please'

    - uppercase
```

### Bin value routing

For bin based routing the configuration options are:

| Option | Required | Expected value | Description |
| --- | --- | --- | --- |
| mode | yes | bin | Selects bin based routing. |
| bin | yes |  | Name of the bin to pick value from. |
| default | yes |  | Default destination topic to use in case the bin is missing in the record or the destination topic is not found. |
| transforms | no |  | List of transformations to apply to the bin value. See [transforms](#transforms) section for details. |

#### Example

```yaml
routing:

  mode: bin

  bin: category

  default: test-topic

  transforms:

    - trim

    - regex:

        pattern: '[^A-Za-z0-9]'

        replacement: '-'

    - lowercase
```

### Custom Routing

Records can also be routed with custom code. See [Routing Transform](https://aerospike.com/docs/connectors/streaming/common/outbound-message-transformer).

#### Example

```yaml
routing:

  mode: custom

  class: com.aerospike.connect.outbound.example.GenerationRouter
```

### Transforms

You can configure a list of transforms that will be applied, in order, to the record’s set name, namespace path or bin value in order to derive the destination topic.

Currently, the following transforms are supported:

-   lowercase - converts the bin value to lowercase.
-   uppercase - converts the bin value to uppercase.
-   trim - trim leading and trailing whitespace.
-   regex - match against a regex pattern and replace all occurrences with a replacement. The regex and replacement uses Java regex syntax.

#### Example

The following transform configuration will first trim the route, replace all non-alphanumeric characters with ’-’ and convert the result to lowercase.

```yaml
routing:

  mode: bin

  bin: category

  default: test-topic

  transforms:

    - trim

    - regex:

        pattern: '[^A-Za-z0-9]'

        replacement: '-'

    - lowercase
```