<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tarcisio Freitas</title>
    <description>The latest articles on DEV Community by Tarcisio Freitas (@tarcisiogf).</description>
    <link>https://dev.to/tarcisiogf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1957624%2F52219ec3-de31-490c-b485-b8360cee33e6.png</url>
      <title>DEV Community: Tarcisio Freitas</title>
      <link>https://dev.to/tarcisiogf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tarcisiogf"/>
    <language>en</language>
    <item>
      <title>Updating Apache Tomcat on RHEL via AppStream: Challenges and Solutions</title>
      <dc:creator>Tarcisio Freitas</dc:creator>
      <pubDate>Tue, 08 Jul 2025 05:40:17 +0000</pubDate>
      <link>https://dev.to/tarcisiogf/updating-apache-tomcat-on-rhel-via-appstream-challenges-and-solutions-28d0</link>
      <guid>https://dev.to/tarcisiogf/updating-apache-tomcat-on-rhel-via-appstream-challenges-and-solutions-28d0</guid>
      <description>&lt;p&gt;This guide details the process of updating Apache Tomcat to the latest version (9.0.87) in a Red Hat Enterprise Linux (RHEL) 9.4 (Plow) environment, covering specific challenges encountered in July 2025. The motivation for this article arose from memory failures in the &lt;strong&gt;survivor&lt;/strong&gt; area of the JVM, affecting critical Java applications and causing crashes even with a small number of active users.&lt;/p&gt;

&lt;p&gt;We chose Tomcat to host &lt;strong&gt;ORDS/APEX&lt;/strong&gt; and other Java-based applications. Despite initial efforts such as upgrading from Java 8 to Java 21 and constant monitoring using &lt;code&gt;jstat&lt;/code&gt;, the &lt;strong&gt;memory leak&lt;/strong&gt; persisted. Red Hat support recommended upgrading Tomcat to a version maintained via the &lt;strong&gt;AppStream&lt;/strong&gt; repositories.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, ensure the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operating system: RHEL 9.4 with AppStream repositories configured (use of &lt;code&gt;dnf&lt;/code&gt; is recommended).&lt;/li&gt;
&lt;li&gt;Superuser privileges (&lt;code&gt;sudo&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;JDK installed and updated, compatible with the target Tomcat version (minimum Java 8 for Tomcat 9).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Preparing the Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1. Backup Current Installation
&lt;/h3&gt;

&lt;p&gt;Perform a full backup of your existing Tomcat installation, preserving permissions, symbolic links, and metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop tomcat
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-rp&lt;/span&gt; &lt;span class="nt"&gt;--preserve&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all /opt/tomcat /backup_path/tomcat &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The &lt;code&gt;--preserve=all&lt;/code&gt; option ensures symbolic links, ownerships, groups, and permissions are retained.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.2. Remove Old Versions
&lt;/h3&gt;

&lt;p&gt;In order to avoid future errors or conflicts, rmove any residual Tomcat packages and service files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf remove &lt;span class="s1"&gt;'tomcat*'&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /etc/systemd/system/tomcat.service
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /opt/tomcat

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm the removal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; tomcat
&lt;span class="nb"&gt;sudo ls&lt;/span&gt; &lt;span class="nt"&gt;-lha&lt;/span&gt; /opt/tomcat
&lt;span class="nb"&gt;sudo ls&lt;/span&gt; &lt;span class="nt"&gt;-lha&lt;/span&gt; /usr/share/tomcat/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Installing Tomcat 9 via AppStream
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1. Update and Install
&lt;/h3&gt;

&lt;p&gt;Update the system and install Tomcat and its modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;tomcat tomcat-webapps tomcat-admin-webapps &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2. Enable the Service
&lt;/h3&gt;

&lt;p&gt;Start and enable the Tomcat service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; tomcat
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3. Configure Firewall
&lt;/h3&gt;

&lt;p&gt;Open port 8080 if necessary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8080/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Directory Structure
&lt;/h2&gt;

&lt;p&gt;The following table compares the directory paths used by Tomcat when installed via AppStream vs. a traditional installation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;AppStream (RHEL) Path&lt;/th&gt;
&lt;th&gt;Traditional Path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Configuration&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/tomcat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[TOMCAT_HOME]/conf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Applications&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/lib/tomcat/webapps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[TOMCAT_HOME]/webapps&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/log/tomcat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[TOMCAT_HOME]/logs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binaries&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/usr/share/tomcat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[TOMCAT_HOME]/bin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. Configuration and Application Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1. Restore Configuration
&lt;/h3&gt;

&lt;p&gt;Back up the default configuration and restore from your previous installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mv&lt;/span&gt; /etc/tomcat/tomcat-users.xml /etc/tomcat/tomcat-users.xml.bkp
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /backup_path/tomcat/conf/tomcat-users.xml /etc/tomcat/tomcat-users.xml
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /backup_path/tomcat/webapps/manager/META-INF/context.xml /usr/share/tomcat/webapps/manager/META-INF/context.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2. Deploy Applications
&lt;/h3&gt;

&lt;p&gt;Copy &lt;code&gt;.war&lt;/code&gt; files and context configuration from backup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /backup_path/tomcat/webapps/&lt;span class="k"&gt;*&lt;/span&gt;.war /usr/share/tomcat/webapps/
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /backup_path/tomcat/conf/Catalina/localhost/&lt;span class="k"&gt;*&lt;/span&gt;.xml /etc/tomcat/Catalina/localhost/
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:tomcat /usr/share/tomcat/webapps/&lt;span class="k"&gt;*&lt;/span&gt;.war
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 /usr/share/tomcat/webapps/&lt;span class="k"&gt;*&lt;/span&gt;.war
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:tomcat /etc/tomcat/Catalina/localhost/&lt;span class="k"&gt;*&lt;/span&gt;.xml
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 /etc/tomcat/Catalina/localhost/&lt;span class="k"&gt;*&lt;/span&gt;.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3. Restart Tomcat
&lt;/h3&gt;

&lt;p&gt;Reload the configuration and restart the service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Memory Configuration (&lt;code&gt;CATALINA_OPTS&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1. Initial Recommendations
&lt;/h3&gt;

&lt;p&gt;Red Hat offers a JVM Configuration Calculator that helps generate optimal memory and GC settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://access.redhat.com/labs/jvmconfig/" rel="noopener noreferrer"&gt;Red Hat JVM Configuration Calculator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1l7itn0vfplmcsgbx891.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1l7itn0vfplmcsgbx891.png" alt="JVM Calculator" width="800" height="809"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, this article provides excellent insights on JVM memory allocation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.redhat.com/articles/2021/09/09/how-jvm-uses-and-allocates-memory" rel="noopener noreferrer"&gt;How the JVM Uses and Allocates Memory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2. Configure Systemd
&lt;/h3&gt;

&lt;p&gt;Edit Tomcat’s override configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl edit tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insert the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"CATALINA_OPTS=&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-Xms20G -Xmx20G -server &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-XX:+UseG1GC &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-XX:+ExplicitGCInvokesConcurrent &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-XX:MaxGCPauseMillis=500 &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-Xlog:gc*:file=/var/log/tomcat/gc.log:time,uptime,level,tags:filecount=5,filesize=10M &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use a single-line version for compatibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"CATALINA_OPTS=-Xms20G -Xmx20G -server -XX:+UseG1GC -XX:+ExplicitGCInvokesConcurrent -XX:MaxGCPauseMillis=500 -Xlog:gc*:file=/var/log/tomcat/gc.log:time,uptime,level,tags:filecount=5,filesize=10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If formatting issues prevent the service from starting, use the single-line version.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6.3. Set Log Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; tomcat:tomcat /var/log/tomcat
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;750 /var/log/tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.4. Restart and Validate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tomcat
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status tomcat &lt;span class="nt"&gt;--no-pager&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl show tomcat | &lt;span class="nb"&gt;grep &lt;/span&gt;CATALINA_OPTS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why use &lt;code&gt;--no-pager&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Displays full output directly in the terminal.&lt;/li&gt;
&lt;li&gt;Easier to pipe or redirect in automation scripts.&lt;/li&gt;
&lt;li&gt;Prevents hangs in automated tools that rely on &lt;code&gt;systemctl&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6.5. Garbage Collector Selection
&lt;/h3&gt;

&lt;p&gt;Avoid using multiple collectors simultaneously. Choose one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For G1GC (recommended for modern JVMs):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-XX&lt;/span&gt;:+UseG1GC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;For ParallelGC:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-XX&lt;/span&gt;:+UseParallelGC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.6. Configure tomcat-users.xml to enable Web Mannager
&lt;/h3&gt;

&lt;p&gt;Copy your configuration (if exists) of you&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;backup_tomcat_path/tomcat-users.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/etc/tomcat/tomcat-users.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Issues with Missing Libraries (commons-dbcp)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1. Problem Context
&lt;/h3&gt;

&lt;p&gt;Some applications failed to deploy due to missing &lt;code&gt;commons-dbcp&lt;/code&gt;. Red Hat’s minimal Tomcat packaging excludes legacy libraries like &lt;code&gt;commons-dbcp 1.4&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Check availability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf search dbcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.2. Solution: Manual Installation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Create Temporary Directory
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/downloads/missing_libs_dnf_tomcat/
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/downloads/missing_libs_dnf_tomcat/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Download the Libraries
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://archive.apache.org/dist/commons/dbcp/binaries/commons-dbcp-1.4-bin.zip
wget https://archive.apache.org/dist/commons/pool/binaries/commons-pool-1.6-bin.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Unzip and Copy to Tomcat’s &lt;code&gt;lib&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;unzip commons-dbcp-1.4-bin.zip
unzip commons-pool-1.6-bin.zip
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;commons-dbcp-1.4/commons-dbcp-1.4.jar /usr/share/tomcat/lib/
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;commons-pool-1.6/commons-pool-1.6.jar /usr/share/tomcat/lib/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 4: Adjust &lt;code&gt;catalina.properties&lt;/code&gt; (Optional)
&lt;/h4&gt;

&lt;p&gt;If JNDI-related errors persist, comment out the &lt;code&gt;DataSource.Factory&lt;/code&gt; line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vi /etc/tomcat/tomcat.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comment the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="c"&gt;#javax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 5: Restart Tomcat
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This guide documents how we solved JVM memory issues in a RHEL 9.4 environment by upgrading Java and Tomcat 9 via AppStream. The process involved backing up the existing setup, removing old versions, performing a clean install, fine-tuning JVM settings, and resolving missing library issues. We hope this article, written in July 2025, provides helpful guidance to other professionals facing similar challenges.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;By Tarcisio Freitas&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oracle APEX Architect, Senior APEX Developer, Senior Oracle DBA&lt;/p&gt;

&lt;p&gt;portuguese version:&lt;br&gt;
&lt;a href="https://dev.to/tarcisiogf/atualizando-o-apache-tomcat-no-rhel-9-via-appstream-e-seus-desafios-4g74"&gt;https://dev.to/tarcisiogf/atualizando-o-apache-tomcat-no-rhel-9-via-appstream-e-seus-desafios-4g74&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Header image credit: &lt;a href="https://www.novoshore.com/2025/01/28/ords-24-4-http-removal" rel="noopener noreferrer"&gt;https://www.novoshore.com/2025/01/28/ords-24-4-http-removal&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Atualizando o Apache Tomcat no RHEL 9 via AppStream e seus desafios</title>
      <dc:creator>Tarcisio Freitas</dc:creator>
      <pubDate>Tue, 08 Jul 2025 05:29:23 +0000</pubDate>
      <link>https://dev.to/tarcisiogf/atualizando-o-apache-tomcat-no-rhel-9-via-appstream-e-seus-desafios-4g74</link>
      <guid>https://dev.to/tarcisiogf/atualizando-o-apache-tomcat-no-rhel-9-via-appstream-e-seus-desafios-4g74</guid>
      <description>&lt;p&gt;Este guia detalha o processo de atualização do Apache Tomcat para ultima versão (9.0.87) em um ambiente Red Hat Enterprise Linux (RHEL) 9.4 (Plow), abordando desafios específicos encontrados em julho de 2025. A motivação para este artigo surgiu de falhas de memória na área &lt;em&gt;survival&lt;/em&gt; da JVM em aplicações Java críticas, que causavam travamentos mesmo com poucos usuários conectados.&lt;br&gt;
Escolhemos o Tomcat para hospedar o ORDS/APEX e outras aplicações em java. &lt;br&gt;
Após algumas inciativas como atualização do Java 8 para o Java 21 e monitoramento constante via jstat, o &lt;em&gt;memory leak&lt;/em&gt; persistia. O suporte da Red Hat recomendou atualizar o Tomcat para uma versão mantida nos repositórios AppStream. &lt;/p&gt;
&lt;h2&gt;
  
  
  1. Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Antes de iniciar, verifique as seguintes condições:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sistema operacional: RHEL 9.4 com repositórios AppStream configurados (recomenda-se o uso do &lt;code&gt;dnf&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Permissões de superusuário (&lt;code&gt;sudo&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;JDK instalado e atualizado, compatível com a versão do Tomcat (mínimo Java 8 para Tomcat 9).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  2. Preparação do Ambiente
&lt;/h2&gt;
&lt;h3&gt;
  
  
  2.1. Backup da Instalação Atual
&lt;/h3&gt;

&lt;p&gt;Realize um backup completo da instalação do Tomcat, preservando permissões, links simbólicos e metadados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-rp&lt;/span&gt; &lt;span class="nt"&gt;--preserve&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all /opt/tomcat /backup_path/tomcat/ &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: A opção &lt;code&gt;--preserve=all&lt;/code&gt; mantém links simbólicos, proprietários, grupos e permissões.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.2. Remoção de Versões Antigas
&lt;/h3&gt;

&lt;p&gt;Remova pacotes e arquivos residuais do Tomcat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf remove &lt;span class="s1"&gt;'tomcat*'&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /etc/systemd/system/tomcat.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirme a remoção completa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpm &lt;span class="nt"&gt;-ql&lt;/span&gt; tomcat | less
&lt;span class="nb"&gt;sudo ls&lt;/span&gt; &lt;span class="nt"&gt;-lha&lt;/span&gt; /etc/tomcat/
&lt;span class="nb"&gt;sudo ls&lt;/span&gt; &lt;span class="nt"&gt;-lha&lt;/span&gt; /usr/share/tomcat/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Instalação do Tomcat 9 via AppStream
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1. Atualização e Instalação
&lt;/h3&gt;

&lt;p&gt;Atualize o sistema e instale o Tomcat e seus módulos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;tomcat tomcat-webapps tomcat-admin-webapps &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2. Ativação do Serviço
&lt;/h3&gt;

&lt;p&gt;Habilite e inicie o serviço do Tomcat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; tomcat
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3. Configuração do Firewall
&lt;/h3&gt;

&lt;p&gt;Libere a porta 8080, se necessário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8080/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Estrutura de Diretórios
&lt;/h2&gt;

&lt;p&gt;A tabela abaixo compara os caminhos do Tomcat instalado via AppStream com a instalação clássica:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Caminho (AppStream - RHEL)&lt;/th&gt;
&lt;th&gt;Caminho (Clássico)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Configuração&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/tomcat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[TOMCAT_HOME]/conf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aplicações&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/lib/tomcat/webapps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[TOMCAT_HOME]/webapps&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/log/tomcat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[TOMCAT_HOME]/logs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binários&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/usr/share/tomcat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[TOMCAT_HOME]/bin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  5. Configurações e Deploy de Aplicações
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1. Restauração de Configurações
&lt;/h3&gt;

&lt;p&gt;Faça backup do arquivo de configuração padrão e restaure configurações anteriores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mv&lt;/span&gt; /etc/tomcat/tomcat-users.xml /etc/tomcat/tomcat-users.xml.bkp
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /backup_path/tomcat/conf/tomcat-users.xml /etc/tomcat/tomcat-users.xml
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /backup_path/tomcat/webapps/manager/META-INF/context.xml /usr/share/tomcat/webapps/manager/META-INF/context.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2. Deploy de Aplicações
&lt;/h3&gt;

&lt;p&gt;Copie os arquivos &lt;code&gt;.war&lt;/code&gt; e configurações de contexto do backup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /backup_path/tomcat/webapps/&lt;span class="k"&gt;*&lt;/span&gt;.war /usr/share/tomcat/webapps/
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /backup_path/tomcat/conf/Catalina/localhost/&lt;span class="k"&gt;*&lt;/span&gt;.xml /etc/tomcat/Catalina/localhost/
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:tomcat /usr/share/tomcat/webapps/&lt;span class="k"&gt;*&lt;/span&gt;.war
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 /usr/share/tomcat/webapps/&lt;span class="k"&gt;*&lt;/span&gt;.war
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:tomcat /etc/tomcat/Catalina/localhost/&lt;span class="k"&gt;*&lt;/span&gt;.xml
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 /etc/tomcat/Catalina/localhost/&lt;span class="k"&gt;*&lt;/span&gt;.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3. Reiniciar o Tomcat
&lt;/h3&gt;

&lt;p&gt;Atualize e reinicie o serviço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Ajustes de Memória (CATALINA_OPTS)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1. Recomendações Iniciais
&lt;/h3&gt;

&lt;p&gt;Existe uma calculadora que a Redhat oferta para o auxilio da configuração dos parâmetros da JVM muito interessante:&lt;/p&gt;

&lt;p&gt;Este aplicativo permite especificar vários parâmetros para o ambiente e a JVM específicos, gerando opções otimizadas para a JVM. Ele também explica por que cada opção é gerada e fornece um link para a base de conhecimento da Red Hat para problemas e soluções conhecidos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://access.redhat.com/labs/jvmconfig/" rel="noopener noreferrer"&gt;Calculadora de Configuração da JVM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1l7itn0vfplmcsgbx891.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1l7itn0vfplmcsgbx891.png" alt="JVM Calculator" width="800" height="809"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E neste artigo há um bom conteúdo para a compressão da alocação de Memória da JVM&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.redhat.com/articles/2021/09/09/how-jvm-uses-and-allocates-memory" rel="noopener noreferrer"&gt;How the JVM Uses and Allocates Memory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2. Configuração do Systemd
&lt;/h3&gt;

&lt;p&gt;Edite o override do serviço Tomcat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl edit tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"CATALINA_OPTS=
-Xms20G -Xmx20G -server &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-XX:+UseG1GC &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-XX:+ExplicitGCInvokesConcurrent &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-XX:MaxGCPauseMillis=500 &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-Xlog:gc*:file=/var/log/tomcat/gc.log:time,uptime,level,tags:filecount=5,filesize=10M &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s"&gt;-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou assim&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"CATALINA_OPTS=-Xms20G -Xmx20G -server -XX:+UseG1GC -XX:+ExplicitGCInvokesConcurrent -XX:MaxGCPauseMillis=500 -Xlog:gc*:file=/var/log/tomcat/gc.log:time,uptime,level,tags:filecount=5,filesize=10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Se houver problemas com o formato (ocorre na hora do start do tomcat), dependendo da sua paciencia em acertar a diagramação correta, escolha a segunda opção.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6.3. Permissões de Logs
&lt;/h3&gt;

&lt;p&gt;Ajuste as permissões do diretório de logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; tomcat:tomcat /var/log/tomcat
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;750 /var/log/tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.4. Reiniciar e Validar
&lt;/h3&gt;

&lt;p&gt;Reinicie e verifique o serviço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tomcat
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status tomcat &lt;span class="nt"&gt;--no-pager&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl show tomcat | &lt;span class="nb"&gt;grep &lt;/span&gt;CATALINA_OPTS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Por que usar &lt;code&gt;--no-pager&lt;/code&gt;?&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exibe a saída completa no terminal.
&lt;/li&gt;
&lt;li&gt;Facilita redirecionamento ou processamento por outros comandos.
&lt;/li&gt;
&lt;li&gt;Evita travamentos em scripts automatizados.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6.5. Escolha do Garbage Collector
&lt;/h3&gt;

&lt;p&gt;Evite conflitos entre coletores de lixo. Escolha apenas um:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para G1GC (recomendado para Java recente):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-XX&lt;/span&gt;:+UseG1GC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Para ParallelGC:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-XX&lt;/span&gt;:+UseParallelGC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Problemas com Bibliotecas (commons-dbcp)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1. Contexto do Problema
&lt;/h3&gt;

&lt;p&gt;Algumas aplicações falharam no deploy devido à ausência da biblioteca &lt;code&gt;commons-dbcp&lt;/code&gt;. A Red Hat empacota o Tomcat de forma minimalista, excluindo bibliotecas legadas como &lt;code&gt;commons-dbcp 1.4&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Confirme a indisponibilidade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf search dbcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.2. Solução: Instalação Manual
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Passo 1: Criar Diretório Temporário
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/downloads/missing_libs_dnf_tomcat/
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/downloads/missing_libs_dnf_tomcat/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Passo 2: Baixar Bibliotecas
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://archive.apache.org/dist/commons/dbcp/binaries/commons-dbcp-1.4-bin.zip
wget https://archive.apache.org/dist/commons/pool/binaries/commons-pool-1.6-bin.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Passo 3: Descompactar e Copiar
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;unzip commons-dbcp-1.4-bin.zip
unzip commons-pool-1.6-bin.zip
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;commons-dbcp-1.4/commons-dbcp-1.4.jar /usr/share/tomcat/lib/
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;commons-pool-1.6/commons-pool-1.6.jar /usr/share/tomcat/lib/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Passo 4: Ajustar &lt;code&gt;catalina.properties&lt;/code&gt; (Opcional)
&lt;/h4&gt;

&lt;p&gt;Se houver erros de JNDI, comente a linha referente ao &lt;code&gt;DataSource.Factory&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vi /etc/tomcat/catalina.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Localize e comente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="c"&gt;#javax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Passo 5: Reiniciar o Tomcat
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Este guia documenta a solução para falhas de memória na JVM em um ambiente RHEL 9.4, resolvidas pela atualização do Java e do Tomcat 9 via AppStream. O processo incluiu backup, remoção de versões antigas, instalação, configuração de memória e resolução de problemas com bibliotecas legadas. Esperamos que este conteúdo, registrado em julho de 2025, auxilie outros profissionais enfrentando desafios semelhantes.&lt;/p&gt;

&lt;p&gt;Por Tarcisio Freitas&lt;br&gt;
Oracle DBA, Oracle APEX Architect, Senior APEX Developer. &lt;/p&gt;

&lt;p&gt;English version:&lt;br&gt;
&lt;a href="https://dev.to/tarcisiogf/updating-apache-tomcat-on-rhel-via-appstream-challenges-and-solutions-28d0"&gt;https://dev.to/tarcisiogf/updating-apache-tomcat-on-rhel-via-appstream-challenges-and-solutions-28d0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;header_image/credit:&lt;a href="https://www.novoshore.com/2025/01/28/ords-24-4-http-removal" rel="noopener noreferrer"&gt;https://www.novoshore.com/2025/01/28/ords-24-4-http-removal&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tomcat</category>
      <category>apex</category>
      <category>ords</category>
      <category>memoryleak</category>
    </item>
    <item>
      <title>Complete Tutorial: Setting up email sending on OCI Free Tier with Oracle APEX on Autonomous Database</title>
      <dc:creator>Tarcisio Freitas</dc:creator>
      <pubDate>Wed, 21 Aug 2024 20:43:26 +0000</pubDate>
      <link>https://dev.to/tarcisiogf/v3-complete-tutorial-setting-up-email-sending-on-oci-free-tier-with-oracle-apex-on-autonomous-database-4nn</link>
      <guid>https://dev.to/tarcisiogf/v3-complete-tutorial-setting-up-email-sending-on-oci-free-tier-with-oracle-apex-on-autonomous-database-4nn</guid>
      <description>&lt;h6&gt;
  
  
  Cover Image credit: &lt;a href="https://br.freepik.com/fotos-gratis/objetos-com-o-icone-do-que-eles-fazem_926671.htm#fromView=search&amp;amp;page=1&amp;amp;position=7&amp;amp;uuid=c57688cd-58d0-4349-b447-faa99f392522" rel="noopener noreferrer"&gt;Imagem de creativeart no Freepik&lt;/a&gt;
&lt;/h6&gt;

&lt;h3&gt;
  
  
  First: What is OCI Email Delivery?
&lt;/h3&gt;

&lt;p&gt;Oracle Cloud Infrastructure (OCI) Email Delivery is a service designed for sending transactional and high-volume emails securely and reliably. This article will guide you through the process of configuring OCI Email Delivery to send emails directly from your Oracle APEX Autonomous Database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Objective
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Configure OCI Email Delivery.&lt;/li&gt;
&lt;li&gt;Integrate the service with Oracle APEX.&lt;/li&gt;
&lt;li&gt;Test email delivery.&lt;/li&gt;
&lt;li&gt;Troubleshoot sending issues&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Before you Start
&lt;/h3&gt;

&lt;p&gt;Ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A free-tier Oracle Cloud Infrastructure (OCI) account.&lt;/li&gt;
&lt;li&gt;Administrator privileges.&lt;/li&gt;
&lt;li&gt;An active Oracle APEX service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Notice
&lt;/h3&gt;

&lt;p&gt;OCI often updates the names, order, and placement of services in the menu. As a result, the paths described in this article might differ slightly by the time you read it. However, a quick search in the service search bar should help you find the configuration options you need.&lt;/p&gt;




&lt;p&gt;Let´s get start:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Create or Select a Domain
&lt;/h4&gt;

&lt;p&gt;Once you’re logged into OCI with your administrator account.&lt;/p&gt;

&lt;p&gt;If you haven’t added a domain yet, do so now. If multiple domains are available, select the one currently in use.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Identity and Security &amp;gt; Domains&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxixz0w6vi72or1rxm67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxixz0w6vi72or1rxm67.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If no information is displayed, verify that a valid compartment is selected.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Create a User Group
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Identity and Security &amp;gt; Domains &amp;gt; Oracle Identity Cloud Service &amp;gt; Domain &amp;gt; Groups &amp;gt; Create Group&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1em0ixifvtp1c7p8gt8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1em0ixifvtp1c7p8gt8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example: Create a group named My-Email-Group.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Create a user and add them to the group (one step)
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Identity and Security &amp;gt; Domains &amp;gt; Oracle Identity Cloud Service &amp;gt; Domain&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevd4ap780szukyfbm4m3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevd4ap780szukyfbm4m3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Create an Email Policy
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Identity and Security &amp;gt; Policies and associate it with the user group you've created&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttvjzgsu8r9lezwv37au.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttvjzgsu8r9lezwv37au.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Create credentials for your SMTP service
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Identity &amp;gt; Domains &amp;gt; your domain &amp;gt; Users &amp;gt; SMTP&lt;/em&gt;&lt;br&gt;
Copy the user and password and store them securely, as you'll need them soon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1qjozdcfjqwup656vtxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1qjozdcfjqwup656vtxp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Create an email domain
&lt;/h4&gt;

&lt;p&gt;Don’t confuse this with a regular domain.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Developer Services &amp;gt; Email Delivery&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vqa4o9lqs7gipsyas0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vqa4o9lqs7gipsyas0c.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on Create Email Domain.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Create a user to approve your emails
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Developer Services &amp;gt; Email Delivery&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdj70hq5bo7uq6bbbjli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdj70hq5bo7uq6bbbjli.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An Approved Sender is the email address used in the "From:" header of the emails you send. Each sender email address must be registered to use it for Email Delivery. &lt;/p&gt;

&lt;p&gt;Example: &lt;a href="mailto:noreply@yourdomain.com"&gt;noreply@yourdomain.com&lt;/a&gt; or &lt;a href="mailto:sender_email@yourdomain.com"&gt;sender_email@yourdomain.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8. Obtain SMTP parameters
&lt;/h4&gt;

&lt;p&gt;Oracle Message:&lt;br&gt;
For optimal sending reputation, configure DKIM for this email domain. This is an important step to help ensure email delivery and reach the inbox. &lt;/p&gt;

&lt;p&gt;Do not skip this step unless you're in a development environment, in a hurry, or you are not very concerned about security.&lt;/p&gt;

&lt;p&gt;A suggestion: Why don't you keep going with the setup, test it out, send a test email? If it works, come back and finish the DKIM part.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Developer Services &amp;gt; Email Delivery &amp;gt; Configuration&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the SMTP sending information (not the first HTTPS sending information), copy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public endpoint&lt;/li&gt;
&lt;li&gt;Port&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4yprej3e64jtkbw8q84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4yprej3e64jtkbw8q84.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stay calm. Long configurations can be tedious, but we’re almost done!&lt;/p&gt;

&lt;h4&gt;
  
  
  9. Configure the SMTP Service in Autonomous
&lt;/h4&gt;

&lt;p&gt;Execute the following command in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle Apex / SQL Workshop / SQL Commands or&lt;/li&gt;
&lt;li&gt;SQL Developer&lt;/li&gt;
&lt;li&gt;Or any environment that has admin permission and access to the autonomous.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagqwv6jnqcgalov4jk5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagqwv6jnqcgalov4jk5v.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is now time to paste the SMTP credentials that you got in steps 5 and 9:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;

&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="n"&gt;APEX_INSTANCE_ADMIN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SET_PARAMETER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SMTP_HOST_ADDRESS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'paste_your_smtp_endpoint_here'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;APEX_INSTANCE_ADMIN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SET_PARAMETER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SMTP_USERNAME'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'enter_your_username_here'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;APEX_INSTANCE_ADMIN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SET_PARAMETER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SMTP_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'enter_your_password_here'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  10. Testing Email Delivery
&lt;/h4&gt;

&lt;p&gt;Now it’s time to test. If everything is set up correctly, your email should be sent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5rd45gtd7v73e0sielf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5rd45gtd7v73e0sielf.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As in the previous step, choose your preferred location for sending the test:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;

&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="n"&gt;APEX_MAIL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;P_To&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'any@gmail.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;P_Cc&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'another@gmail.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;P_From&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'your_approved_sender@your_email_domain'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;P_Subj&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'OCI Notification Test via Apex'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;P_Body&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Worked'&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;APEX_MAIL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PUSH_QUEUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 APEX_MAIL.PUSH_QUEUE: 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This instruction queues email messages for sending. It processes emails that have been configured but not yet sent, allowing you to manage and dispatch email communications from your APEX application.&lt;/p&gt;

&lt;p&gt;Some people manage to set up the configuration correctly and send the email, but the message doesn’t reach the recipient. As a result, the developer might believe there is a problem with the environment, configuration, or execution of the command.&lt;/p&gt;

&lt;p&gt;And in some cases, it's actually just the email that was sent to the queue and not executed immediately. &lt;/p&gt;

&lt;h4&gt;
  
  
  11. Checking Sending Issues
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsdg41vkdboitl5gehrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsdg41vkdboitl5gehrl.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To check for sending issues...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Manage Instance &amp;gt; Mail Queue&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If the email does not appear in the queue or is not sent, check the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure APEX_MAIL.PUSH_QUEUE was executed.&lt;/li&gt;
&lt;li&gt;Verify if there are errors in the sender's name.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try another curious test. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbz3qm8mrcl566ae3dyp7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbz3qm8mrcl566ae3dyp7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the recipient (entity that will receive the message) does not exist, &lt;br&gt;
the email will not show sending errors. Only a failure in the sender’s name will generate a sending error.&lt;/p&gt;

&lt;p&gt;When you press "Force Send All Mail" button, if the queue is empty, it means the email was successfully sent, as it was already ready for dispatch and waiting in the queue.&lt;/p&gt;

&lt;h4&gt;
  
  
  12. Important Queries for Analysis
&lt;/h4&gt;

&lt;p&gt;You can also check complete details of all messagees using the administrative views:&lt;/p&gt;

&lt;p&gt;To view the live status of the queue:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;APEX_MAIL_QUEUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If no records were found, that's good. It means that nothing is stuck in the queue.&lt;/p&gt;

&lt;p&gt;The most important. &lt;br&gt;
To view the processing of all sent or unsent emails:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;APEX_MAIL_LOG&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchxkv8754x0lzrynp7p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchxkv8754x0lzrynp7p7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  13. OCI Email Deliver Dashboard
&lt;/h4&gt;

&lt;p&gt;After sending several messages, you can check more details in the Email Deliverability and Reputation Governance Dashboard in OCI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Go to: Menu &amp;gt; Developer Services &amp;gt; Email Delivery&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmtd38hxrl2au0awruxzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmtd38hxrl2au0awruxzo.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If all cards show zero activity, change the 'Filter by time' setting. Refreshing the page could display some data&lt;/p&gt;




&lt;h4&gt;
  
  
  14. Sending from you Oracle APEX app
&lt;/h4&gt;

&lt;p&gt;if you are writing a process in Oracle APEX to send an email, using a template or PL/SQL code, enable the option to send immediately so that the message doesn’t get stuck in the queue.&lt;br&gt;
Option Send Immediately: Active.&lt;/p&gt;

&lt;p&gt;Actually, the image below shows all the settings you need to send a standardized email from any Oracle Apex page. Just click any button and you're good to go! It's the simplest and fastest way to do it. Don't forget to add a button to your page that triggers the &lt;code&gt;send_mail_without_PLSQL&lt;/code&gt; process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokzey5uecc75j01a4o01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokzey5uecc75j01a4o01.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  An alert...
&lt;/h3&gt;

&lt;p&gt;The email queue serves several purposes. If every application sent emails immediately, it could lead to performance issues. So, it might be a good idea to understand the company culture or to establish one.&lt;/p&gt;

&lt;p&gt;One way to do this is by talking to your database administrator, the person in charge of infrastructure, or a colleague who has been with the company longer, to figure out the best strategy for each environment (development, production, or staging).&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Congratulations! You have successfully configured OCI Email Delivery and integrated it with Oracle APEX. To ensure effective and secure email delivery, consider configuring DKIM and monitoring your sending reputation.&lt;/p&gt;

&lt;p&gt;If you encounter issues or need further support, consult Oracle’s official documentation or contact technical support.&lt;/p&gt;

&lt;p&gt;Thanks for reading and for you time!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>oracleapex</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
