Jinwoo Hwang created GEODE-10504:
------------------------------------
Summary: Tomcat 11 Support for Apache Geode Session Management
Key: GEODE-10504
URL: https://issues.apache.org/jira/browse/GEODE-10504
Project: Geode
Issue Type: Improvement
Reporter: Jinwoo Hwang
h2. Summary
Add support for Tomcat 11 to enable Geode session management with Jakarta EE 10
compatible servlet containers. This extends Geode's session replication
capabilities to modern Tomcat versions.
{*}Impact{*}: Session management modules | {*}Risk{*}: Medium | {*}Timeline{*}:
4 weeks
----
h2. Background
h3. Why Required
* {*}Jakarta EE 10 Migration{*}: Tomcat 10/11 uses {{jakarta.*}} namespace
* {*}Tomcat Version Support Gap{*}: Currently support Tomcat 7/8/9 (all
javax-based)
* {*}Modern Application Servers{*}: Customers migrating to Jakarta EE need
Tomcat 10/11
* {*}Spring Boot 3 Support{*}: Spring Boot 3 requires Tomcat 10.1+ or 11.x
h3. Current State
* {*}Supported{*}: Tomcat 7, 8, 9 (all use {{{}javax.servlet.*{}}})
* {*}Target{*}: Add Tomcat 10.1.x and 11.x (use {{{}jakarta.servlet.*{}}})
* {*}Affected Modules{*}:
** {{geode-modules-tomcat7}}
** {{geode-modules-tomcat8}}
** {{geode-modules-tomcat9}}
** {*}NEW{*}: {{geode-modules-tomcat10}} (to be created)
** {*}NEW{*}: {{geode-modules-tomcat11}} (to be created)
----
h2. Scope
h3. *In Scope*
* Create {{geode-modules-tomcat10}} module for Tomcat 10.1.x
* Create {{geode-modules-tomcat11}} module for Tomcat 11.x
* Migrate servlet API from {{javax.*}} to {{jakarta.*}}
* Session replication functionality
* Session attribute serialization
* Tomcat valve integration
* Session manager implementation
* Delta session support
* Build and packaging for new modules
h3. *Key Changes*
||Component||Tomcat 7/8/9||Tomcat 10/11||Migration||
|*Servlet API*|{{javax.servlet.*}}|{{jakarta.servlet.*}}|🔴 Namespace change|
|*Tomcat Version*|7.x, 8.x, 9.x|10.1.x, 11.x|🟡 API differences|
|*Valve API*|{{org.apache.catalina.valves.ValveBase}}|Same package|🟢 Compatible|
|*Session
API*|{{javax.servlet.http.HttpSession}}|{{jakarta.servlet.http.HttpSession}}|🔴
Namespace change|
|*Context API*|Tomcat 9 Context|Tomcat 10/11 Context|🟡 Minor changes|
|*Build Tool*|Gradle|Gradle|🟢 Same|
----
h2. Implementation Plan
h3. *Phase 1: Module Setup* (Week 1, Days 1-3)
* [ ] Create {{geode-modules-tomcat10}} module structure
* [ ] Create {{geode-modules-tomcat11}} module structure
* [ ] Set up Gradle build files
* [ ] Configure Tomcat 10.1.x dependencies
* [ ] Configure Tomcat 11.x dependencies
* [ ] Copy base code from {{geode-modules-tomcat9}}
h3. *Phase 2: Jakarta Namespace Migration* (Week 1-2, Days 4-7)
* [ ] Update all {{javax.servlet.*}} imports to {{jakarta.servlet.*}}
* [ ] Update {{javax.servlet.http.*}} to {{jakarta.servlet.http.*}}
* [ ] Update session listener interfaces
* [ ] Update filter/valve implementations
* [ ] Update servlet context usage
* [ ] Verify no remaining {{javax.*}} references
h3. *Phase 3: Tomcat API Compatibility* (Week 2, Days 8-10)
* [ ] Update Tomcat Context API usage
* [ ] Migrate Valve implementation for Tomcat 10/11
* [ ] Update session manager registration
* [ ] Handle Tomcat 10 vs 11 differences (if any)
* [ ] Update lifecycle listener integration
h3. *Phase 4: Session Management Features* (Week 2-3, Days 11-14)
* [ ] Delta session replication
* [ ] Session attribute serialization
* [ ] Session failover handling
* [ ] Commit valve functionality
* [ ] Session expiration handling
* [ ] Session event listeners
h3. *Phase 5: Configuration & Integration* (Week 3, Days 15-16)
* [ ] Create configuration examples for Tomcat 10
* [ ] Create configuration examples for Tomcat 11
* [ ] Document {{context.xml}} setup
* [ ] Document {{server.xml}} configuration
* [ ] Create sample applications
*context.xml Example:*
{{<Context><Manager
className="org.apache.geode.modules.session.catalina.Tomcat10DeltaSessionManager"regionName="gemfire_modules_sessions"enableLocalCache="false"/><Valve
className="org.apache.geode.modules.session.catalina.SessionReplicationValve"/></Context>}}
h3. *Phase 6: Testing* (Week 3-4, Days 17-20)
* [ ] Unit tests for session management
* [ ] Integration tests with Tomcat 10.1
* [ ] Integration tests with Tomcat 11
* [ ] Session replication tests
* [ ] Failover tests
* [ ] Performance tests
* [ ] Cross-version compatibility tests
*Test Coverage:*
* Session creation and destruction
* Session attribute get/set/remove
* Session replication across nodes
* Session failover scenarios
* Delta propagation
* Serialization/deserialization
* Concurrent session access
h3. *Phase 7: Documentation* (Week 4, Days 21-22)
* [ ] Update user guide for Tomcat 10/11
* [ ] Migration guide from Tomcat 9 to 10/11
* [ ] Configuration reference
* [ ] Troubleshooting guide
* [ ] Release notes
----
h2. Technical Details
h3. Tomcat Version Compatibility Matrix
||Tomcat Version||Jakarta EE||Servlet API||Java||Status||
|7.x|Java EE 6|3.0 (javax)|6+|✅ Supported|
|8.5.x|Java EE 7|3.1 (javax)|7+|✅ Supported|
|9.x|Java EE 8|4.0 (javax)|8+|✅ Supported|
|*10.1.x*|*Jakarta EE 10*|*6.0 (jakarta)*|*11+*|🎯 *Target*|
|*11.x*|*Jakarta EE 11*|*6.1 (jakarta)*|*17+*|🎯 *Target*|
h3. Key API Changes
h4. *1. Servlet API Namespace*
{{// Tomcat 9 (javax)javax.servlet.Servlet
javax.servlet.Filter
javax.servlet.http.HttpServlet
javax.servlet.http.HttpSession}}
{{// Tomcat 10/11 (jakarta)jakarta.servlet.Servlet
jakarta.servlet.Filter
jakarta.servlet.http.HttpServlet
jakarta.servlet.http.HttpSession}}
h4. *2. Session Manager Interface*
{{// Tomcat 10/11import org.apache.catalina.Manager;}}
{{import org.apache.catalina.Session;}}
{{import jakarta.servlet.http.HttpSession;}}
{{public class Tomcat10DeltaSessionManager extends ManagerBase {}}
{{ @Overridepublic Session createSession(String sessionId) { }}
{{ DeltaSession session = new DeltaSession(this); }}
{{ session.setId(sessionId); return session;}}
{{ }}}
{{}}}
h4. *3. Session Attribute Handling*
{{// Both Tomcat 9 and 10/11 (same logic, different imports)}}
{{public class DeltaSession implements HttpSession {}}
{{ private final Map<String, Object> attributes = new HashMap<>();}}
{{@Overridepublic Object getAttribute(String name) {}}
{{ return attributes.get(name);}}
{{ }}}
{{@Overridepublic void setAttribute(String name, Object value) {}}
{{ Object oldValue = attributes.put(name, value);}}
{{ // Trigger delta replication}}
{{ notifyAttributeChange(name, oldValue, value);}}
{{ }}}
{{}}}
----
h2. Architecture
h3. Shared vs Version-Specific Code
*Shared Code (geode-modules-session):*
* Session serialization logic
* Delta calculation
* Geode region interaction
* Session event handling
*Version-Specific Code (tomcat10/11):*
* Servlet API implementation
* Valve implementation
* Manager registration
* Context integration
----
h2. Risks & Mitigation
||Risk||Impact||Probability||Mitigation||
|*Tomcat 10/11 API differences*|Incompatibility|Medium|Thorough API review,
testing|
|*Session serialization issues*|Data loss|Low|Extensive serialization tests|
|*Performance regression*|User impact|Low|Performance benchmarking|
|*Tomcat version fragmentation*|Maintenance burden|High|Share maximum code via
modules|
|*Jakarta namespace conflicts*|Build failures|Low|Proper dependency management|
----
h2. Dependencies
{*}Blocked By{*}:
* Jakarta EE 10 migration
* Core modules Jakarta migration
{*}Blocks{*}:
* Spring Boot 3 embedded Tomcat support
* Full Jakarta EE ecosystem support
{*}Related{*}:
* Jetty 11 migration (alternative servlet container)
* Spring Boot 3 migration
----
h2. Success Criteria
* [ ] {{geode-modules-tomcat10}} module created and functional
* [ ] {{geode-modules-tomcat11}} module created and functional
* [ ] All servlet APIs migrated to {{jakarta.*}} namespace
* [ ] Session replication works on Tomcat 10.1.x
* [ ] Session replication works on Tomcat 11.x
* [ ] All tests passing (unit + integration)
* [ ] No performance regression vs Tomcat 9
* [ ] Documentation complete
* [ ] Sample applications provided
----
h2. Testing Strategy
h3. *Unit Tests*
* Session creation/destruction
* Attribute management
* Delta calculation
* Serialization/deserialization
h3. *Integration Tests*
* {*}Tomcat 10.1{*}: Deploy sample app, test session replication
* {*}Tomcat 11{*}: Deploy sample app, test session replication
* {*}Multi-node{*}: Session failover across Geode cluster
* {*}Load testing{*}: Concurrent session access
h3. *Compatibility Tests*
* Migrate existing Tomcat 9 app to Tomcat 10
* Verify session data compatibility
* Test rolling upgrades
----
h2. Resources
* {*}Development{*}: 4 person-weeks (1 developer × 4 weeks)
* {*}QA{*}: 1 week (integration testing)
* {*}Documentation{*}: 3 days
* {*}Total Effort{*}: ~5 person-weeks
----
h2. References
h3. *Documentation*
* [Tomcat 10 Migration Guide|https://tomcat.apache.org/migration-10.html]
* [Tomcat 11 Documentation|https://tomcat.apache.org/tomcat-11.0-doc/]
* [Jakarta Servlet 6.0
Specification|https://jakarta.ee/specifications/servlet/6.0/]
* [Geode Session State Management|https://geode.apache.org/docs/]
h3. *Related Issues*
* Jakarta EE 10 Migration
* Spring Boot 3 Migration
* Jetty 11 Support
----
h2. Migration Path for Users
h3. From Tomcat 9 to Tomcat 10/11
*Step 1: Update Geode Module*
{{<!-- Before (Tomcat 9) -->}}
{{<dependency>}}
{{ <groupId>org.apache.geode</groupId>}}
{{ <artifactId>geode-modules-tomcat9</artifactId>}}
{{<version>1.15.x</version>}}
{{</dependency>}}
{{<!-- After (Tomcat 10) -->}}
{{<dependency>}}
{{ <groupId>org.apache.geode</groupId>}}
{{ <artifactId>geode-modules-tomcat10</artifactId>}}
{{<version>2.0.0</version>}}
{{</dependency>}}
*Step 2: Update context.xml*
{{<!-- Change Manager class name --><Manager
className="org.apache.geode.modules.session.catalina.Tomcat10DeltaSessionManager"regionName="gemfire_modules_sessions"/>}}
*Step 3: Update Application Code*
* Change all {{javax.servlet.*}} imports to {{jakarta.servlet.*}}
* Recompile application
----
h2. Deliverables
* [ ] {{geode-modules-tomcat10}} module (source code)
* [ ] {{geode-modules-tomcat11}} module (source code)
* [ ] Build artifacts (JARs)
* [ ] Unit test suite
* [ ] Integration test suite
* [ ] User documentation
* [ ] Migration guide
* [ ] Sample applications
* [ ] Performance benchmark results
----
h2. Notes
h3. *Tomcat 10 vs 11 Differences*
* {*}Tomcat 10.1{*}: Jakarta EE 10, Servlet 6.0
* {*}Tomcat 11{*}: Jakarta EE 11, Servlet 6.1 (minor updates)
* Most code should be *identical* between Tomcat 10/11 modules
* Consider single codebase with multi-version build
h3. *Recommended Approach*
# Start with Tomcat 10 support (more stable)
# Validate with extensive testing
# Add Tomcat 11 support (mostly copy Tomcat 10)
# Share maximum code via {{geode-modules-session}}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)