Hi You also created a JIRA. https://issues.apache.org/jira/browse/CAMEL-22147
On Thu, Jun 5, 2025 at 2:03 PM Esmaeili, Soheila <soheila.esmae...@sap.com.invalid> wrote: > Hello Camel community, > > I'm encountering a StackOverflowError when running a Camel test that > worked perfectly fine with* the older (unmaintained – 2.x) Camel version*. > However, after migrating to Camel 3.14 and Camel 4.8, the same test fails: > > > > - In *(**unmaintained**)* *Camel 3.14.7 *the process hangs for a long > time with the following error message and finally terminates with a > *StackOverflowError*. > > *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with > message transform method call failed at > s\src\java.instrument\share\native\libinstrument\JPLISAgent.c line: 876 > > - In *Camel 4.8*, the test is terminated more quickly, but with the > same error. > > Here is a simplified test setup for reference: > > The route uses a loop of 2000 iterations. Each iteration calls a subroute > which is marked as transacted and contains a split step using XPath. > > > > public class JdbcLoopSplitterTransactedTest extends CamelTestSupport { > > private static final String *DSNAME *= "ds"; > private static EmbeddedDataSource *ds*; > private static PlatformTransactionManager *txManager*; > private static SpringTransactionPolicy *txPolicy*; > > private final String xmlBody = "<messages>" + > "<message><name>John</name></message>" + > "<message><name>Jane</name></message>" + > "<message><name>Jim</name></message>" + > "<message><name>Jack</name></message>" + > "<message><name>Jill</name></message>" + > "</messages>"; > > @Override > protected void bindToRegistry(Registry registry) throws Exception { > > *ds *= Derby.*init*(*DSNAME*); > > *txManager *= new DataSourceTransactionManager(*ds*); > > TransactionTemplate txTemplate = new TransactionTemplate(*txManager*); > txTemplate.setPropagationBehaviorName("PROPAGATION_REQUIRED"); > txTemplate.setIsolationLevelName("ISOLATION_READ_COMMITTED"); > txTemplate.setTimeout(1800); > > *txPolicy *= new SpringTransactionPolicy(); > *txPolicy*.setTransactionManager(*txManager*); > *txPolicy*.setTransactionTemplate(txTemplate); > > registry.bind("txPolicy", *txPolicy*); > } > > @AfterAll > public static void tearDownOnce() { > Derby.*close*(*DSNAME*); > } > > > @Test > public void testIfLoopCompleted() throws Exception { > > MockEndpoint mock = getMockEndpoint("mock:out"); > mock.expectedMessageCount(1); > > template.sendBody("direct:start", ""); > > *assertIsSatisfied*(context); > > } > > @Override > protected RouteBuilder createRouteBuilder() { > return new RouteBuilder() { > @Override > public void configure() { > from("direct:start") > .loop(2000) > .process(e -> > System.*out*.println(e.getIn().getExchange().getProperty("CamelLoopIndex"))) > .setBody(simple(xmlBody)) > .to("direct:subroute") > .end() > .process(e -> System.*out*.println("completed > successfully " + e.getExchangeId())) > .to("mock:out"); > > from("direct:subroute") > .transacted("txPolicy") > .split(xpath("/messages/message")) > .streaming() > .stopOnException() > .process(e -> System.*out*.println("body === " + > e.getIn().getBody(String.class))) > .end(); > > } > }; > } > > private static class Derby { > > public static EmbeddedDataSource init(String db) { > *deleteDatabaseFiles*(db); > EmbeddedDataSource ds = new EmbeddedDataSource(); > ds.setDataSourceName(db); > ds.setDatabaseName(db); > ds.setConnectionAttributes("create=true"); > return ds; > } > > public static void close(String dbName) { > // unload the driver > try { > DriverManager.*getConnection*("jdbc:derby:;shutdown=true"); > } catch (SQLException e) { > // it was worth a try... > } > *deleteDatabaseFiles*(dbName); > } > > private static void deleteDatabaseFiles(String dbName) { > File root = null; > File log = null; > log = new File("derby.log"); > root = new File(dbName); > if (log.exists()) { > log.delete(); > } > if (root.exists()) { > *recursiveDelete*(root); > } > > } > > private static void recursiveDelete(File dir) { > for (File f : dir.listFiles()) { > if (f.isDirectory()) { > *recursiveDelete*(f); > } else { > f.delete(); > } > } > dir.delete(); > } > } > } > > > > The issue seems to be related to transaction boundaries and route > recursion or resource handling in Camel 3+. There is no explicit recursion > in the route, but internally Camel may be building a deep call stack due to > how it handles loop combined with transacted and splitter. The > StackOverflowError may indicate that each loop iteration adds to the call > stack without releasing previous frames. > > Could you please confirm if this is a known issue or if there are specific > configurations needed in newer Camel versions to achieve the expected > behavior? Any guidance or suggestions would be highly appreciated. > > Thank you for your support, and I look forward to hearing from you. > > Best Regards, > > > > *Soheila Esmaeili* > > Pronouns: She > > Senior Developer, TI SAP CP INT CPI (SE) > > *SAP SE *Dietmar-Hopp-Allee 16, 69190 Walldorf, Germany > > *E: *.soheila.esmae...@sap.com > > *T: *+49 6227 7-46596 <%20%20+49%206227%207-67287> > > > > > > > > > > Pflichtangaben/Mandatory Disclosure Statement: www.sap.com/impressum > > Diese E-Mail kann Betriebs- oder Geschäftsgeheimnisse oder sonstige > vertrauliche Informationen enthalten. Sollten Sie diese E-Mail irrtümlich > erhalten haben, ist Ihnen eine Kenntnisnahme des Inhalts, eine > Vervielfältigung oder Weitergabe der E-Mail ausdrücklich untersagt. Bitte > benachrichtigen Sie uns und vernichten Sie die empfangene E-Mail. Vielen > Dank. > > This e-mail may contain trade secrets or privileged, undisclosed, or > otherwise confidential information. If you have received this e-mail in > error, you are hereby notified that any review, copying, or distribution of > it is strictly prohibited. Please inform us immediately and destroy the > original transmittal. Thank you for your cooperation. > > > > > > > > > -- Claus Ibsen