Tried this, got exception during startup :
Caused By: org.apache.cxf.service.factory.ServiceConstructionException:
Service class my.ProgrammeService method getProgramme part {
http://my/service/programme/v0}parameters cannot be mapped to schema. Check
for use of a JAX-WS-specific type without the JAX-WS service factory bean.
at
org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.createBareMessage(ReflectionServiceFactoryBean.java:1227)
[INFO] [talledLocalContainer] at
org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:477)
[INFO] [talledLocalContainer] at
org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:712)
[INFO] [talledLocalContainer] at
org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:527)
[INFO] [talledLocalContainer] at
org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:261)
Config:
<bean id="singletonJAXBDataBinding" class="my.SingletonJAXBDataBinding"/>
<jaxws:client serviceClass="my.ProgrammeService" address="http://
${loadbalancer}/service/programme/v0">
<jaxws:dataBinding>
<ref bean="singletonJAXBDataBinding"/>
</jaxws:dataBinding>
</jaxws:client>
Presumably the jaxb context i have init'ed myself is not quite what cxf is
expecting ?
Jorg
On Wed, Oct 7, 2015 at 6:30 PM Daniel Kulp <[email protected]> wrote:
>
> > On Oct 7, 2015, at 9:42 AM, Jorg Heymans <[email protected]> wrote:
> >
> > The only thing i could easily try was option 2, but it did not make a
> > difference. We have about 6-700 entities in our schema divided over
> several
> > hundreds of packages. All of this is put in the same jaxbcontext.
> >
> > Enabling jaxb logging reveals that the context is indeed recreated for
> each
> > service (i.e. each definition of jaxws:client), and given the amount of
> > entities and packages it just adds up tremendously. For example jaxb
> seems
> > to search for jaxb.properties in every single package present in the
> > context. We see a big difference though on local deployment using fast
> > windows SSD machines and server side deployments on virtualized
> > infrastructure, on the former it is more bearable about 45 seconds.
> >
> > Also, for other application purposes i am myself already constructing the
> > jaxbcontext as a singleton. Could i not make cxf reuse that one somehow
> ? I
> > looked at JAXBContextCache but it's not so clear how i would go about
> > initializing it with an existing context.
>
> One option would be to subclass org.apache.cxf.jaxb.JAXBDataBinding and
> override the
>
> public CachedContextAndSchemas createJAXBContextAndSchemas(Set<Class<?>>
> classes,
> String
> defaultNs);
>
> method. The CachedContextAndSchemas object that is returned could be a
> singleton for your application that contains your global JAXBContext.
>
> In the spring config, you can do:
>
> <jaxws:client …..>
> <jaxws:dataBinding>
> <bean class=“org.foo.MyJAXBDataBinding”>
> ;;; inject whatever you need in here
> </bean>
> </jaxws:dataBinding>
> </jaxws:client>
>
>
>
> Dan
>
>
> >
> > Jorg
> >
> >
> >
> > On Tue, Oct 6, 2015 at 3:58 PM Daniel Kulp <[email protected]> wrote:
> >
> >>
> >>> On Oct 5, 2015, at 6:12 AM, Jorg Heymans <[email protected]>
> wrote:
> >>> It seems that jaxb context init is still the culprit. We use the
> >>> com.sun.xml.bind.v2.ContextFactory , switching for example to the
> >>> Eclipselink implementation
> >>> (org.eclipse.persistence.jaxb.JAXBContextFactory) was even slower.
> >> Spring's
> >>> lazy init is no good here, makes me wonder if cxf could do a 'true'
> lazy
> >>> init and defer this expensive init of the service until actual methods
> >> are
> >>> called on it. Feasible ?
> >>
> >> Not really, no. We need the information from the context to check to
> >> make sure the methods on the clients are even valid.
> >>
> >> It’s possible that 15 clients are creating 15 unique JAXB Contexts.
> One
> >> thing you could TRY is collect ALL the classes that are used by all 15
> >> clients and do one of:
> >>
> >> 1) Add @XmlSeeAlso annotations or similar to pull in all the classes
> >>
> >> 2) Use the “jaxb.additionalContextClasses” property to provide a list of
> >> all the classes
> >> <jaxws:properties>
> >> <entry key="jaxb.additionalContextClasses">
> >> <bean
> >> class="org.apache.cxf.systest.jaxb.util.ClassArrayFactoryBean">
> >> <property name="classNames">
> >> <list>
> >>
> >> <value>org.apache.cxf.systest.jaxb.model.ExtendedWidget</value>
> >> </list>
> >> </property>
> >> </bean>
> >> </entry>
> >> </jaxws:properties>
> >>
> >> 3) Possibly create a list of all the classes and pre-initialize via the
> >> JAXBContextCache.getCachedContextAndSchemas method. I’m not 100% sure
> >> this will work.
> >>
> >>
> >> Basically, if you can get ONE large JAXBContext serving all the clients,
> >> it might be quicker than 15 smaller. Not really sure though.
> >>
> >> Dan
> >>
> >>
> >>
> >>>
> >>> Jorg
> >>>
> >>> On Mon, Oct 5, 2015 at 10:42 AM Jorg Heymans <[email protected]>
> >> wrote:
> >>>
> >>>>
> >>>> The wsdlLocation attribute is not specified, and to be honest i have
> no
> >>>> idea if there is any remote downloading involved during startup. We
> just
> >>>> specify id and serviceClass attribute and let cxf do its thing. I will
> >>>> try to profile and report back.
> >>>>
> >>>> Jorg
> >>>>
> >>>> On Sun, Oct 4, 2015 at 5:23 PM Andrei Shakirin <[email protected]>
> >>>> wrote:
> >>>>
> >>>>> Hi,
> >>>>>
> >>>>> 2.5 to 3 minutes is quite long even for 15 clients initialization.
> >>>>> Did you specify wsdlLocation attribute in jaxws:client? Can
> performance
> >>>>> be related to remote WSDL downloading?
> >>>>> Could you bind any profiling tool and discover which operation caused
> >>>>> performance problem?
> >>>>>
> >>>>> Regards,
> >>>>> Andrei.
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: Jorg Heymans [mailto:[email protected]]
> >>>>>> Sent: Donnerstag, 1. Oktober 2015 08:45
> >>>>>> To: [email protected]
> >>>>>> Subject: ReflectionServiceFactoryBean performance
> >>>>>>
> >>>>>> Hi,
> >>>>>>
> >>>>>> We have about 15 jaxws client definitions in our application context
> >>>>> defined
> >>>>>> like this :
> >>>>>>
> >>>>>> <jaxws:client id="myService" serviceClass="my.service.Service"
> >>>>>> address="http://....."/>
> >>>>>>
> >>>>>> Initializing all of these during startup takes on average about 2.5
> to
> >>>>> 3 minutes.
> >>>>>> This is already after adding -
> >>>>>> Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true , before
> >>>>> that it
> >>>>>> was more like 5-6 minutes.
> >>>>>>
> >>>>>> Is there a way to improve this ? We are going to add more services
> as
> >>>>> the
> >>>>>> application grows, and already now this cxf init takes up more than
> >>>>> half of our
> >>>>>> deployment time.
> >>>>>>
> >>>>>> Thanks,
> >>>>>> Jorg Heymans
> >>>>>
> >>>>
> >>
> >> --
> >> Daniel Kulp
> >> [email protected] - http://dankulp.com/blog
> >> Talend Community Coder - http://coders.talend.com
> >>
> >>
>
> --
> Daniel Kulp
> [email protected] - http://dankulp.com/blog
> Talend Community Coder - http://coders.talend.com
>
>