This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch sandbox/camel-3.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9c421bd1661bb8479472d21634a4d4a675f4500f Author: Duncan Doyle <duncan.do...@gmail.com> AuthorDate: Mon Dec 3 11:47:07 2018 +0100 CAMEL-12973: Init deferred to first call when WIH uses Deployment-scoped context in combination with Singleton RuntimeStrategy. Removed redundant double slash from 'direct' URL. --- .../jbpm/workitem/AbstractCamelCommand.java | 4 +- .../workitem/AbstractCamelWorkItemHandler.java | 51 +++++++--- .../CamelWorkItemHandlerIntegrationTests.java | 4 + .../DeploymentContextCamelCommandTest.java | 62 +++++------ .../workitem/GlobalContextCamelCommandTest.java | 36 ++++--- .../workitem/InOnlyCamelWorkItemHandlerTest.java | 40 ++++---- .../workitem/InOutCamelWorkItemHandlerTest.java | 113 ++++++++++++++++++--- 7 files changed, 219 insertions(+), 91 deletions(-) diff --git a/components/camel-jbpm/src/main/java/org/apache/camel/component/jbpm/workitem/AbstractCamelCommand.java b/components/camel-jbpm/src/main/java/org/apache/camel/component/jbpm/workitem/AbstractCamelCommand.java index 1900960..212dd71 100644 --- a/components/camel-jbpm/src/main/java/org/apache/camel/component/jbpm/workitem/AbstractCamelCommand.java +++ b/components/camel-jbpm/src/main/java/org/apache/camel/component/jbpm/workitem/AbstractCamelCommand.java @@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory; * The command passes the {@WorkItem} retrieved from the {@link CommandContext} to the route that has a consumer on the endpoint-id * that can be passed with the <code>camel-endpoint-id</code> {@link WorkItem} parameter. E.g. when a the value "myCamelEndpoint" is passed to the * {link WorkItem} via the <code>camel-endpoint-id</code> parameter, this {@link Command} will send the {@link WorkItem} to - * the Camel URI <code>direct://myCamelEndpoint</code>. + * the Camel URI <code>direct:myCamelEndpoint</code>. * <p/> * The body of the result {@link Message} of the invocation is returned via the <code>Response</code> parameter. Access to the raw response * {@link Message} is provided via the <code>Message</code> parameter. This gives the user access to more advanced fields like message headers @@ -55,7 +55,7 @@ public abstract class AbstractCamelCommand implements Command, Cacheable { String camelEndpointId = (String) workItem.getParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM); // We only support direct. We don't need to support more, as direct simply gives us the entrypoint into the actual Camel Routes. - String camelUri = "direct://" + camelEndpointId; + String camelUri = "direct:" + camelEndpointId; ProducerTemplate producerTemplate = getProducerTemplate(ctx); Exchange inExchange = ExchangeBuilder.anExchange(producerTemplate.getCamelContext()).withBody(workItem).build(); diff --git a/components/camel-jbpm/src/main/java/org/apache/camel/component/jbpm/workitem/AbstractCamelWorkItemHandler.java b/components/camel-jbpm/src/main/java/org/apache/camel/component/jbpm/workitem/AbstractCamelWorkItemHandler.java index d5ea7df..1361889 100644 --- a/components/camel-jbpm/src/main/java/org/apache/camel/component/jbpm/workitem/AbstractCamelWorkItemHandler.java +++ b/components/camel-jbpm/src/main/java/org/apache/camel/component/jbpm/workitem/AbstractCamelWorkItemHandler.java @@ -35,9 +35,9 @@ import org.slf4j.LoggerFactory; * Camel jBPM {@link WorkItemHandler} which allows to call Camel routes with a <code>direct</code> endpoint. * <p/> * The handler passes the {@WorkItem} to the route that has a consumer on the endpoint-id that can be passed with the - * <code>CamelEndpointId</code>{@link WorkItem} parameter. E.g. when a the value "myCamelEndpoint" is passed to the {link WorkItem} via - * the <code>CamelEndpointId</code> parameter, this command will send the {@link WorkItem} to the Camel URI - * <code>direct://myCamelEndpoint</code>. + * <code>CamelEndpointId</code>{@link WorkItem} parameter. E.g. when a the value "myCamelEndpoint" is passed to the {link WorkItem} via the + * <code>CamelEndpointId</code> parameter, this command will send the {@link WorkItem} to the Camel URI + * <code>direct:myCamelEndpoint</code>. * <p/> * The body of the result {@link Message} of the invocation is returned via the <code>Response</code> parameter. Access to the raw response * {@link Message} is provided via the <code>Message</code> parameter. This gives the user access to more advanced fields like message @@ -47,18 +47,22 @@ import org.slf4j.LoggerFactory; * to find the global KIE {@link CamelContext} from the <code>jBPM</code> {@link ServiceRegistry}. When the {@link RuntimeManager} is passed * to the constructor, the handler will retrieve and use the {@link CamelContext} bound to the {@link RuntimeManage} from the * {@link ServiceRegistry}. When a <code>CamelEndpointId</code> is passed to the constructor, the handler will send all requests to the - * Camel route that is consuming from that endpoint, unless the endpoint is overridden by passing a the <code>CamelEndpointId</code> in - * the {@link WorkItem} parameters. + * Camel route that is consuming from that endpoint, unless the endpoint is overridden by passing a the <code>CamelEndpointId</code> in the + * {@link WorkItem} parameters. * */ public abstract class AbstractCamelWorkItemHandler extends AbstractLogOrThrowWorkItemHandler implements Cacheable { private static Logger logger = LoggerFactory.getLogger(AbstractCamelWorkItemHandler.class); - private final ProducerTemplate producerTemplate; + private ProducerTemplate producerTemplate; private final String camelEndpointId; - + + private final String camelContextKey; + + private boolean initialized = false; + /** * Default Constructor. This creates a {@link ProducerTemplate} for the global {@link CamelContext}. */ @@ -67,9 +71,10 @@ public abstract class AbstractCamelWorkItemHandler extends AbstractLogOrThrowWor } public AbstractCamelWorkItemHandler(String camelEndointId) { - CamelContext globalCamelContext = (CamelContext) ServiceRegistry.get().service(JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY); - this.producerTemplate = globalCamelContext.createProducerTemplate(); this.camelEndpointId = camelEndointId; + this.camelContextKey = JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY; + this.producerTemplate = buildProducerTemplate(camelContextKey); + this.initialized = true; } /** @@ -81,18 +86,38 @@ public abstract class AbstractCamelWorkItemHandler extends AbstractLogOrThrowWor } public AbstractCamelWorkItemHandler(RuntimeManager runtimeManager, String camelEndpointId) { - String runtimeCamelContextKey = runtimeManager.getIdentifier() + JBPMConstants.DEPLOYMENT_CAMEL_CONTEXT_SERVICE_KEY_POSTFIX; - CamelContext runtimeCamelContext = (CamelContext) ServiceRegistry.get().service(runtimeCamelContextKey); - this.producerTemplate = runtimeCamelContext.createProducerTemplate(); this.camelEndpointId = camelEndpointId; + this.camelContextKey = runtimeManager.getIdentifier() + JBPMConstants.DEPLOYMENT_CAMEL_CONTEXT_SERVICE_KEY_POSTFIX; + /* + * Depending on the order of session creation and CamelContext creation and registration, the CamelContext might not yet be + * available. Hence, when we deal with a Deployment scoped CamelContext, we can lazy-init when the context is not yet available. + */ + try { + this.producerTemplate = buildProducerTemplate(camelContextKey); + this.initialized = true; + } catch (IllegalArgumentException iae) { + String message = "CamelContext with identifier '" + camelContextKey + + "' not found in ServiceRegistry. This can be caused by the order in which the platform extensions are initialized. Deferring Camel ProducerTemplate creation until the first WorkItemHandler call."; + logger.info(message, iae); + } } + private ProducerTemplate buildProducerTemplate(String key) { + CamelContext camelContext = (CamelContext) ServiceRegistry.get().service(key); + return this.producerTemplate = camelContext.createProducerTemplate(); + } + + public void executeWorkItem(WorkItem workItem, final WorkItemManager manager) { + if (!initialized) { + this.producerTemplate = buildProducerTemplate(camelContextKey); + initialized = true; + } String workItemCamelEndpointId = getCamelEndpointId(workItem); // We only support direct. We don't need to support more, as direct simply gives us the entrypoint into the actual Camel Routes. - String camelUri = "direct://" + workItemCamelEndpointId; + String camelUri = "direct:" + workItemCamelEndpointId; try { Exchange requestExchange = buildExchange(producerTemplate, workItem); diff --git a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/CamelWorkItemHandlerIntegrationTests.java b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/CamelWorkItemHandlerIntegrationTests.java index 67d54fb..a0fcee5 100644 --- a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/CamelWorkItemHandlerIntegrationTests.java +++ b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/CamelWorkItemHandlerIntegrationTests.java @@ -79,6 +79,7 @@ public class CamelWorkItemHandlerIntegrationTests extends CamelTestSupport { } finally { // Cleanup context.removeRoute(routeId); + ServiceRegistry.get().remove(JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY); } } @@ -120,6 +121,7 @@ public class CamelWorkItemHandlerIntegrationTests extends CamelTestSupport { } finally { // Cleanup context.removeRoute(routeId); + ServiceRegistry.get().remove(JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY); } } @@ -160,6 +162,7 @@ public class CamelWorkItemHandlerIntegrationTests extends CamelTestSupport { } finally { // Cleanup context.removeRoute(routeId); + ServiceRegistry.get().remove(JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY); } } @@ -198,6 +201,7 @@ public class CamelWorkItemHandlerIntegrationTests extends CamelTestSupport { } finally { // Cleanup context.removeRoute(routeId); + ServiceRegistry.get().remove(JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY); } } diff --git a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/DeploymentContextCamelCommandTest.java b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/DeploymentContextCamelCommandTest.java index b0086b9..d2d3d94 100644 --- a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/DeploymentContextCamelCommandTest.java +++ b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/DeploymentContextCamelCommandTest.java @@ -38,58 +38,62 @@ import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class DeploymentContextCamelCommandTest { - + @Mock ProducerTemplate producerTemplate; @Mock Exchange outExchange; - + @Mock Message outMessage; - + @Mock CamelContext camelContext; - + @Mock RuntimeManager runtimeManager; - + @Mock CommandContext commandContext; @Test public void testExecuteCommandDeploymentCamelContext() throws Exception { - + String camelEndpointId = "testCamelRoute"; - String camelRouteUri = "direct://" + camelEndpointId; - + String camelRouteUri = "direct:" + camelEndpointId; + String testReponse = "testResponse"; - + String deploymentId = "testDeployment"; - + when(producerTemplate.send(eq(camelRouteUri), any(Exchange.class))).thenReturn(outExchange); when(producerTemplate.getCamelContext()).thenReturn(camelContext); - + when(camelContext.createProducerTemplate()).thenReturn(producerTemplate); - + when(outExchange.getOut()).thenReturn(outMessage); when(outMessage.getBody()).thenReturn(testReponse); - - //Register the RuntimeManager bound camelcontext. - ServiceRegistry.get().register(deploymentId + JBPMConstants.DEPLOYMENT_CAMEL_CONTEXT_SERVICE_KEY_POSTFIX, camelContext); - - WorkItemImpl workItem = new WorkItemImpl(); - workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); - workItem.setParameter("Request", "someRequest"); - - when(commandContext.getData("workItem")).thenReturn(workItem); - when(commandContext.getData("deploymentId")).thenReturn(deploymentId); - - Command command = new DeploymentContextCamelCommand(); - ExecutionResults results = command.execute(commandContext); - - assertNotNull(results); - assertEquals(2, results.getData().size()); - assertEquals(testReponse, results.getData().get(JBPMConstants.RESPONSE_WI_PARAM)); + + // Register the RuntimeManager bound camelcontext. + try { + ServiceRegistry.get().register(deploymentId + JBPMConstants.DEPLOYMENT_CAMEL_CONTEXT_SERVICE_KEY_POSTFIX, camelContext); + + WorkItemImpl workItem = new WorkItemImpl(); + workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); + workItem.setParameter("Request", "someRequest"); + + when(commandContext.getData("workItem")).thenReturn(workItem); + when(commandContext.getData("deploymentId")).thenReturn(deploymentId); + + Command command = new DeploymentContextCamelCommand(); + ExecutionResults results = command.execute(commandContext); + + assertNotNull(results); + assertEquals(2, results.getData().size()); + assertEquals(testReponse, results.getData().get(JBPMConstants.RESPONSE_WI_PARAM)); + } finally { + ServiceRegistry.get().remove(deploymentId + JBPMConstants.DEPLOYMENT_CAMEL_CONTEXT_SERVICE_KEY_POSTFIX); + } } } diff --git a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/GlobalContextCamelCommandTest.java b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/GlobalContextCamelCommandTest.java index 031bc69..0d0db7c 100644 --- a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/GlobalContextCamelCommandTest.java +++ b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/GlobalContextCamelCommandTest.java @@ -44,16 +44,16 @@ public class GlobalContextCamelCommandTest { @Mock Exchange outExchange; - + @Mock Message outMessage; - + @Mock CamelContext camelContext; - + @Mock RuntimeManager runtimeManager; - + @Mock CommandContext commandContext; @@ -61,7 +61,7 @@ public class GlobalContextCamelCommandTest { public void testExecuteGlobalCommand() throws Exception { String camelEndpointId = "testCamelRoute"; - String camelRouteUri = "direct://" + camelEndpointId; + String camelRouteUri = "direct:" + camelEndpointId; String testReponse = "testResponse"; @@ -76,20 +76,24 @@ public class GlobalContextCamelCommandTest { when(outExchange.getOut()).thenReturn(outMessage); when(outMessage.getBody()).thenReturn(testReponse); - //Register the RuntimeManager bound camelContext. - ServiceRegistry.get().register(JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY, camelContext); + // Register the RuntimeManager bound camelcontext. + try { + ServiceRegistry.get().register(JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY, camelContext); - WorkItemImpl workItem = new WorkItemImpl(); - workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); - workItem.setParameter("Request", "someRequest"); + WorkItemImpl workItem = new WorkItemImpl(); + workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); + workItem.setParameter("Request", "someRequest"); - when(commandContext.getData(anyString())).thenReturn(workItem); + when(commandContext.getData(anyString())).thenReturn(workItem); - Command command = new GlobalContextCamelCommand(); - ExecutionResults results = command.execute(commandContext); + Command command = new GlobalContextCamelCommand(); + ExecutionResults results = command.execute(commandContext); - assertNotNull(results); - assertEquals(2, results.getData().size()); - assertEquals(testReponse, results.getData().get(JBPMConstants.RESPONSE_WI_PARAM)); + assertNotNull(results); + assertEquals(2, results.getData().size()); + assertEquals(testReponse, results.getData().get(JBPMConstants.RESPONSE_WI_PARAM)); + } finally { + ServiceRegistry.get().remove(JBPMConstants.GLOBAL_CAMEL_CONTEXT_SERVICE_KEY); + } } } \ No newline at end of file diff --git a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/InOnlyCamelWorkItemHandlerTest.java b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/InOnlyCamelWorkItemHandlerTest.java index b97822e..324f04c 100644 --- a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/InOnlyCamelWorkItemHandlerTest.java +++ b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/InOnlyCamelWorkItemHandlerTest.java @@ -60,7 +60,7 @@ public class InOnlyCamelWorkItemHandlerTest { public void testExecuteInOnlyLocalCamelContext() throws Exception { String camelEndpointId = "testCamelRoute"; - String camelRouteUri = "direct://" + camelEndpointId; + String camelRouteUri = "direct:" + camelEndpointId; String testReponse = "testResponse"; @@ -76,22 +76,26 @@ public class InOnlyCamelWorkItemHandlerTest { when(camelContext.getHeadersMapFactory()).thenReturn(hmf); // Register the RuntimeManager bound camelcontext. - ServiceRegistry.get().register(runtimeManagerId + "_CamelService", camelContext); - - WorkItemImpl workItem = new WorkItemImpl(); - workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); - workItem.setParameter("Request", "someRequest"); - workItem.setDeploymentId("testDeploymentId"); - workItem.setProcessInstanceId(1L); - workItem.setId(1L); - - AbstractCamelWorkItemHandler handler = new InOnlyCamelWorkItemHandler(runtimeManager); - - TestWorkItemManager manager = new TestWorkItemManager(); - handler.executeWorkItem(workItem, - manager); - assertThat(manager.getResults(), is(notNullValue())); - //InOnly does not complete WorkItem. - assertThat(manager.getResults().size(), equalTo(0)); + try { + ServiceRegistry.get().register(runtimeManagerId + "_CamelService", camelContext); + + WorkItemImpl workItem = new WorkItemImpl(); + workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); + workItem.setParameter("Request", "someRequest"); + workItem.setDeploymentId("testDeploymentId"); + workItem.setProcessInstanceId(1L); + workItem.setId(1L); + + AbstractCamelWorkItemHandler handler = new InOnlyCamelWorkItemHandler(runtimeManager); + + TestWorkItemManager manager = new TestWorkItemManager(); + handler.executeWorkItem(workItem, + manager); + assertThat(manager.getResults(), is(notNullValue())); + // InOnly does not complete WorkItem. + assertThat(manager.getResults().size(), equalTo(0)); + } finally { + ServiceRegistry.get().remove(runtimeManagerId + "_CamelService"); + } } } diff --git a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/InOutCamelWorkItemHandlerTest.java b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/InOutCamelWorkItemHandlerTest.java index 578de78..8453f09 100644 --- a/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/InOutCamelWorkItemHandlerTest.java +++ b/components/camel-jbpm/src/test/java/org/apache/camel/component/jbpm/workitem/InOutCamelWorkItemHandlerTest.java @@ -63,7 +63,7 @@ public class InOutCamelWorkItemHandlerTest { public void testExecuteInOutGlobalCamelContext() throws Exception { String camelEndpointId = "testCamelRoute"; - String camelRouteUri = "direct://" + camelEndpointId; + String camelRouteUri = "direct:" + camelEndpointId; String testReponse = "testResponse"; @@ -77,6 +77,7 @@ public class InOutCamelWorkItemHandlerTest { when(outExchange.getOut()).thenReturn(outMessage); when(outMessage.getBody()).thenReturn(testReponse); + try { ServiceRegistry.get().register("GlobalCamelService", camelContext); TestWorkItemManager manager = new TestWorkItemManager(); @@ -97,13 +98,18 @@ public class InOutCamelWorkItemHandlerTest { Map<String, Object> results = manager.getResults(workItem.getId()); assertThat(results.size(), equalTo(2)); assertThat(results.get("Response"), equalTo(testReponse)); + + } finally { + ServiceRegistry.get().remove("GlobalCamelService"); + } + } @Test public void testExecuteInOutLocalCamelContext() throws Exception { String camelEndpointId = "testCamelRoute"; - String camelRouteUri = "direct://" + camelEndpointId; + String camelRouteUri = "direct:" + camelEndpointId; String testReponse = "testResponse"; @@ -122,7 +128,94 @@ public class InOutCamelWorkItemHandlerTest { when(outMessage.getBody()).thenReturn(testReponse); // Register the RuntimeManager bound camelcontext. - ServiceRegistry.get().register(runtimeManagerId + "_CamelService", camelContext); + try { + ServiceRegistry.get().register(runtimeManagerId + "_CamelService", camelContext); + + WorkItemImpl workItem = new WorkItemImpl(); + workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); + workItem.setParameter("Request", "someRequest"); + workItem.setDeploymentId("testDeploymentId"); + workItem.setProcessInstanceId(1L); + workItem.setId(1L); + + AbstractCamelWorkItemHandler handler = new InOutCamelWorkItemHandler(runtimeManager); + + TestWorkItemManager manager = new TestWorkItemManager(); + handler.executeWorkItem(workItem, + manager); + assertThat(manager.getResults(), is(notNullValue())); + assertThat(manager.getResults().size(), equalTo(1)); + assertThat(manager.getResults().containsKey(workItem.getId()), is(true)); + + Map<String, Object> results = manager.getResults(workItem.getId()); + assertThat(results.size(), equalTo(2)); + assertThat(results.get(JBPMConstants.RESPONSE_WI_PARAM), equalTo(testReponse)); + } finally { + ServiceRegistry.get().remove(runtimeManagerId + "_CamelService"); + } + } + + @Test + public void testExecuteInOutLocalCamelContextLazyInit() throws Exception { + + String camelEndpointId = "testCamelRoute"; + String camelRouteUri = "direct:" + camelEndpointId; + + String testReponse = "testResponse"; + + String runtimeManagerId = "testRuntimeManager"; + + when(runtimeManager.getIdentifier()).thenReturn(runtimeManagerId); + + when(producerTemplate.send(eq(camelRouteUri), ArgumentMatchers.any(Exchange.class))).thenReturn(outExchange); + when(producerTemplate.getCamelContext()).thenReturn(camelContext); + + when(camelContext.createProducerTemplate()).thenReturn(producerTemplate); + HeadersMapFactory hmf = new DefaultHeadersMapFactory(); + when(camelContext.getHeadersMapFactory()).thenReturn(hmf); + + when(outExchange.getOut()).thenReturn(outMessage); + when(outMessage.getBody()).thenReturn(testReponse); + + WorkItemImpl workItem = new WorkItemImpl(); + workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); + workItem.setParameter("Request", "someRequest"); + workItem.setDeploymentId("testDeploymentId"); + workItem.setProcessInstanceId(1L); + workItem.setId(1L); + + AbstractCamelWorkItemHandler handler = new InOutCamelWorkItemHandler(runtimeManager); + + // Register the context after we've created the WIH to test lazy-init. + try { + ServiceRegistry.get().register(runtimeManagerId + "_CamelService", camelContext); + + TestWorkItemManager manager = new TestWorkItemManager(); + handler.executeWorkItem(workItem, + manager); + assertThat(manager.getResults(), is(notNullValue())); + assertThat(manager.getResults().size(), equalTo(1)); + assertThat(manager.getResults().containsKey(workItem.getId()), is(true)); + + Map<String, Object> results = manager.getResults(workItem.getId()); + assertThat(results.size(), equalTo(2)); + assertThat(results.get(JBPMConstants.RESPONSE_WI_PARAM), equalTo(testReponse)); + } finally { + ServiceRegistry.get().remove(runtimeManagerId + "_CamelService"); + } + } + + @Test(expected = IllegalArgumentException.class) + public void testExecuteInOutLocalCamelContextLazyInitFail() throws Exception { + + String camelEndpointId = "testCamelRoute"; + String camelRouteUri = "direct:" + camelEndpointId; + + String testReponse = "testResponse"; + + String runtimeManagerId = "testRuntimeManager"; + + when(runtimeManager.getIdentifier()).thenReturn(runtimeManagerId); WorkItemImpl workItem = new WorkItemImpl(); workItem.setParameter(JBPMConstants.CAMEL_ENDPOINT_ID_WI_PARAM, camelEndpointId); @@ -134,15 +227,9 @@ public class InOutCamelWorkItemHandlerTest { AbstractCamelWorkItemHandler handler = new InOutCamelWorkItemHandler(runtimeManager); TestWorkItemManager manager = new TestWorkItemManager(); - handler.executeWorkItem(workItem, - manager); - assertThat(manager.getResults(), is(notNullValue())); - assertThat(manager.getResults().size(), equalTo(1)); - assertThat(manager.getResults().containsKey(workItem.getId()), is(true)); - - Map<String, Object> results = manager.getResults(workItem.getId()); - assertThat(results.size(), equalTo(2)); - assertThat(results.get(JBPMConstants.RESPONSE_WI_PARAM), equalTo(testReponse)); + // This is expected to throw an exception. + handler.executeWorkItem(workItem, manager); + } - + }