<a id="tibco-source-connector"></a>

# TIBCO Source Connector for Confluent Platform

The Kafka Connect TIBCO Source connector is used to move messages from [TIBCO
Enterprise Messaging Service (EMS)](https://www.tibco.com/products/tibco-enterprise-message-service) to Apache Kafka®.

Messages are consumed from the TIBCO EMS broker using the configured
[message selectors](configuration.md#tibco-source-message-selector-config) and written to a
single Kafka topic. A [Single Message
Transformation](/platform/current/connect/transforms/index.html) can be used to route messages to
multiple Kafka topics.

The connector currently supports consuming JMS [TextMessage](http://docs.oracle.com/javaee/6/api/javax/jms/TextMessage.html) and
[BytesMessage](http://docs.oracle.com/javaee/6/api/javax/jms/BytesMessage.html) but not
[ObjectMessage](http://docs.oracle.com/javaee/6/api/javax/jms/ObjectMessage.html) or
[StreamMessage](http://docs.oracle.com/javaee/6/api/javax/jms/StreamMessage.html).

#### NOTE
- If you are required to use the Java Naming and Directory Interface™ (JNDI) to
  connect to TIBCO EMS, there is a general [JMS Source connector for Confluent
  Platform](https://docs.confluent.io/kafka-connect-jms-source/current/)
  available that uses a JNDI-based mechanism to connect to the JMS broker.
- <!-- WARNING: THIS IS A SHARED FILE AND THE SOURCE IS LOCATED IN DOCS-COMMON. DO NOT ADD TO ANY OTHER REPO. -->

  Effective July 6, 2025, only self-managed connector versions that meet or exceed the minimum version listed on the
  [Supported Connector Versions](https://docs.confluent.io/platform/7.8/connect/supported-connector-version.html#supported-connector-versions-till-cp-7-8)
  page receive support from Confluent. Older, unsupported connector versions have been removed from Confluent Marketplace and
  are no longer available for download.

## Features

- [Multiple tasks](#tibco-source-multiple-tasks)
- [At least once delivery](#tibco-source-at-least-once-delivery)
- [Schemas](#tibco-source-connector-schemas)
- [Client-side encryption](#tibco-source-csfle-sm)

<a id="tibco-source-at-least-once-delivery"></a>

### At least once delivery

This connector guarantees that records are delivered to the Kafka topic at least
once. If the connector restarts, there may be some duplicate records in the Kafka
topic.

<a id="tibco-source-multiple-tasks"></a>

### Multiple tasks

The TIBCO Source connector supports running one or more tasks.
You can specify the number of tasks in the `tasks.max` configuration
parameter. This can lead to performance gains when multiple files need to
be parsed.

<a id="tibco-source-connector-schemas"></a>

### Schemas

The TIBCO Source connector produces messages with keys and values that adhere to
the schemas described in the following sections.

<a id="tibco-source-connector-schema-key"></a>

#### io.confluent.connect.jms.Key

This schema is used to store the incoming MessageID on the message interface.
This will ensure that when the same message ID arrives it will end up in
the same partition. In practice this should never occur. The schema defines the
following fields:

| Name      | Schema   | Required   | Default Value   | Documentation                                                                                                                                 |
|-----------|----------|------------|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
| messageID | STRING   | yes        |                 | This field stores the value of<br/>[Message.getJMSMessageID()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSMessageID()). |

<a id="tibco-source-connector-schema-value"></a>

#### io.confluent.connect.jms.Value

This schema is used to store the value of the JMS message. The schema defines
the following fields:

| Name          | Schemna                                                                       | Required   | Default Value   | Documentation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
|---------------|-------------------------------------------------------------------------------|------------|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| messageID     | STRING                                                                        | yes        |                 | This field stores the value of<br/>[Message.getJMSMessageID()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSMessageID()).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| messageType   | STRING                                                                        | yes        |                 | This field stores the type of message that was received. This corresponds<br/>to the sub-interfaces of [Message](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html).<br/>[BytesMessage](http://docs.oracle.com/javaee/6/api/javax/jms/BytesMessage.html) =<br/>`bytes`, [MapMessage](http://docs.oracle.com/javaee/6/api/javax/jms/MapMessage.html) = `map`,<br/>[ObjectMessage](http://docs.oracle.com/javaee/6/api/javax/jms/ObjectMessage.html) =<br/>`object`, [StreamMessage](http://docs.oracle.com/javaee/6/api/javax/jms/StreamMessage.html) =<br/>`stream` and [TextMessage](http://docs.oracle.com/javaee/6/api/javax/jms/TextMessage.html) =<br/>`text`. The corresponding field will be populated with the values from the<br/>respective message sub-interface. |
| timestamp     | INT64                                                                         | yes        |                 | Data from the [getJMSTimestamp()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSTimestamp())<br/>method.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| deliveryMode  | INT32                                                                         | yes        |                 | This field stores the value of [Message.getJMSDeliveryMode()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSDeliveryMode()).<br/>method.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| correlationID | STRING                                                                        | no         |                 | This field stores the value of [Message.getJMSCorrelationID()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSCorrelationID()).<br/>method.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| replyTo       | [Destination](#solace-source-connector-schema-destination)                    | no         |                 | This schema is used to represent a JMS Destination, and is either [queue](http://docs.oracle.com/javaee/6/api/javax/jms/Queue.html) or [topic](http://docs.oracle.com/javaee/6/api/javax/jms/Topic.html).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| destination   | [Destination](#solace-source-connector-schema-destination)                    | no         |                 | This schema is used to represent a JMS Destination, and is either [queue](http://docs.oracle.com/javaee/6/api/javax/jms/Queue.html) or [topic](http://docs.oracle.com/javaee/6/api/javax/jms/Topic.html).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| redelivered   | BOOLEAN                                                                       | yes        |                 | This field stores the value of [Message.getJMSRedelivered()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSRedelivered()).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| type          | STRING                                                                        | no         |                 | This field stores the value of [Message.getJMSType()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSType()).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| expiration    | INT64                                                                         | no         |                 | This field stores the value of [Message.getJMSExpiration()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSExpiration()).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| priority      | INT32                                                                         | no         |                 | This field stores the value of [Message.getJMSPriority()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getJMSPriority()).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| properties    | Map of STRING, [PropertyValue](#solace-source-connector-schema-propertyvalue) | yes        |                 | This field stores the data from all of the properties for the Message indexed by their propertyName.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| bytes         | BYTES                                                                         | no         |                 | This field stores the value from<br/>[BytesMessage.html.readBytes(byte[])](http://docs.oracle.com/javaee/6/api/javax/jms/BytesMessage.html#readBytes(byte[])).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| map           | Map of STRING, [PropertyValue](#solace-source-connector-schema-propertyvalue) | no         |                 | This field stores the data from all of the map entries returned from<br/>[MapMessage.getMapNames()](http://docs.oracle.com/javaee/6/api/javax/jms/MapMessage.html#getMapNames())<br/>for the Message indexed by their key.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| text          | STRING                                                                        | no         |                 | This field stores the value from [TextMessage.html.getText()](http://docs.oracle.com/javaee/6/api/javax/jms/TextMessage.html#getText()).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |

<a id="solace-source-connector-schema-destination"></a>

#### io.confluent.connect.jms.Destination

This schema is used to represent a JMS Destination, and is either [queue](http://docs.oracle.com/javaee/6/api/javax/jms/Queue.html) or [topic](http://docs.oracle.com/javaee/6/api/javax/jms/Topic.html).

The schema defines the following fields:

| Name            | Schema   | Required   | Default Value   | Documentation                                                                                                                                                                                                                                                             |
|-----------------|----------|------------|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| destinationType | STRING   | yes        |                 | The type of JMS Destination, and either `queue` or `topic`.                                                                                                                                                                                                               |
| name            | STRING   | yes        |                 | The name of the destination. This will be the value of<br/>[Queue.getQueueName()](http://docs.oracle.com/javaee/6/api/javax/jms/Queue.html#getQueueName())<br/>or [Topic.getTopicName()](https://docs.oracle.com/javaee/6/api/javax/jms/Topic.html#Topic.getTopicName()). |

<a id="solace-source-connector-schema-propertyvalue"></a>

#### io.confluent.connect.jms.PropertyValue

This schema is used to store the data that is found in the properties of the
message. To ensure that the proper type mappings are preserved field
`propertyType` stores the value type for the field. The corresponding field in
the schema will contain the data for the property. This ensures that the data is
retrievable as the type returned by [Message.getObjectProperty()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#getObjectProperty(java.lang.String)).
The schema defines the following fields:

| Name         | Schema   | Required   | Default Value   | Documentation                                                                                                                           |
|--------------|----------|------------|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------|
| propertyType | STRING   | yes        |                 | The Java type of the property on the Message. One of `boolean`, `byte`,<br/>`short`, `integer`, `long`, `float`, `double`, or `string`. |
| boolean      | BOOLEAN  | no         |                 | The value stored as a boolean. Null unless `propertyType` is set to `boolean`.                                                          |
| byte         | INT8     | no         |                 | The value stored as a byte. Null unless `propertyType` is set to `byte`.                                                                |
| short        | INT16    | no         |                 | The value stored as a short. Null unless `propertyType` is set to `short`.                                                              |
| integer      | INT32    | no         |                 | The value stored as a integer. Null unless `propertyType` is set to `integer`.                                                          |
| long         | INT64    | no         |                 | The value stored as a long. Null unless `propertyType` is set to `long`.                                                                |
| float        | FLOAT32  | no         |                 | The value stored as a float. Null unless `propertyType` is set to `float`.                                                              |
| double       | FLOAT64  | no         |                 | The value stored as a double. Null unless `propertyType` is set to `double`.                                                            |
| string       | STRING   | no         |                 | The value stored as a string. Null unless `propertyType` is set to `string`.                                                            |

<a id="tibco-source-csfle-sm"></a>

### Client-side encryption

This connector supports Client-Side Field Level Encryption (CSFLE) and Client-Side Payload Encryption (CSPE). For more information, see [Manage Client-Side Encryption](https://docs.confluent.io/platform/current/connect/manage-csfle.html).

<a id="tibco-source-connector-license"></a>

## License

You can use this connector for a 30-day trial period without a license key.

After 30 days, you must purchase a connector subscription which includes [Confluent enterprise license](/platform/current/installation/license.html#enterprise-subscription-license) keys to subscribers, along with [enterprise-level support](https://www.confluent.io/subscription/) for Confluent Platform and your connectors. If you are a subscriber, you can contact [Confluent Support](https://support.confluent.io/) for more information.

For license properties, see [Confluent Platform license](configuration.md#tibco-source-connector-license-config). For
information about the license topic, refer to
[License topic configuration](configuration.md#tibco-source-license-topic-configuration).

## Configuration

This section describes how the connector internally configures the acknowledgement mode. For a complete list of
configuration properties for this connector, see [Configuration Reference for TIBCO Source Connector for Confluent Platform](configuration.md#tibco-source-connector-config).

For an example of how to get Kafka Connect connected to [Confluent Cloud](/cloud/current/index.html), see
[Connect Self-Managed Kafka Connect to Confluent Cloud](/cloud/current/cp-component/connect-cloud-config.html#distributed-cluster).

<a id="tibco-source-ack-mode"></a>

### Acknowledgement mode

The connector internally uses `CLIENT_ACKNOWLEDGE` mode to receive and
acknowledge messages from the JMS broker. In this mode, acknowledging any
message will acknowledge every message received (see section 6.2.10 in the [JMS
2.0 Specification](https://download.oracle.com/otndocs/jcp/jms-2_0-fr-eval-spec/)). To prevent
messages from being prematurely acknowledged, the connector processes only one
message at time. In other words, the connector will not try to receive new
messages until the last message is committed to a Kafka topic. This might
compromise the throughput of the connector, but messages will be transferred to
Kafka successfully.

<a id="tibco-source-connector-install"></a>

## Install the TIBCO Source connector

You can install this connector by using the [confluent connect
plugin
install](https://docs.confluent.io/confluent-cli/current/command-reference/connect/plugin/confluent_connect_plugin_install.html)
command, or by manually downloading the ZIP file.

### Prerequisites

- You must install the connector on every machine where Connect will run.
- Kafka Broker: Confluent Platform 3.3.0 or later, or Kafka 0.11.0 or later.
- Connect: Confluent Platform 4.1.0 or later, or Kafka 1.1.0 or later (requires header support in Connect).
- TIBCO EMS with JMS 1.1 support.
- `tibjms` Client Library. For more details, see [Installing the TIBCO JMS client library](#installing-tibco-client-lib).
- Java 1.8.
- The latest (`latest`) connector version.

### Install the connector using Confluent CLI

To install the `latest` connector version, navigate to your Confluent Platform installation
directory and run the following command:

```bash
confluent connect plugin install confluentinc/kafka-connect-tibco-source:latest
```

You can install a specific version by replacing `latest` with a version number
as shown in the following example:

```bash
confluent connect plugin install confluentinc/kafka-connect-tibco-source:1.0.0-preview
```

<a id="tibco-client-lib"></a>

### TIBCO Client library

The Kafka Connect TIBCO Source connector does not include the TIBCO JMS
client library.

If you are running a multi-node Connect cluster, the connector and TIBCO JMS
client JAR must be installed on every Connect worker in the cluster. The
following section for details.

<a id="installing-tibco-client-lib"></a>

#### Installing the TIBCO JMS client library

This connector relies on a provided `tibjms` client JAR that is included in
the TIBCO EMS installation. The connector will fail to create a connection to
TIBCO EMS if you have not installed the JAR on each Connect worker node.

The installation steps are:

1. Download and Install TIBCO Enterprise Message Service™ ([Mac](https://www.tibco.com/downloads/10930)
   or [Linux](https://www.tibco.com/downloads/10932)).
   If you have already installed TIBCO EMS, skip to the next step.
2. Unzip the download and copy only the `tibco/ems/{version}/lib/tibjms.jar`
   file into the `share/java/kafka-connect-tibco-source` directory of your
   Confluent Platform installation on each worker node. If you are using a different installation,
   find the location of the Confluent TIBCO Source connector JAR files and place the
   `tibjms` JAR file into the same directory.
3. Restart all of the Connect worker nodes.

### Install the connector manually

[Download and extract the ZIP file](https://www.confluent.io/hub/confluentinc/kafka-connect-tibco-source) for
your connector and then follow the manual connector installation
[instructions](/kafka-connectors/self-managed/install.html).

<a id="tibco-source-connector-quickstart"></a>

## Quick start

This quick start uses the TIBCO Source connector to consume records from TIBCO
Enterprise Message Service™ and sends them to Kafka.

1. Download TIBCO Enterprise Message Service™ ([Mac](https://www.tibco.com/downloads/10930)
   or [Linux](https://www.tibco.com/downloads/10932))
   and run the appropriate installer. For more details, see the [TIBCO
   Enterprise Message Service™ Installation Guide](https://docs.tibco.com/pub/ems-zlinux/8.5.0/doc/pdf/TIB_ems_8.5_installation.pdf).
   Similar documentation is available for each version of TIBCO EMS.
2. Install the connector through the [Confluent Hub Client](https://docs.confluent.io/current/connect/managing/confluent-hub/client.html).
   ```bash
   # run from your Confluent Platform installation directory
   confluent connect plugin install confluentinc/kafka-connect-tibco-source:latest
   ```
3. [Install the TIBCO JMS Client Library](#installing-tibco-client-lib).
4. Start Confluent Platform.
   ```bash
   confluent local start
   ```
5. Create a `connector-quickstart` queue with the TIBCO Admin Tool.
   ```bash
   # connect to TIBCO with the Admin Tool (PASSWORD IS EMPTY)
   tibco/ems/8.4/bin/tibemsadmin -server "tcp://localhost:7222" -user admin

   > create queue connector-quickstart
   ```
6. Compile the TIBCO Java samples so that they can be run in the following
   step.
   ```bash
   # setup Java's classpath so that the Java compiler can find the imports of the samples
   cd tibco/ems/8.4/samples/java
   export TIBEMS_JAVA=tibco/ems/8.4/lib
   CLASSPATH=${TIBEMS_JAVA}/jms-2.0.jar:${CLASSPATH}
   CLASSPATH=.:${TIBEMS_JAVA}/tibjms.jar:${TIBEMS_JAVA}/tibjmsadmin.jar:${CLASSPATH}
   export CLASSPATH

   # compile the java classes (run from the tibco/ems/8.4/samples/java directory)
   javac *.java
   ```
7. Produce a set of messages to the `connector-quickstart` queue.
   ```bash
   cd tibco/ems/8.4/samples/java

   # produce 5 test messages
   java tibjmsMsgProducer -user admin -queue connector-quickstart m1 m2 m3 m4 m5

   ------------------------------------------------------------------------
   tibjmsMsgProducer SAMPLE
   ------------------------------------------------------------------------
   Server....................... localhost
   User......................... admin
   Destination.................. connector-quickstart
   Send Asynchronously.......... false
   Message Text.................
   m1
   m2
   m3
   m4
   m5
   ------------------------------------------------------------------------

   Publishing to destination 'connector-quickstart'

   Published message: m1
   Published message: m2
   Published message: m3
   Published message: m4
   Published message: m5
   ```
8. Create a `tibco-source.json` file with the following contents:
   ```json
   {
     "name": "TibcoSourceConnector",
     "config": {
       "connector.class": "io.confluent.connect.tibco.TibcoSourceConnector",
       "tasks.max": "1",
       "kafka.topic": "from-tibco-messages",
       "tibco.url": "tcp://localhost:7222",
       "tibco.username": "admin",
       "tibco.password": "",
       "jms.destination.type": "queue",
       "jms.destination.name": "connector-quickstart",
       "key.converter": "org.apache.kafka.connect.storage.StringConverter",
       "value.converter": "org.apache.kafka.connect.storage.StringConverter",
       "confluent.topic.bootstrap.servers": "localhost:9092",
       "confluent.topic.replication.factor": "1"
     }
   }
   ```
9. Load the TIBCO Source connector.
   ```bash
   confluent local load tibco --config tibco-source.json
   ```
10. Confirm that the connector is in a `RUNNING` state.
    ```bash
    confluent local status TibcoSourceConnector
    ```
11. Confirm the messages were delivered to the `from-tibco-messages` topic in Kafka.
    ```bash
    confluent local consume from-tibco-messages --from-beginning
    ```
