You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by "John D. Ament" <jo...@gmail.com> on 2013/06/29 22:38:41 UTC

Producing messages onto the next route from a webservice - best practice?

So, in my scenario, this is the best I can describe it.

I want to deploy a couple of web services to my servicemix instance.  These
will be consumed by a legacy system that already knows how to talk to these
web services.  I want to put these requests into a modified format on a JMS
queue for working and return immediately back to the client (e.g. don't
wait for the JMS listener to process these).

On the JMS side, I expect to go through a few different transforms, one
reading remote data; another converting it into a common jax-b based
structure and then finally sending that JAX-B message to another system for
processing.

That other system will send a request over when it's done indicating that
some data has to go to the first system, which I'm sure will also work fine.

Ideally, I think I want my webservice to process things normally, other
than having a producer that can put message data on to the queue.  Based on
how it's structured, I'd prefer to not have anything in the mix in front or
behind it, but could hear some arguments on why this might be best.  The
service has a single method, with the signature:

public boolean importData(int sourceId, int targetId, String sourceRepo,
String sourceRepoGroup, int dataElementId);

which simply returns true as long as the WS Is up (right now, this just
dumps a message onto a JMS queue).  I can't change the argument structure,
but perhaps it can go in a wrap object; not sure.

After some reading, I thought my best solution would be to use a producer
template, and then the wrapped version.  So I threw this into my
webservice, just to see if i could get it to log messages:

@EndpointInject(uri="log:events")
  ProducerTemplate producer;

and then in the body

producer.sendBody("Received sourceRepo as "+sourceRepo);

Which (I honestly wasn't surprised here) generated a null pointer
exception.  So I guess I can't inject this into my webservice endpoint?

Is this use case sensible?  It's probably not ideal for the ESB, but it
kind of keeps things moving in the webservice with minimal changes.

Thanks!

John

Re: Producing messages onto the next route from a webservice - best practice?

Posted by "John D. Ament" <jo...@gmail.com>.
So, I was able to make *something* work.

I ended up getting things to work using a blueprint.xml.  Not sure why it
suddenly started working, but I decided to not question lady luck.

The key was to create a bean, which I called FooHolder.  I injected a
property into this bean that referenced the CamelContext.  Then I simply
provided that object with some static methods that did the routing.  For a
prototype, it's ok, but I don't think this is the way it should work.
 Anyone who has some opinions or best practices, I am all eyes and fingers.

John


On Sun, Jun 30, 2013 at 3:38 PM, John D. Ament <jo...@gmail.com>wrote:

> for what it's worth, this is what happens when I try it on the spring
> side.  I did check, activemq is listed as an import package in the manifest
> file (this happens in both 4.5.1 and 4.5.2 snapshot).
>
> 2013-06-30 15:35:44,635 | ERROR | ExtenderThread-1 | ContextLoaderListener
>            | 82 - org.springframework.osgi.extender - 1.2.1 | Application
> context refresh failed
> (OsgiBundleXmlApplicationContext(bundle=servicemix-cxf,
> config=osgibundle:/META-INF/spring/*.xml))
> org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected
> exception parsing XML document from URL
> [bundle://182.0:0/META-INF/spring/camel-cxf.xml]; nested exception is
> java.lang.IllegalArgumentException: Could not load property editor:
> org.apache.activemq.util.BooleanEditor
>  at
> org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)[71:org.springframework.beans:3.0.7.RELEASE]
> at
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:164)[79:org.springframework.osgi.core:1.2.1]
>  at
> org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:136)[79:org.springframework.osgi.core:1.2.1]
>  at
> org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)[73:org.springframework.context:3.0.7.RELEASE]
>  at
> org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)[73:org.springframework.context:3.0.7.RELEASE]
>  at
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$800(AbstractDelegatedExecutionApplicationContext.java:69)[79:org.springframework.osgi.core:1.2.1]
>  at
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$3.run(AbstractDelegatedExecutionApplicationContext.java:269)[79:org.springframework.osgi.core:1.2.1]
>  at
> org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)[79:org.springframework.osgi.core:1.2.1]
> at
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.startRefresh(AbstractDelegatedExecutionApplicationContext.java:247)[79:org.springframework.osgi.core:1.2.1]
>  at
> org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.stageOne(DependencyWaiterApplicationContextExecutor.java:214)[82:org.springframework.osgi.extender:1.2.1]
>  at
> org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.refresh(DependencyWaiterApplicationContextExecutor.java:169)[82:org.springframework.osgi.extender:1.2.1]
>  at
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:175)[79:org.springframework.osgi.core:1.2.1]
>  at
> org.springframework.osgi.extender.internal.activator.ContextLoaderListener$2.run(ContextLoaderListener.java:716)[82:org.springframework.osgi.extender:1.2.1]
>  at java.lang.Thread.run(Thread.java:722)[:1.7.0_21]
> Caused by: java.lang.IllegalArgumentException: Could not load property
> editor: org.apache.activemq.util.BooleanEditor
>  at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.createPropertyEditor(XBeanNamespaceHandler.java:469)[84:org.apache.xbean.spring:3.11.1]
> at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.getValue(XBeanNamespaceHandler.java:444)[84:org.apache.xbean.spring:3.11.1]
>  at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.addProperty(XBeanNamespaceHandler.java:415)[84:org.apache.xbean.spring:3.11.1]
> at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.addAttributeProperty(XBeanNamespaceHandler.java:404)[84:org.apache.xbean.spring:3.11.1]
>  at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.addAttributeProperties(XBeanNamespaceHandler.java:337)[84:org.apache.xbean.spring:3.11.1]
> at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:225)[84:org.apache.xbean.spring:3.11.1]
>  at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:276)[84:org.apache.xbean.spring:3.11.1]
> at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:156)[84:org.apache.xbean.spring:3.11.1]
>  at
> org.apache.xbean.spring.context.v2.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:49)[84:org.apache.xbean.spring:3.11.1]
> at
> org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1338)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1328)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)[71:org.springframework.beans:3.0.7.RELEASE]
>  at
> org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)[71:org.springframework.beans:3.0.7.RELEASE]
>  ... 18 more
> Caused by: java.lang.ClassNotFoundException:
> org.apache.activemq.util.BooleanEditor not found from bundle
> [servicemix-cxf]
> at
> org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:103)[79:org.springframework.osgi.core:1.2.1]
>  at
> org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)[79:org.springframework.osgi.core:1.2.1]
> at java.lang.ClassLoader.loadClass(ClassLoader.java:356)[:1.7.0_21]
>  at
> org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.createPropertyEditor(XBeanNamespaceHandler.java:467)[84:org.apache.xbean.spring:3.11.1]
> ... 32 more
> Caused by: java.lang.ClassNotFoundException:
> org.apache.activemq.util.BooleanEditor not found by servicemix-cxf [182]
> at
> org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)[org.apache.felix.framework-3.2.2.jar:]
>  at
> org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)[org.apache.felix.framework-3.2.2.jar:]
> at
> org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)[org.apache.felix.framework-3.2.2.jar:]
>  at java.lang.ClassLoader.loadClass(ClassLoader.java:356)[:1.7.0_21]
> at
> org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:670)[org.apache.felix.framework-3.2.2.jar:]
>  at
> org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1654)[org.apache.felix.framework-3.2.2.jar:]
> at
> org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:909)[org.apache.felix.framework-3.2.2.jar:]
>  at
> org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)[79:org.springframework.osgi.core:1.2.1]
> ... 35 more
>
>
> On Sat, Jun 29, 2013 at 8:10 PM, John D. Ament <jo...@gmail.com>wrote:
>
>> So, I'll start by responding to my own email :-)
>>
>> After digging through some examples this afternoon, I did find one where
>> if the result is a static piece of text back to the client based on the web
>> service being called.  So I started playing with that to see if I could get
>> activemq working in it.
>>
>> The problem I seem to have is around osgi class loading.  I created a
>> sample project up on github to see what I've done
>> https://github.com/johnament/servicemix-cxf
>>
>> Right now there are two directories, META-INF Is where the spring config
>> is located, OSGI-INF for the blueprint files.
>>
>> I am essentially trying to get a listener on the cxf runtime, but when I
>> try running it I get an error:
>>
>> used by: org.apache.camel.NoSuchBeanException: Found bean: orderEndpoint
>> in BlueprintContainer:
>> org.apache.aries.blueprint.container.BlueprintContainerImpl@6b6c1329 of
>> type: org.apache.cxf.jaxws.EndpointImpl expected type was: class
>> org.apache.camel.component.cxf.CxfEndpoint
>>  at
>> org.apache.camel.blueprint.BlueprintContainerRegistry.lookup(BlueprintContainerRegistry.java:62)[99:org.apache.camel.camel-blueprint:2.10.4]
>> at
>> org.apache.camel.impl.CompositeRegistry.lookup(CompositeRegistry.java:49)[96:org.apache.camel.camel-core:2.10.4]
>>  at
>> org.apache.camel.impl.PropertyPlaceholderDelegateRegistry.lookup(PropertyPlaceholderDelegateRegistry.java:62)[96:org.apache.camel.camel-core:2.10.4]
>> at
>> org.apache.camel.util.CamelContextHelper.lookup(CamelContextHelper.java:108)[96:org.apache.camel.camel-core:2.10.4]
>>  at
>> org.apache.camel.util.CamelContextHelper.mandatoryLookup(CamelContextHelper.java:128)[96:org.apache.camel.camel-core:2.10.4]
>> at
>> org.apache.camel.component.cxf.CxfComponent.createEndpoint(CxfComponent.java:70)[172:org.apache.camel.camel-cxf:2.10.4]
>>  at
>> org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:91)[96:org.apache.camel.camel-core:2.10.4]
>> at
>> org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:461)[96:org.apache.camel.camel-core:2.10.4]
>>  ... 36 more
>> Caused by: java.lang.ClassCastException: Cannot cast
>> org.apache.cxf.jaxws.EndpointImpl to
>> org.apache.camel.component.cxf.CxfEndpoint
>> at java.lang.Class.cast(Class.java:3014)[:1.7.0_21]
>>  at
>> org.apache.camel.blueprint.BlueprintContainerRegistry.lookup(BlueprintContainerRegistry.java:58)[99:org.apache.camel.camel-blueprint:2.10.4]
>>
>> Any idea how I'm supposed to structure my xml to get a CXFendpoint?
>>
>> John
>>
>>
>> On Sat, Jun 29, 2013 at 4:38 PM, John D. Ament <jo...@gmail.com>wrote:
>>
>>> So, in my scenario, this is the best I can describe it.
>>>
>>> I want to deploy a couple of web services to my servicemix instance.
>>>  These will be consumed by a legacy system that already knows how to talk
>>> to these web services.  I want to put these requests into a modified format
>>> on a JMS queue for working and return immediately back to the client (e.g.
>>> don't wait for the JMS listener to process these).
>>>
>>> On the JMS side, I expect to go through a few different transforms, one
>>> reading remote data; another converting it into a common jax-b based
>>> structure and then finally sending that JAX-B message to another system for
>>> processing.
>>>
>>> That other system will send a request over when it's done indicating
>>> that some data has to go to the first system, which I'm sure will also work
>>> fine.
>>>
>>> Ideally, I think I want my webservice to process things normally, other
>>> than having a producer that can put message data on to the queue.  Based on
>>> how it's structured, I'd prefer to not have anything in the mix in front or
>>> behind it, but could hear some arguments on why this might be best.  The
>>> service has a single method, with the signature:
>>>
>>> public boolean importData(int sourceId, int targetId, String sourceRepo,
>>> String sourceRepoGroup, int dataElementId);
>>>
>>> which simply returns true as long as the WS Is up (right now, this just
>>> dumps a message onto a JMS queue).  I can't change the argument structure,
>>> but perhaps it can go in a wrap object; not sure.
>>>
>>> After some reading, I thought my best solution would be to use a
>>> producer template, and then the wrapped version.  So I threw this into my
>>> webservice, just to see if i could get it to log messages:
>>>
>>> @EndpointInject(uri="log:events")
>>>   ProducerTemplate producer;
>>>
>>> and then in the body
>>>
>>> producer.sendBody("Received sourceRepo as "+sourceRepo);
>>>
>>> Which (I honestly wasn't surprised here) generated a null pointer
>>> exception.  So I guess I can't inject this into my webservice endpoint?
>>>
>>> Is this use case sensible?  It's probably not ideal for the ESB, but it
>>> kind of keeps things moving in the webservice with minimal changes.
>>>
>>> Thanks!
>>>
>>> John
>>>
>>
>>
>

Re: Producing messages onto the next route from a webservice - best practice?

Posted by "John D. Ament" <jo...@gmail.com>.
for what it's worth, this is what happens when I try it on the spring side.
 I did check, activemq is listed as an import package in the manifest file
(this happens in both 4.5.1 and 4.5.2 snapshot).

2013-06-30 15:35:44,635 | ERROR | ExtenderThread-1 | ContextLoaderListener
           | 82 - org.springframework.osgi.extender - 1.2.1 | Application
context refresh failed
(OsgiBundleXmlApplicationContext(bundle=servicemix-cxf,
config=osgibundle:/META-INF/spring/*.xml))
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected
exception parsing XML document from URL
[bundle://182.0:0/META-INF/spring/camel-cxf.xml]; nested exception is
java.lang.IllegalArgumentException: Could not load property editor:
org.apache.activemq.util.BooleanEditor
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:164)[79:org.springframework.osgi.core:1.2.1]
at
org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:136)[79:org.springframework.osgi.core:1.2.1]
at
org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)[73:org.springframework.context:3.0.7.RELEASE]
at
org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)[73:org.springframework.context:3.0.7.RELEASE]
at
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$800(AbstractDelegatedExecutionApplicationContext.java:69)[79:org.springframework.osgi.core:1.2.1]
at
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$3.run(AbstractDelegatedExecutionApplicationContext.java:269)[79:org.springframework.osgi.core:1.2.1]
at
org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)[79:org.springframework.osgi.core:1.2.1]
at
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.startRefresh(AbstractDelegatedExecutionApplicationContext.java:247)[79:org.springframework.osgi.core:1.2.1]
at
org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.stageOne(DependencyWaiterApplicationContextExecutor.java:214)[82:org.springframework.osgi.extender:1.2.1]
at
org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.refresh(DependencyWaiterApplicationContextExecutor.java:169)[82:org.springframework.osgi.extender:1.2.1]
at
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:175)[79:org.springframework.osgi.core:1.2.1]
at
org.springframework.osgi.extender.internal.activator.ContextLoaderListener$2.run(ContextLoaderListener.java:716)[82:org.springframework.osgi.extender:1.2.1]
at java.lang.Thread.run(Thread.java:722)[:1.7.0_21]
Caused by: java.lang.IllegalArgumentException: Could not load property
editor: org.apache.activemq.util.BooleanEditor
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.createPropertyEditor(XBeanNamespaceHandler.java:469)[84:org.apache.xbean.spring:3.11.1]
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.getValue(XBeanNamespaceHandler.java:444)[84:org.apache.xbean.spring:3.11.1]
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.addProperty(XBeanNamespaceHandler.java:415)[84:org.apache.xbean.spring:3.11.1]
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.addAttributeProperty(XBeanNamespaceHandler.java:404)[84:org.apache.xbean.spring:3.11.1]
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.addAttributeProperties(XBeanNamespaceHandler.java:337)[84:org.apache.xbean.spring:3.11.1]
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:225)[84:org.apache.xbean.spring:3.11.1]
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:276)[84:org.apache.xbean.spring:3.11.1]
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:156)[84:org.apache.xbean.spring:3.11.1]
at
org.apache.xbean.spring.context.v2.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:49)[84:org.apache.xbean.spring:3.11.1]
at
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1338)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1328)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)[71:org.springframework.beans:3.0.7.RELEASE]
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)[71:org.springframework.beans:3.0.7.RELEASE]
... 18 more
Caused by: java.lang.ClassNotFoundException:
org.apache.activemq.util.BooleanEditor not found from bundle
[servicemix-cxf]
at
org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:103)[79:org.springframework.osgi.core:1.2.1]
at
org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)[79:org.springframework.osgi.core:1.2.1]
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)[:1.7.0_21]
at
org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.createPropertyEditor(XBeanNamespaceHandler.java:467)[84:org.apache.xbean.spring:3.11.1]
... 32 more
Caused by: java.lang.ClassNotFoundException:
org.apache.activemq.util.BooleanEditor not found by servicemix-cxf [182]
at
org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)[org.apache.felix.framework-3.2.2.jar:]
at
org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)[org.apache.felix.framework-3.2.2.jar:]
at
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)[org.apache.felix.framework-3.2.2.jar:]
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)[:1.7.0_21]
at
org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:670)[org.apache.felix.framework-3.2.2.jar:]
at
org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1654)[org.apache.felix.framework-3.2.2.jar:]
at
org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:909)[org.apache.felix.framework-3.2.2.jar:]
at
org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)[79:org.springframework.osgi.core:1.2.1]
... 35 more


On Sat, Jun 29, 2013 at 8:10 PM, John D. Ament <jo...@gmail.com>wrote:

> So, I'll start by responding to my own email :-)
>
> After digging through some examples this afternoon, I did find one where
> if the result is a static piece of text back to the client based on the web
> service being called.  So I started playing with that to see if I could get
> activemq working in it.
>
> The problem I seem to have is around osgi class loading.  I created a
> sample project up on github to see what I've done
> https://github.com/johnament/servicemix-cxf
>
> Right now there are two directories, META-INF Is where the spring config
> is located, OSGI-INF for the blueprint files.
>
> I am essentially trying to get a listener on the cxf runtime, but when I
> try running it I get an error:
>
> used by: org.apache.camel.NoSuchBeanException: Found bean: orderEndpoint
> in BlueprintContainer:
> org.apache.aries.blueprint.container.BlueprintContainerImpl@6b6c1329 of
> type: org.apache.cxf.jaxws.EndpointImpl expected type was: class
> org.apache.camel.component.cxf.CxfEndpoint
>  at
> org.apache.camel.blueprint.BlueprintContainerRegistry.lookup(BlueprintContainerRegistry.java:62)[99:org.apache.camel.camel-blueprint:2.10.4]
> at
> org.apache.camel.impl.CompositeRegistry.lookup(CompositeRegistry.java:49)[96:org.apache.camel.camel-core:2.10.4]
>  at
> org.apache.camel.impl.PropertyPlaceholderDelegateRegistry.lookup(PropertyPlaceholderDelegateRegistry.java:62)[96:org.apache.camel.camel-core:2.10.4]
> at
> org.apache.camel.util.CamelContextHelper.lookup(CamelContextHelper.java:108)[96:org.apache.camel.camel-core:2.10.4]
>  at
> org.apache.camel.util.CamelContextHelper.mandatoryLookup(CamelContextHelper.java:128)[96:org.apache.camel.camel-core:2.10.4]
> at
> org.apache.camel.component.cxf.CxfComponent.createEndpoint(CxfComponent.java:70)[172:org.apache.camel.camel-cxf:2.10.4]
>  at
> org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:91)[96:org.apache.camel.camel-core:2.10.4]
> at
> org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:461)[96:org.apache.camel.camel-core:2.10.4]
>  ... 36 more
> Caused by: java.lang.ClassCastException: Cannot cast
> org.apache.cxf.jaxws.EndpointImpl to
> org.apache.camel.component.cxf.CxfEndpoint
> at java.lang.Class.cast(Class.java:3014)[:1.7.0_21]
>  at
> org.apache.camel.blueprint.BlueprintContainerRegistry.lookup(BlueprintContainerRegistry.java:58)[99:org.apache.camel.camel-blueprint:2.10.4]
>
> Any idea how I'm supposed to structure my xml to get a CXFendpoint?
>
> John
>
>
> On Sat, Jun 29, 2013 at 4:38 PM, John D. Ament <jo...@gmail.com>wrote:
>
>> So, in my scenario, this is the best I can describe it.
>>
>> I want to deploy a couple of web services to my servicemix instance.
>>  These will be consumed by a legacy system that already knows how to talk
>> to these web services.  I want to put these requests into a modified format
>> on a JMS queue for working and return immediately back to the client (e.g.
>> don't wait for the JMS listener to process these).
>>
>> On the JMS side, I expect to go through a few different transforms, one
>> reading remote data; another converting it into a common jax-b based
>> structure and then finally sending that JAX-B message to another system for
>> processing.
>>
>> That other system will send a request over when it's done indicating that
>> some data has to go to the first system, which I'm sure will also work fine.
>>
>> Ideally, I think I want my webservice to process things normally, other
>> than having a producer that can put message data on to the queue.  Based on
>> how it's structured, I'd prefer to not have anything in the mix in front or
>> behind it, but could hear some arguments on why this might be best.  The
>> service has a single method, with the signature:
>>
>> public boolean importData(int sourceId, int targetId, String sourceRepo,
>> String sourceRepoGroup, int dataElementId);
>>
>> which simply returns true as long as the WS Is up (right now, this just
>> dumps a message onto a JMS queue).  I can't change the argument structure,
>> but perhaps it can go in a wrap object; not sure.
>>
>> After some reading, I thought my best solution would be to use a producer
>> template, and then the wrapped version.  So I threw this into my
>> webservice, just to see if i could get it to log messages:
>>
>> @EndpointInject(uri="log:events")
>>   ProducerTemplate producer;
>>
>> and then in the body
>>
>> producer.sendBody("Received sourceRepo as "+sourceRepo);
>>
>> Which (I honestly wasn't surprised here) generated a null pointer
>> exception.  So I guess I can't inject this into my webservice endpoint?
>>
>> Is this use case sensible?  It's probably not ideal for the ESB, but it
>> kind of keeps things moving in the webservice with minimal changes.
>>
>> Thanks!
>>
>> John
>>
>
>

Re: Producing messages onto the next route from a webservice - best practice?

Posted by "John D. Ament" <jo...@gmail.com>.
So, I'll start by responding to my own email :-)

After digging through some examples this afternoon, I did find one where if
the result is a static piece of text back to the client based on the web
service being called.  So I started playing with that to see if I could get
activemq working in it.

The problem I seem to have is around osgi class loading.  I created a
sample project up on github to see what I've done
https://github.com/johnament/servicemix-cxf

Right now there are two directories, META-INF Is where the spring config is
located, OSGI-INF for the blueprint files.

I am essentially trying to get a listener on the cxf runtime, but when I
try running it I get an error:

used by: org.apache.camel.NoSuchBeanException: Found bean: orderEndpoint in
BlueprintContainer:
org.apache.aries.blueprint.container.BlueprintContainerImpl@6b6c1329 of
type: org.apache.cxf.jaxws.EndpointImpl expected type was: class
org.apache.camel.component.cxf.CxfEndpoint
at
org.apache.camel.blueprint.BlueprintContainerRegistry.lookup(BlueprintContainerRegistry.java:62)[99:org.apache.camel.camel-blueprint:2.10.4]
at
org.apache.camel.impl.CompositeRegistry.lookup(CompositeRegistry.java:49)[96:org.apache.camel.camel-core:2.10.4]
at
org.apache.camel.impl.PropertyPlaceholderDelegateRegistry.lookup(PropertyPlaceholderDelegateRegistry.java:62)[96:org.apache.camel.camel-core:2.10.4]
at
org.apache.camel.util.CamelContextHelper.lookup(CamelContextHelper.java:108)[96:org.apache.camel.camel-core:2.10.4]
at
org.apache.camel.util.CamelContextHelper.mandatoryLookup(CamelContextHelper.java:128)[96:org.apache.camel.camel-core:2.10.4]
at
org.apache.camel.component.cxf.CxfComponent.createEndpoint(CxfComponent.java:70)[172:org.apache.camel.camel-cxf:2.10.4]
at
org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:91)[96:org.apache.camel.camel-core:2.10.4]
at
org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:461)[96:org.apache.camel.camel-core:2.10.4]
... 36 more
Caused by: java.lang.ClassCastException: Cannot cast
org.apache.cxf.jaxws.EndpointImpl to
org.apache.camel.component.cxf.CxfEndpoint
at java.lang.Class.cast(Class.java:3014)[:1.7.0_21]
at
org.apache.camel.blueprint.BlueprintContainerRegistry.lookup(BlueprintContainerRegistry.java:58)[99:org.apache.camel.camel-blueprint:2.10.4]

Any idea how I'm supposed to structure my xml to get a CXFendpoint?

John


On Sat, Jun 29, 2013 at 4:38 PM, John D. Ament <jo...@gmail.com>wrote:

> So, in my scenario, this is the best I can describe it.
>
> I want to deploy a couple of web services to my servicemix instance.
>  These will be consumed by a legacy system that already knows how to talk
> to these web services.  I want to put these requests into a modified format
> on a JMS queue for working and return immediately back to the client (e.g.
> don't wait for the JMS listener to process these).
>
> On the JMS side, I expect to go through a few different transforms, one
> reading remote data; another converting it into a common jax-b based
> structure and then finally sending that JAX-B message to another system for
> processing.
>
> That other system will send a request over when it's done indicating that
> some data has to go to the first system, which I'm sure will also work fine.
>
> Ideally, I think I want my webservice to process things normally, other
> than having a producer that can put message data on to the queue.  Based on
> how it's structured, I'd prefer to not have anything in the mix in front or
> behind it, but could hear some arguments on why this might be best.  The
> service has a single method, with the signature:
>
> public boolean importData(int sourceId, int targetId, String sourceRepo,
> String sourceRepoGroup, int dataElementId);
>
> which simply returns true as long as the WS Is up (right now, this just
> dumps a message onto a JMS queue).  I can't change the argument structure,
> but perhaps it can go in a wrap object; not sure.
>
> After some reading, I thought my best solution would be to use a producer
> template, and then the wrapped version.  So I threw this into my
> webservice, just to see if i could get it to log messages:
>
> @EndpointInject(uri="log:events")
>   ProducerTemplate producer;
>
> and then in the body
>
> producer.sendBody("Received sourceRepo as "+sourceRepo);
>
> Which (I honestly wasn't surprised here) generated a null pointer
> exception.  So I guess I can't inject this into my webservice endpoint?
>
> Is this use case sensible?  It's probably not ideal for the ESB, but it
> kind of keeps things moving in the webservice with minimal changes.
>
> Thanks!
>
> John
>