Let me provide a comprehensive solution addressing all three aspects: mobile SDK session management, server-side uniqueness validation, and PX/event listener side effects.
Root Cause Analysis:
Your issue combines session reuse problems with event listener state management. When mobile SDK sessions persist across multiple operations, the server-side validation cache isn’t cleared, and your custom ERP validation listener maintains state that causes false duplicate detections.
Solution - Mobile SDK Session Management:
Implement a session refresh pattern for mobile part creation operations:
public IItem createPartMobile(IAgileSession session, String partNumber, String desc) {
session.refresh(); // Clear validation cache
IItem newPart = (IItem) session.createObject(ItemConstants.CLASS_PART, partNumber);
newPart.setValue(ItemConstants.ATT_TITLE_BLOCK.DESCRIPTION, desc);
return newPart;
}
Server-Side Uniqueness Validation:
The duplicate check happens at multiple levels. Agile’s internal validation runs first, then your event listener. The session refresh clears Agile’s validation cache. For optimal performance with long-lived mobile sessions, call refresh() only before part creation operations, not on every API call.
PX/Event Listener Side Effects:
Your ERP validation listener needs modification to be stateless:
- Remove any class-level caching or static variables
- Ensure each validation request to ERP is independent
- Add proper exception handling that doesn’t mask validation errors
- Consider implementing a request-scoped cache key using session ID + part number
Here’s the corrected listener pattern:
// Pseudocode - Event listener validation:
1. Extract session context (session.getSessionID())
2. Build cache key: sessionID + partNumber + timestamp
3. Query ERP with timeout (max 2 seconds)
4. Return validation result without caching
5. Log validation outcome for audit
// Avoid: static Map<String,Boolean> cache - causes cross-session pollution
Additional Recommendations:
- Implement connection pooling for ERP validation calls to avoid timeouts
- Add logging around session.refresh() calls to verify execution
- Monitor server-side validation cache metrics (if available in 9.3.4)
- Consider upgrading to 9.3.6+ where mobile SDK session handling was improved
- Set session timeout parameters explicitly in mobile app configuration
Testing Approach:
- Test with session.refresh() before each createObject call
- Verify listener doesn’t hold state between invocations
- Load test with concurrent mobile users creating parts
- Monitor server logs for validation cache hits/misses
This solution addresses the immediate blocking issue while maintaining mobile app performance. The session refresh overhead is minimal (under 50ms typically) compared to the full session recreation cost.