You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by Jeroen Verhagen <je...@gmail.com> on 2009/11/12 17:34:12 UTC

Problem getting custom BC to deploy

Hi all,

I evaluating Servicemix (3.2.3) for the company I work for, I've gone
through the simple tutorial that moves files. 
Because we'll need to write a custom component I followed the tutorial for
writing a custom BC and added that to my existing tutorial project. I've got
everything to compile but when I deploy the SA with the SU for the custom BC
I get the following error:

WARN  - AutoDeploymentService          - Directory: hotdeploy: Automatic
install of
Z:\java\apache-servicemix-3.2.3\hotdeploy\tutorial-sa-1.0-SNAPSHOT.zip
failed
javax.jbi.management.DeploymentException: Failed to update Service Assembly:
tutorial-sa
        at
org.apache.servicemix.jbi.framework.AutoDeploymentService.updateServiceAssembly(AutoDeploymentService.java:368)
        at
org.apache.servicemix.jbi.framework.AutoDeploymentService.updateArchive(AutoDeploymentService.java:256)
        at
org.apache.servicemix.jbi.framework.AutoDeploymentService.monitorDirectory(AutoDeploymentService.java:667)
        at
org.apache.servicemix.jbi.framework.AutoDeploymentService.access$800(AutoDeploymentService.java:62)
        at
org.apache.servicemix.jbi.framework.AutoDeploymentService$1.run(AutoDeploymentService.java:631)
        at java.util.TimerThread.mainLoop(Timer.java:512)
        at java.util.TimerThread.run(Timer.java:462)
Caused by: java.lang.Exception: <?xml version="1.0" encoding="UTF-8"?>
<jbi-task xmlns="http://java.sun.com/xml/ns/jbi/management-message"
version="1.0">
<jbi-task-result>
<frmwk-task-result>
<frmwk-task-result-details>
<task-result-details>
<task-id>deploy</task-id>
<task-result>FAILED</task-result>
<message-type>ERROR</message-type>
</task-result-details>
</frmwk-task-result-details>
</frmwk-task-result>
<component-task-result
xmlns="http://java.sun.com/xml/ns/jbi/management-message">
        <component-name>hello-world-bc</component-name>
        <component-task-result-details>
                <task-result-details>
                        <task-id>deploy</task-id>
                        <task-result>FAILED</task-result>
                        <message-type>ERROR</message-type>
                        <task-status-msg>
<msg-loc-info>
<loc-token/>
<loc-message>No endpoints found</loc-message>
</msg-loc-info>
</task-status-msg>
                </task-result-details>
        </component-task-result-details>
</component-task-result>


The beans.xml for the custom SU contains this:

<beans xmlns:sm="http://servicemix.apache.org/config/1.0"
       xmlns:file="http://servicemix.apache.org/file/1.0"
       xmlns:tut="urn:servicemix:tutorial"
       xmlns:my="http://org.apache.servicemix.samples.helloworld.bc/1.0">
    <sm:container id="jbi" embedded="true" createMBeanServer="false">
        <sm:activationSpecs>
            <sm:activationSpec>
                <sm:component>
                    <my:component>
                        <my:endpoints>
                            <my:provider service="test:service"
endpoint="endpoint"/>
                        </my:endpoints>
                    </my:component>
                </sm:component>
            </sm:activationSpec>
        </sm:activationSpecs>
    </sm:container>
</beans>

I'm really stuck with this problem, can anybody please help me?

Thanks and regards,

Jeroen

Btw: source of my custom component:

/*
 * 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.servicemix.samples.helloworld.bc;

import java.util.List;

import javax.jbi.servicedesc.ServiceEndpoint;

import org.apache.servicemix.common.DefaultComponent;
import org.apache.servicemix.common.Endpoint;

/**
 * @org.apache.xbean.XBean element="component"
 */
public class MyComponent extends DefaultComponent {

    private MyEndpointType[] endpoints;
    
    public MyEndpointType[] getEndpoints() {
        return endpoints;
    }
    
    public void setEndpoints(MyEndpointType[] endpoints) {
        this.endpoints = endpoints;
    }

    protected List getConfiguredEndpoints() {
        return asList(getEndpoints());
    }

    protected Class[] getEndpointClasses() {
        return new Class[] {MyConsumerEndpoint.class,
MyProviderEndpoint.class};
    }

    protected Endpoint getResolvedEPR(ServiceEndpoint ep) throws Exception {
        MyProviderEndpoint endpoint = new MyProviderEndpoint(this, ep);
        // TODO: initialize endpoint here
        endpoint.activate();
        return endpoint;
    }

}

and my MyProviderEndpoint:

/*
 * 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.servicemix.samples.helloworld.bc;

import javax.jbi.management.DeploymentException;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.NormalizedMessage;
import javax.jbi.servicedesc.ServiceEndpoint;
import javax.xml.namespace.QName;
import javax.xml.transform.dom.DOMSource;

import com.sun.org.apache.xpath.internal.CachedXPathAPI;
import org.apache.servicemix.common.DefaultComponent;
import org.apache.servicemix.common.ServiceUnit;
import org.apache.servicemix.common.endpoints.ProviderEndpoint;
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
import org.w3c.dom.Node;

/**
 * @org.apache.xbean.XBean element="provider"
 */
public class MyProviderEndpoint extends ProviderEndpoint implements
MyEndpointType {

    public MyProviderEndpoint() {
    }

    public MyProviderEndpoint(ServiceUnit serviceUnit, QName service, String
endpoint) {
        super(serviceUnit, service, endpoint);
    }

    public MyProviderEndpoint(DefaultComponent component, ServiceEndpoint
endpoint) {
        super(component, endpoint);
    }

    public void validate() throws DeploymentException {
        super.validate();
    }

    protected void processInOnly(MessageExchange exchange, NormalizedMessage
in) throws Exception {
        throw new UnsupportedOperationException("Unsupported MEP: " +
exchange.getPattern());
    }

    protected void processInOut(MessageExchange exchange, NormalizedMessage
in, NormalizedMessage out) throws Exception {
        // Grab the in message
        SourceTransformer sourceTransformer = new SourceTransformer();
        DOMSource inMessageXml = (DOMSource)
sourceTransformer.toDOMSource(in);

        // Parse out the actual message content
        CachedXPathAPI xpath = new CachedXPathAPI();
        Node inMessageNode = xpath.selectSingleNode(inMessageXml.getNode(),
"/hello");
        String inMessage = inMessageNode.getTextContent();

        // Create the out message and set it
        String outMessage = "<hello>Message [" + inMessage + "] contains ["
+ inMessage.getBytes().length + "] bytes</hello>";
        out.setContent(new StringSource(outMessage));
    }

}

-- 
View this message in context: http://old.nabble.com/Problem-getting-custom-BC-to-deploy-tp26321854p26321854.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.


Re: Problem getting custom BC to deploy

Posted by Jeroen Verhagen <je...@gmail.com>.
Hi Gert,


Gert Vanthienen wrote:
> 
> 
> However, are you absolutely sure you need to write your own BC?  For a
> lot of use cases, it's also an option to write a POJO and deploy that
> in a servicemix-bean SU.  Your POJO can connect to the external
> service/protocol and send/receive JBI MessageExchanges -- the benefit
> of the POJO approach is that it's a lot easier to write and maintain.
> Have a look at
> http://servicemix.apache.org/should-i-create-my-own-jbi-components.html
> 

Your were right, servicemix-bean is the way to go. 

Thanks and regards!

Jeroen

-- 
View this message in context: http://old.nabble.com/Problem-getting-custom-BC-to-deploy-tp26321854p26335805.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.


Re: Problem getting custom BC to deploy

Posted by Gert Vanthienen <ge...@gmail.com>.
Jeroen,

The XML syntax you're using is the one for creating a lightweight
container with a static configuration of the endpoints.  If you want
to deploy a SU with your provider endpoint, the xbean.xml only needs
to contain the endpoint definition itself, something like...

<beans xmlns:sm="http://servicemix.apache.org/config/1.0"
      xmlns:file="http://servicemix.apache.org/file/1.0"
      xmlns:tut="urn:servicemix:tutorial"
      xmlns:my="http://org.apache.servicemix.samples.helloworld.bc/1.0">
  <my:provider service="test:service" endpoint="endpoint"/>
</beans>

However, are you absolutely sure you need to write your own BC?  For a
lot of use cases, it's also an option to write a POJO and deploy that
in a servicemix-bean SU.  Your POJO can connect to the external
service/protocol and send/receive JBI MessageExchanges -- the benefit
of the POJO approach is that it's a lot easier to write and maintain.
Have a look at http://servicemix.apache.org/should-i-create-my-own-jbi-components.html
for a bit of background...

Regards,

Gert Vanthienen
------------------------
Open Source SOA: http://fusesource.com
Blog: http://gertvanthienen.blogspot.com/



2009/11/12 Jeroen Verhagen <je...@gmail.com>:
>
> Hi all,
>
> I evaluating Servicemix (3.2.3) for the company I work for, I've gone
> through the simple tutorial that moves files.
> Because we'll need to write a custom component I followed the tutorial for
> writing a custom BC and added that to my existing tutorial project. I've got
> everything to compile but when I deploy the SA with the SU for the custom BC
> I get the following error:
>
> WARN  - AutoDeploymentService          - Directory: hotdeploy: Automatic
> install of
> Z:\java\apache-servicemix-3.2.3\hotdeploy\tutorial-sa-1.0-SNAPSHOT.zip
> failed
> javax.jbi.management.DeploymentException: Failed to update Service Assembly:
> tutorial-sa
>        at
> org.apache.servicemix.jbi.framework.AutoDeploymentService.updateServiceAssembly(AutoDeploymentService.java:368)
>        at
> org.apache.servicemix.jbi.framework.AutoDeploymentService.updateArchive(AutoDeploymentService.java:256)
>        at
> org.apache.servicemix.jbi.framework.AutoDeploymentService.monitorDirectory(AutoDeploymentService.java:667)
>        at
> org.apache.servicemix.jbi.framework.AutoDeploymentService.access$800(AutoDeploymentService.java:62)
>        at
> org.apache.servicemix.jbi.framework.AutoDeploymentService$1.run(AutoDeploymentService.java:631)
>        at java.util.TimerThread.mainLoop(Timer.java:512)
>        at java.util.TimerThread.run(Timer.java:462)
> Caused by: java.lang.Exception: <?xml version="1.0" encoding="UTF-8"?>
> <jbi-task xmlns="http://java.sun.com/xml/ns/jbi/management-message"
> version="1.0">
> <jbi-task-result>
> <frmwk-task-result>
> <frmwk-task-result-details>
> <task-result-details>
> <task-id>deploy</task-id>
> <task-result>FAILED</task-result>
> <message-type>ERROR</message-type>
> </task-result-details>
> </frmwk-task-result-details>
> </frmwk-task-result>
> <component-task-result
> xmlns="http://java.sun.com/xml/ns/jbi/management-message">
>        <component-name>hello-world-bc</component-name>
>        <component-task-result-details>
>                <task-result-details>
>                        <task-id>deploy</task-id>
>                        <task-result>FAILED</task-result>
>                        <message-type>ERROR</message-type>
>                        <task-status-msg>
> <msg-loc-info>
> <loc-token/>
> <loc-message>No endpoints found</loc-message>
> </msg-loc-info>
> </task-status-msg>
>                </task-result-details>
>        </component-task-result-details>
> </component-task-result>
>
>
> The beans.xml for the custom SU contains this:
>
> <beans xmlns:sm="http://servicemix.apache.org/config/1.0"
>       xmlns:file="http://servicemix.apache.org/file/1.0"
>       xmlns:tut="urn:servicemix:tutorial"
>       xmlns:my="http://org.apache.servicemix.samples.helloworld.bc/1.0">
>    <sm:container id="jbi" embedded="true" createMBeanServer="false">
>        <sm:activationSpecs>
>            <sm:activationSpec>
>                <sm:component>
>                    <my:component>
>                        <my:endpoints>
>                            <my:provider service="test:service"
> endpoint="endpoint"/>
>                        </my:endpoints>
>                    </my:component>
>                </sm:component>
>            </sm:activationSpec>
>        </sm:activationSpecs>
>    </sm:container>
> </beans>
>
> I'm really stuck with this problem, can anybody please help me?
>
> Thanks and regards,
>
> Jeroen
>
> Btw: source of my custom component:
>
> /*
>  * 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.servicemix.samples.helloworld.bc;
>
> import java.util.List;
>
> import javax.jbi.servicedesc.ServiceEndpoint;
>
> import org.apache.servicemix.common.DefaultComponent;
> import org.apache.servicemix.common.Endpoint;
>
> /**
>  * @org.apache.xbean.XBean element="component"
>  */
> public class MyComponent extends DefaultComponent {
>
>    private MyEndpointType[] endpoints;
>
>    public MyEndpointType[] getEndpoints() {
>        return endpoints;
>    }
>
>    public void setEndpoints(MyEndpointType[] endpoints) {
>        this.endpoints = endpoints;
>    }
>
>    protected List getConfiguredEndpoints() {
>        return asList(getEndpoints());
>    }
>
>    protected Class[] getEndpointClasses() {
>        return new Class[] {MyConsumerEndpoint.class,
> MyProviderEndpoint.class};
>    }
>
>    protected Endpoint getResolvedEPR(ServiceEndpoint ep) throws Exception {
>        MyProviderEndpoint endpoint = new MyProviderEndpoint(this, ep);
>        // TODO: initialize endpoint here
>        endpoint.activate();
>        return endpoint;
>    }
>
> }
>
> and my MyProviderEndpoint:
>
> /*
>  * 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.servicemix.samples.helloworld.bc;
>
> import javax.jbi.management.DeploymentException;
> import javax.jbi.messaging.MessageExchange;
> import javax.jbi.messaging.NormalizedMessage;
> import javax.jbi.servicedesc.ServiceEndpoint;
> import javax.xml.namespace.QName;
> import javax.xml.transform.dom.DOMSource;
>
> import com.sun.org.apache.xpath.internal.CachedXPathAPI;
> import org.apache.servicemix.common.DefaultComponent;
> import org.apache.servicemix.common.ServiceUnit;
> import org.apache.servicemix.common.endpoints.ProviderEndpoint;
> import org.apache.servicemix.jbi.jaxp.SourceTransformer;
> import org.apache.servicemix.jbi.jaxp.StringSource;
> import org.w3c.dom.Node;
>
> /**
>  * @org.apache.xbean.XBean element="provider"
>  */
> public class MyProviderEndpoint extends ProviderEndpoint implements
> MyEndpointType {
>
>    public MyProviderEndpoint() {
>    }
>
>    public MyProviderEndpoint(ServiceUnit serviceUnit, QName service, String
> endpoint) {
>        super(serviceUnit, service, endpoint);
>    }
>
>    public MyProviderEndpoint(DefaultComponent component, ServiceEndpoint
> endpoint) {
>        super(component, endpoint);
>    }
>
>    public void validate() throws DeploymentException {
>        super.validate();
>    }
>
>    protected void processInOnly(MessageExchange exchange, NormalizedMessage
> in) throws Exception {
>        throw new UnsupportedOperationException("Unsupported MEP: " +
> exchange.getPattern());
>    }
>
>    protected void processInOut(MessageExchange exchange, NormalizedMessage
> in, NormalizedMessage out) throws Exception {
>        // Grab the in message
>        SourceTransformer sourceTransformer = new SourceTransformer();
>        DOMSource inMessageXml = (DOMSource)
> sourceTransformer.toDOMSource(in);
>
>        // Parse out the actual message content
>        CachedXPathAPI xpath = new CachedXPathAPI();
>        Node inMessageNode = xpath.selectSingleNode(inMessageXml.getNode(),
> "/hello");
>        String inMessage = inMessageNode.getTextContent();
>
>        // Create the out message and set it
>        String outMessage = "<hello>Message [" + inMessage + "] contains ["
> + inMessage.getBytes().length + "] bytes</hello>";
>        out.setContent(new StringSource(outMessage));
>    }
>
> }
>
> --
> View this message in context: http://old.nabble.com/Problem-getting-custom-BC-to-deploy-tp26321854p26321854.html
> Sent from the ServiceMix - User mailing list archive at Nabble.com.
>
>