Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
///////////////////////////////////////////////////////////////////////////////
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.aqhelidon-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]
----