CAMEL-7855: Fixed resuming JMS consumer to work if the route has never been initialized before.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/5c331211 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/5c331211 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/5c331211 Branch: refs/remotes/origin/camel-2.13.x Commit: 5c331211e22691eb3c3fe74746a90542b9a1326d Parents: b840c4d Author: Claus Ibsen <davscl...@apache.org> Authored: Sat Sep 27 13:55:53 2014 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sat Sep 27 14:15:48 2014 +0200 ---------------------------------------------------------------------- .../apache/camel/component/jms/JmsConsumer.java | 9 +- .../jms/issues/JmsLifecycleIssueTest.java | 93 ++++++++++++++++++++ 2 files changed, 100 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/5c331211/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java ---------------------------------------------------------------------- diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java index 87f39fa..5d66555 100644 --- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java +++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java @@ -230,8 +230,13 @@ public class JmsConsumer extends DefaultConsumer implements SuspendableService { @Override protected void doResume() throws Exception { - if (listenerContainer != null) { - startListenerContainer(); + // we may not have been started before, and now the end user calls resume, so lets handle that and start it first + if (!initialized) { + doStart(); + } else { + if (listenerContainer != null) { + startListenerContainer(); + } } } http://git-wip-us.apache.org/repos/asf/camel/blob/5c331211/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsLifecycleIssueTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsLifecycleIssueTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsLifecycleIssueTest.java new file mode 100644 index 0000000..32fb137 --- /dev/null +++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsLifecycleIssueTest.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jms.issues; + +import javax.jms.ConnectionFactory; + +import org.apache.camel.CamelContext; +import org.apache.camel.ServiceStatus; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.jms.CamelJmsTestHelper; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.Test; + +import static org.apache.camel.ServiceStatus.Started; +import static org.apache.camel.ServiceStatus.Stopped; +import static org.apache.camel.component.jms.JmsComponent.jmsComponentAutoAcknowledge; + +public class JmsLifecycleIssueTest extends CamelTestSupport { + + public static final String ROUTE_ID = "simpleRoute"; + public static final String ENDPOINT_URI = "activemq:processOrder"; + + @Test + public void routeThatIsStoppedAndThenResumedAcceptsMessage() throws Exception { + assertThatRouteIs(Stopped); + + context.resumeRoute(ROUTE_ID); + + assertRouteWorks(); + } + + @Test + public void routeThatIsStoppedSuspendedAndThenResumedAcceptsMessage() throws Exception { + assertThatRouteIs(Stopped); + + context.suspendRoute(ROUTE_ID); + context.resumeRoute(ROUTE_ID); + + assertRouteWorks(); + } + + private void assertThatRouteIs(ServiceStatus expectedStatus) { + assertEquals(expectedStatus, context.getRouteStatus(ROUTE_ID)); + } + + private void assertRouteWorks() throws Exception { + assertThatRouteIs(Started); + + getMockEndpoint("mock:result").expectedBodiesReceived("anything"); + + template.sendBody(ENDPOINT_URI, "anything"); + + assertMockEndpointsSatisfied(); + } + + protected CamelContext createCamelContext() throws Exception { + CamelContext camelContext = super.createCamelContext(); + ConnectionFactory connectionFactory = CamelJmsTestHelper.createConnectionFactory(); + camelContext.addComponent("activemq", jmsComponentAutoAcknowledge(connectionFactory)); + return camelContext; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from(ENDPOINT_URI).routeId(ROUTE_ID).autoStartup(false) + .to("log:input") + .to("mock:result"); + } + }); + } + }; + } +}