diff --git a/java/rsi-atp-vt/README.md b/java/rsi-atp-vt/README.md
new file mode 100644
index 00000000..532e41f5
--- /dev/null
+++ b/java/rsi-atp-vt/README.md
@@ -0,0 +1,2 @@
+## Java - Oracle Developers on Medium.com
+[High-throughput stream processing with the Java Library for Reactive Streams Ingestion (RSI), Virtual Threads, and the Oracle ATP Database](https://medium.com/oracledevs/high-throughput-stream-processing-with-the-java-library-for-reactive-streams-ingestion-rsi-8aa0fc9d167)
diff --git a/java/rsi-atp-vt/pom.xml b/java/rsi-atp-vt/pom.xml
new file mode 100644
index 00000000..6bae7093
--- /dev/null
+++ b/java/rsi-atp-vt/pom.xml
@@ -0,0 +1,121 @@
+
+
+
+ 4.0.0
+
+ com.oracle.dev.jdbc
+ rsi-atp-vt
+ 1.0-SNAPSHOT
+
+ rsi-atp-vt
+ A simple rsi-atp-vt.
+ https://github.com/juarezjuniorgithub/rsi-atp-vt
+
+
+ UTF-8
+ 19
+ 19
+
+
+
+
+ junit
+ junit
+ 3.8.1
+
+
+
+ com.oracle.database.jdbc
+ rsi
+ 21.6.0.0.1
+
+
+ com.oracle.database.jdbc
+ ojdbc11
+ 21.6.0.0.1
+
+
+ com.oracle.database.jdbc
+ ucp11
+ 21.6.0.0.1
+
+
+ com.oracle.ojdbc
+ ons
+ 19.3.0.0
+
+
+ com.oracle.database.jdbc
+ oraclepki
+ 19.11.0.0
+
+
+ com.oracle.database.security
+ osdt_core
+ 21.6.0.0.1
+
+
+ com.oracle.database.security
+ osdt_cert
+ 21.6.0.0.1
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ --enable-preview
+
+
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+
+
+
+
+
+ maven-project-info-reports-plugin
+
+
+
+
diff --git a/java/rsi-atp-vt/script/rsi.sql b/java/rsi-atp-vt/script/rsi.sql
new file mode 100644
index 00000000..cf94dcf5
--- /dev/null
+++ b/java/rsi-atp-vt/script/rsi.sql
@@ -0,0 +1,9 @@
+CREATE USER RSIATP_USER IDENTIFIED BY "";
+GRANT DWROLE TO RSIATP_USER;
+GRANT UNLIMITED TABLESPACE TO RSIATP_USER;
+
+CREATE TABLE RSIATP_USER.CUSTOMERS (
+ ID NUMBER(20,0),
+ NAME VARCHAR2(20 BYTE),
+ REGION VARCHAR2(20 BYTE)
+);
diff --git a/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/Customer.java b/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/Customer.java
new file mode 100644
index 00000000..c36f58a5
--- /dev/null
+++ b/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/Customer.java
@@ -0,0 +1,48 @@
+/*
+ Copyright (c) 2021, 2022, Oracle and/or its affiliates.
+
+ This software is dual-licensed to you under the Universal Permissive License
+ (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License
+ 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
+ either license.
+
+ 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
+
+ https://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.
+*/
+
+package com.oracle.dev.jdbc;
+
+import oracle.rsi.StreamEntity;
+import oracle.rsi.StreamField;
+
+@StreamEntity(tableName = "customers")
+public class Customer {
+
+ public Customer(long id, String name, String region) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.region = region;
+ }
+
+ @StreamField
+ public long id;
+
+ @StreamField
+ public String name;
+
+ @StreamField(columnName = "region")
+ public String region;
+
+ String someRandomField;
+
+}
\ No newline at end of file
diff --git a/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/DatabaseConfig.java b/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/DatabaseConfig.java
new file mode 100644
index 00000000..ca9a4607
--- /dev/null
+++ b/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/DatabaseConfig.java
@@ -0,0 +1,72 @@
+/*
+ Copyright (c) 2021, 2022, Oracle and/or its affiliates.
+
+ This software is dual-licensed to you under the Universal Permissive License
+ (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License
+ 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
+ either license.
+
+ 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
+
+ https://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.
+*/
+
+package com.oracle.dev.jdbc;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Properties;
+
+/**
+ *
+ * Configuration for connecting code samples to an Oracle Database instance.
+ *
+ */
+public class DatabaseConfig {
+
+ private static final Properties CONFIG = new Properties();
+
+ static {
+ try {
+ var fileStream = Files
+ .newInputStream(Path.of("C:\\java-projects\\rsi-atp-vt\\src\\main\\resources\\config.properties"));
+ CONFIG.load(fileStream);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static final String DB_USER = CONFIG.getProperty("DB_USER");
+
+ private static final String DB_URL = CONFIG.getProperty("DB_URL");
+
+ private static final String DB_PASSWORD = CONFIG.getProperty("DB_PASSWORD");
+
+ private static final String DB_SCHEMA = CONFIG.getProperty("DB_SCHEMA");
+
+ public static String getDbUser() {
+ return DB_USER;
+ }
+
+ public static String getDbUrl() {
+ return DB_URL;
+ }
+
+ public static String getDbPassword() {
+ return DB_PASSWORD;
+ }
+
+ public static String getDbSchema() {
+ return DB_SCHEMA;
+ }
+
+}
diff --git a/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/RSIApp.java b/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/RSIApp.java
new file mode 100644
index 00000000..ce8f3386
--- /dev/null
+++ b/java/rsi-atp-vt/src/main/java/com/oracle/dev/jdbc/RSIApp.java
@@ -0,0 +1,84 @@
+/*
+ Copyright (c) 2021, 2022, Oracle and/or its affiliates.
+
+ This software is dual-licensed to you under the Universal Permissive License
+ (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License
+ 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
+ either license.
+
+ 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
+
+ https://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.
+*/
+
+package com.oracle.dev.jdbc;
+
+import java.sql.SQLException;
+import java.time.Duration;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.stream.IntStream;
+
+import oracle.rsi.PushPublisher;
+import oracle.rsi.ReactiveStreamsIngestion;
+
+public class RSIApp {
+
+ private ExecutorService workerThreadPool;
+ private ReactiveStreamsIngestion rsi;
+ private PushPublisher