ECO creation API times out under load, possible cloud load balancer affinity issue

We’re running Windchill 12.0 CPS05 in Azure cloud with a load balancer distributing traffic across three application servers. Our automated ECO creation process via REST API is timing out when we process more than 10 concurrent requests.

Typical error from our integration service:


POST /Windchill/servlet/odata/ECO/CreateChangeOrder
Response: 504 Gateway Timeout
Request duration: 62 seconds

The API gateway timeout appears to be set to 60 seconds, but ECO creation normally takes 15-20 seconds per request. Under load it’s exceeding this. I suspect the cloud load balancer configuration might be causing requests to queue rather than distribute evenly, or perhaps backend scaling isn’t keeping up with the concurrent API calls. This is breaking our ECO automation workflow that processes change requests from our ERP system.

I’ll address all three areas causing your API timeout issues under load.

API Gateway Timeout Configuration: Your Azure Application Gateway has a 60-second backend timeout which is too aggressive for ECO creation operations. Increase this to at least 180 seconds (3 minutes) to accommodate the workflow initialization and database operations involved in ECO creation. In Azure Portal, go to Application Gateway > Settings > HTTP settings and modify the Request timeout value:


az network application-gateway http-settings update \
  --gateway-name windchill-appgw \
  --name windchill-http-settings \
  --timeout 180

Also verify your API Management (if you’re using APIM in front of App Gateway) doesn’t have its own lower timeout. APIM default is 30 seconds which would cause failures before App Gateway timeout even kicks in.

Load Balancer Configuration for API Distribution: Your load balancer needs proper session affinity and connection draining for API requests. ECO creation involves multiple internal API calls that benefit from session persistence. Configure cookie-based affinity in your Application Gateway backend settings. This ensures all related API calls for a single ECO creation go to the same backend server, reducing database lock contention and improving cache hit rates.

Also critical: Set your connection drain timeout to 120+ seconds. Without this, when the load balancer decides to shift traffic, it can terminate active API connections mid-request causing the 504 errors you’re seeing. Configure this in the backend pool settings.

For concurrent request handling, verify your Application Gateway SKU supports your load. Standard_v2 or WAF_v2 SKUs handle concurrency much better than older SKUs. Your 10 concurrent requests should be no problem, but if you’re on an older SKU, it might be queuing requests unnecessarily.

Backend Scaling and Resource Optimization: While your CPU looks fine at 40-50%, ECO creation is database-intensive. Check these Windchill configuration parameters in your method server site.xconf:


wt.pom.dbcp.maxActive=100
wt.pom.dbcp.maxWait=30000
wt.method.server.maxThreads=150

The database connection pool (dbcp.maxActive) might be too small for 10 concurrent ECO creations across 3 servers. Each ECO creation uses 3-5 database connections during its lifecycle. With default settings of 50, you’re hitting pool exhaustion. Increase to 100 per server.

Also implement API request queuing in your integration service. Instead of sending 10 concurrent requests, use a queue with 3-4 worker threads. This prevents overwhelming the backend while still maintaining good throughput. ECO creation performance degrades non-linearly after about 5 concurrent operations due to database lock contention on workflow tables.

Monitoring and Validation: Enable Application Insights or Azure Monitor to track actual request duration at each layer. You’ll likely find that requests aren’t actually taking 62 seconds in Windchill - they’re spending time queued at the load balancer or waiting for database connections. Set up alerts for backend response times exceeding 30 seconds so you can identify issues before they cause timeouts.

After implementing these changes, test with gradually increasing concurrency: 2, 4, 6, 8, 10 requests. You should see consistent 15-25 second response times across all concurrency levels with proper configuration.


This draft is based on general Windchill knowledge. It has not been verified against your specific version and environment. Practitioners: verify the steps and share your experience below.

Check your Azure Application Gateway timeout settings. The default is 60 seconds which matches what you’re seeing. But the real question is why ECO creation is taking so long under load. Are your method servers adequately sized?

Method servers are Standard D4s v3 instances (4 vCPUs, 16GB RAM each). CPU usage stays around 40-50% during these timeouts, so it doesn’t seem like a pure compute resource issue. Memory is also fine. Could it be connection pool exhaustion at the load balancer level?

ECO creation involves database locks and workflow initialization which don’t scale linearly. When you have 10 concurrent requests, they might be contending for the same database resources even if CPU looks fine. Check your database connection pool settings and look at database wait events. Also, verify your load balancer is using session affinity correctly - if requests are bouncing between servers, you lose cache benefits and increase contention.

The 504 from API gateway suggests the timeout is happening at the gateway level, not in Windchill itself. You need to increase the backend timeout on your Application Gateway. Also implement retry logic with exponential backoff in your integration service to handle transient failures more gracefully.

“Tested this on Azure Application Gateway with Windchill 12.0, and bumping the backend HTTP settings timeout from 60 to 180 seconds eliminated ECO creation timeouts under concurrent load.”

I’ve dealt with similar Azure load balancing issues for Windchill APIs. The problem is usually a combination of gateway timeout configuration and insufficient backend connection handling. Your load balancer health checks might also be interfering with long-running API requests.

Starting to see the full picture now. It’s not just one thing but multiple configuration issues working together to cause the timeouts.