Hi

I am not sure if others have noticed similar problem as you have.

It is much easier to help if you can put together a sample project with
some instructions how to try, then we have a chance to take a look.
Also if possible try with latest Camel 4.17.0 release and 4.14.5 / 4.18.0
when its released later this month.

Also I would suggest to try to java debug as you can then compare the 2
different clients, and inspect the data and notice what is different.

On top of my head then I wonder if there is a "Connection: close" send back
for Mendelson so the connection is closed. And for the other clien it is
not.


On Tue, Feb 3, 2026 at 1:42 PM Reto Peter <[email protected]> wrote:

> # Compatibility Issue: Camel AS2 Server + Mendelson AS2 Client -
> ConnectionShutdownException with Async MDN
>
>
>
> ## Summary
>
>
>
> When using **async MDN** with the Camel AS2 server component, **Mendelson
> AS2 clients** receive a `ConnectionShutdownException` even though the
> message is processed correctly and the MDN is received successfully. This
> causes Mendelson to retry sending the message unnecessarily, resulting in
> duplicate transmissions.
>
>
>
> **This is a Mendelson-specific issue.** The same Camel AS2 server works
> perfectly with **OpenAS2 clients** - async MDN completes without any
> errors. This strongly suggests the issue is related to Mendelson's HTTP
> client implementation, not a general Camel AS2 bug.
>
>
>
> ## Test Results Summary
>
>
>
> | AS2 Client | Async MDN | Result |
> |------------|-----------|--------|
> | **OpenAS2** | Works | No errors, MDN received, transmission complete |
> | **Mendelson** | Fails | ConnectionShutdownException, retries 10x (but
> MDN still received!) |
>
> ## Environment
>
>
> - **Camel Version:** 4.x (with HttpCore 5)
> - **Java:** Temurin-21
> - **Server:** Custom AS2 server using `camel-as2` component
>
> - **Clients Tested:**
>   - Mendelson AS2 (opensource version) - **FAILS**
>   - OpenAS2 4.8.0 - **WORKS**
> - **Protocol:** AS2 with async MDN
>
>
> ## OpenAS2 - WORKS CORRECTLY
>
>
>
> When OpenAS2 sends a message with async MDN to our Camel AS2 server,
> everything works:
>
>
>
> **OpenAS2 Client Logs (SUCCESS):**
> ```
> 20:25:03.905 [AS2DirectoryPollingModule] INFO  Message sender invoked
> 20:25:04.103 [AS2DirectoryPollingModule] INFO  Connecting to:
> http://localhost:8888/as2/receive
> 20:25:05.029 [AS2DirectoryPollingModule] INFO  Message sent and response
> received in 720 milliseconds
> 20:25:06.090 [pool-4-thread-2] INFO  incoming connection for receiving
> AsyncMDN
> 20:25:06.151 [pool-4-thread-2] INFO  Partner HELVETILINK responded with
> MDN [automatic-action/MDN-sent-automatically; processed]
> 20:25:06.164 [pool-4-thread-2] INFO  Message sent and MDN received
> successfully.
> 20:25:06.166 [pool-4-thread-2] INFO  Pending MDN MSG FILE deleted
> ```
>
> **Camel AS2 Server Logs (with OpenAS2):**
> ```
> 2026-02-03T20:25:04.103+08:00  INFO  [AS2Svr-8888] Incoming connection
> from /127.0.0.1
> 2026-02-03T20:25:04.103+08:00  INFO  [AS2Hdlr-117] Processing new AS2
> request
> 2026-02-03T20:25:04.108+08:00 DEBUG [AS2Hdlr-117] Processing request.
> Config Found: true
> 2026-02-03T20:25:04.297+08:00  INFO  [AS2Hdlr-117] Received AS2 message -
> From: OpenAS2Server, To: HELVETILINK, MDN: ASYNC
> 2026-02-03T20:25:04.343+08:00  INFO  [AS2Hdlr-117] Async MDN: Returning
> HTTP 200 OK immediately
> 2026-02-03T20:25:04.405+08:00 DEBUG [AS2Hdlr-117] HTTP/1.1 200 OK
> (Content-Length: 0)
> 2026-02-03T20:25:05.454+08:00  INFO  [SEDA] MDN sent successfully to
> http://localhost:10081/as2/mdn
> ```
>
> **Key observations with OpenAS2:**
> - No `ConnectionShutdownException`
> - No retries
> - Only 5ms between connection and processing (no Expect: 100-continue
> delay)
> - Message and MDN flow completes successfully
>
>
> ## Mendelson - FAILS WITH ConnectionShutdownException
>
>
>
> When Mendelson sends the same type of message with async MDN:
>
>
>
> **Mendelson Client Logs (FAILURE):**
> ```
> [7:55:40 PM] Preparing outbound AS2 message connection to "
> http://192.168.100.98:8888/as2/receive "
> [7:55:40 PM] Sending AS2 message, async MDN requested at
> http://192.168.100.98:8080/as2/HttpReceiver
> [7:55:43 PM] MessageHTTPUploader.performUpload:
> [ConnectionShutdownException]
> [7:55:43 PM] Will retry to send transmission after 30s, retry 1/10.
> [7:55:44 PM] An invalid request has been detected. It has not been
> processed because it does not contain a as2-to header.
> [7:55:44 PM] An invalid request has been detected. It has not been
> processed because it does not contain a as2-to header.
> [7:55:44 PM] Inbound connection from [192.168.100.98] on port 8080
> [7:55:44 PM] Inbound transmission is a MDN [HELVETILINK - mycompany]
> [7:55:44 PM] Inbound MDN state is [processed].
> [7:55:44 PM] Digital signature of inbound MDN has been verified successful.
> [7:55:44 PM] The Message Integrity Code (MIC) matches the sent AS2 message.
> ```
>
> **Key observations with Mendelson:**
> - `ConnectionShutdownException` thrown even though everything works
> - Mendelson schedules retry (up to 10 times) causing duplicate messages
>
> - MDN is still received and verified successfully!
>
> - Mysterious "invalid request" messages appear (source unknown)
>
> **Camel AS2 Server Logs (with Mendelson):**
> ```
> 2026-02-03T19:55:40.193+08:00  INFO  [AS2Svr-8888] Incoming connection
> from /192.168.100.98
> 2026-02-03T19:55:40.194+08:00  INFO  [AS2Hdlr-120] Processing new AS2
> request
> 2026-02-03T19:55:43.198+08:00 DEBUG [AS2Hdlr-120] Processing request.
> Config Found: true
> 2026-02-03T19:55:43.417+08:00  INFO  [AS2Hdlr-120] Received AS2 message -
> From: mycompanyAS2, To: HELVETILINK, MDN: ASYNC
> 2026-02-03T19:55:43.523+08:00  INFO  [AS2Hdlr-120] Async MDN: Returning
> HTTP 200 OK immediately
> 2026-02-03T19:55:43.675+08:00 DEBUG [AS2Hdlr-120] HTTP/1.1 200 OK
> (Content-Length: 0)
> 2026-02-03T19:55:44.168+08:00  INFO  [AS2Hdlr-120] Client closed connection
> 2026-02-03T19:55:44.820+08:00  INFO  [SEDA] MDN sent successfully
> ```
>
> **Note the 3-second delay** between connection (19:55:40) and processing
> (19:55:43) when Mendelson uses HTTP/1.1 with `Expect: 100-continue`.
> However, even when using HTTP/1.0 (no Expect header, no delay), the
> `ConnectionShutdownException` still occurs.
>
>
> ## What We Tried (None Fixed the Mendelson Issue)
>
> ### 1. Connection Handling - Server Closes with Delay
> Modified `ConnectionReuseStrategy.keepAlive()` to add a delay (500ms, then
> 2000ms) before returning `false`.
>
>
>
> **Result:** Exception still occurs.
>
>
>
> ### 2. Connection Handling - Let Client Close
>
> Modified `keepAlive()` to return `true`, letting the client close the
> connection.
>
>
>
> **Result:** Exception still occurs. Client does close, but exception
> happens anyway.
>
>
>
> ### 3. Connection Header Manipulation
>
> - Removed `ResponseConnControl` interceptor
>
> - Added explicit `Connection: close` header
>
> - Tried without any Connection header
>
>
>
> **Result:** No difference.
>
>
>
> ### 4. HTTP/1.0 vs HTTP/1.1
>
> Configured Mendelson to use HTTP/1.0 (to avoid `Expect: 100-continue`).
>
>
>
> **Result:** Exception still occurs. This proves it's NOT related to
> Expect: 100-continue.
>
>
>
> ### 5. Response Timing
>
> - Added delays before sending HTTP 200 OK
>
> - Removed all delays for immediate response
>
>
>
> **Result:** No difference.
>
>
>
> ## HTTP Response Sent by Server
>
>
>
> ```
> HTTP/1.1 200 OK
> Content-Length: 0
> Server: HELVETILINK
> Date: Tue, 03 Feb 2026 11:55:43 GMT
> Connection: close
> ```
>
> This is a valid HTTP response. OpenAS2 handles it correctly; Mendelson
> does not.
>
>
> ## Additional Observation - "Invalid Request" Messages
>
>
>
> In Mendelson's log, these mysterious messages appear at the same time as
> the exception:
>
> ```
> [7:55:44 PM] An invalid request has been detected. It has not been
> processed because it does not contain a as2-to header.
> [7:55:44 PM] An invalid request has been detected. It has not been
> processed because it does not contain a as2-to header.
> ```
>
> These appear BEFORE the async MDN arrives. We are not sending any other
> requests to Mendelson. The source is unknown and may be related to
> Mendelson's internal HTTP handling.
>
>
> ## Impact
>
>
>
> 1. **Duplicate messages:** Mendelson retries up to 10 times
>
> 2. **Cannot use async MDN with Mendelson clients**
> 3. **Operational issues with Mendelson-based trading partners**
>
> ## Conclusion
>
>
> Since OpenAS2 works perfectly and Mendelson fails with the exact same
> server configuration and HTTP response, this appears to be a **Mendelson
> HTTP client compatibility issue**, not a Camel AS2 server bug.
>
>
>
> However, given that Mendelson is a widely-used AS2 implementation, it
> would be valuable to understand:
>
> 1. What specifically in the HTTP response or connection handling triggers
> Mendelson's exception
>
> 2. Whether there's a server-side accommodation that could help Mendelson
> work correctly
>
>
>
> ## Questions for the Community
>
>
>
> 1. Has anyone else experienced `ConnectionShutdownException` with
> Mendelson + Camel AS2 + async MDN?
>
> 2. Has anyone successfully used async MDN with Mendelson and Camel AS2?
>
> 3. Is there something specific about Mendelson's HTTP client that requires
> special handling?
>
> 4. Are there known differences in how Mendelson vs OpenAS2 handle HTTP
> connections?
>
>
>
> ## Workaround
>
>
>
> Use **sync MDN** instead of async MDN when communicating with Mendelson
> clients.
>
>
>
> ---
>
> **Reported by:** Reto Peter
> **Date:** 2026-02-03



-- 
Claus Ibsen

Reply via email to