All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mp.reactivemessaging.aq.adoc Maven / Gradle / Ivy

There is a newer version: 4.1.1
Show newest version
///////////////////////////////////////////////////////////////////////////////

    Copyright (c) 2020, 2024 Oracle and/or its affiliates.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

///////////////////////////////////////////////////////////////////////////////

= Oracle AQ Connector
:description: Reactive Messaging support for Oracle AQ in Helidon MP
:keywords: helidon, mp, messaging, jms, aq
:feature-name: AQ Connector
:microprofile-bundle: false
:rootdir: {docdir}/../..

include::{rootdir}/includes/mp.adoc[]

== Contents

- <>
- <>
- <>
- <>

== Overview

Connecting streams to Oracle AQ with Reactive Messaging couldn't be easier.
This connector extends Helidon's JMS connector with Oracle's AQ-specific API.

include::{rootdir}/includes/dependencies.adoc[]

[source,xml]
----

    io.helidon.messaging.aq
    helidon-messaging-aq

----

== Configuration

Connector name: `helidon-aq`

.Attributes
|===
|`datasource` | name of the datasource bean used to connect Oracle DB with AQ
|`url` | jdbc connection string used to connect Oracle DB with AQ (forbidden when `datasource` is specified)
|`username` | User name used to connect Oracle DB with AQ (forbidden when `datasource` is specified)
|`password` | Password to connect Oracle DB with AQ (forbidden when `datasource` is specified)
|`type` | Possible values are: `queue`, `topic`
|`destination` | Queue or topic name
|`acknowledge-mode` |Possible values are: `AUTO_ACKNOWLEDGE`- session automatically acknowledges a client’s receipt of a message,
`CLIENT_ACKNOWLEDGE` - receipt of a message is acknowledged only when `Message.ack()` is called manually,
`DUPS_OK_ACKNOWLEDGE` - session lazily acknowledges the delivery of messages. Default value: `AUTO_ACKNOWLEDGE`
|`transacted` | Indicates whether the session will use a local transaction. Default value: `false`
|`message-selector` | JMS API message selector expression based on a subset of the SQL92.
Expression can only access headers and properties, not the payload.
|`client-id` | Client identifier for JMS connection.
|`durable` | True for creating durable consumer (only for topic). Default value: `false`
|`subscriber-name` | Subscriber name for durable consumer used to identify subscription.
|`non-local` | If true then any messages published to the topic using this session's connection,
or any other connection with the same client identifier,
will not be added to the durable subscription. Default value: `false`
|`named-factory` | Select in case factory is injected as a named bean or configured with name.
|`poll-timeout` | Timeout for polling for next message in every poll cycle in millis. Default value: `50`
|`period-executions` | Period for executing poll cycles in millis. Default value: `100`
|`session-group-id` | When multiple channels share same `session-group-id`,
they share same JMS session and same JDBC connection as well.
|===

=== Configured JMS Factory

The simplest possible usage is leaving construction of `AQjmsConnectionFactory` to the connector.

[source,yaml]
.Example of connector config:
----
mp:
  messaging:

    connector:
      helidon-aq:
        transacted: false
        acknowledge-mode: CLIENT_ACKNOWLEDGE
        url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.0.123)(Port=1521))(CONNECT_DATA=(SID=TESTSID)))
        user: gandalf
        password: mellon

    outgoing.to-aq:
      connector: helidon-aq
      destination: TESTQUEUE
      type: queue

    incoming.from-aq:
      connector: helidon-aq
      destination: TESTQUEUE
      type: queue
----

Its also possible and preferable to refer to xref:../persistence.adoc[configured datasource],
in our example xref:../persistence.adoc[Oracle UCP datasource]:

[source,yaml]
.Example of connector config with Oracle UCP datasource:
----
javax:
  sql:
    DataSource:
      aq-test-ds:
        connectionFactoryClassName: oracle.jdbc.pool.OracleDataSource
        URL: jdbc:oracle:thin:@exampledb_high?TNS_ADMIN=/home/gandalf/wallets/Wallet_EXAMPLEDB
        user: gandalf
        password: SuperSecretPassword1234

mp:
  messaging:
    connector:
      helidon-aq:
        transacted: false
        acknowledge-mode: CLIENT_ACKNOWLEDGE
        data-source: aq-test-ds
    outgoing.toJms:
      connector: helidon-aq
      destination: TESTQUEUE
      type: queue
    incoming.fromJms:
      connector: helidon-aq
      destination: TESTQUEUE
      type: queue
----

=== Injected JMS factory

If you need more advanced configurations, connector can work with injected `AQjmsConnectionFactory`:

[source,java]
.Inject:
----
include::{sourcedir}/mp/reactivemessaging/AqSnippets.java[tag=snippet_1, indent=0]
----

[source,yaml]
.Config:
----
jdbc:
  url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.0.123)(Port=1521))(CONNECT_DATA=(SID=TESTSID)))
  user: gandalf
  pass: mellon

mp:
  messaging:
    connector:
      helidon-aq:
        named-factory: aq-orderdb-factory

    outgoing.to-aq:
      connector: helidon-aq
      session-group-id: order-connection-1
      destination: TESTQUEUE
      type: queue

    incoming.from-aq:
      connector: helidon-aq
      session-group-id: order-connection-1
      destination: TESTQUEUE
      type: queue
----

== Usage

=== Consuming

[source,java]
.Consuming one by one unwrapped value:
----
include::{sourcedir}/mp/reactivemessaging/AqSnippets.java[tag=snippet_2, indent=0]
----

[source,java]
.Consuming one by one, manual ack:
----
include::{sourcedir}/mp/reactivemessaging/AqSnippets.java[tag=snippet_3, indent=0]
----

=== Producing

[source,java]
.Producing to AQ:
----
include::{sourcedir}/mp/reactivemessaging/AqSnippets.java[tag=snippet_4, indent=0]
----




© 2015 - 2024 Weber Informatics LLC | Privacy Policy