当前位置: 首页 > 知识库问答 >
问题:

如何显式定义Apache Camel CXF使用者和生产者

董弘新
2023-03-14

我试图建立以下路线。

从(“servlet://proxy?matchonuriprefix=true”).到(“cxf://incent?wsdlurl=wsdl/orderinfoservice.wsdl&dataformat=message”);

`from("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE").to("file:/META-INF/data/test.xml");`

实际上,我希望用Servlet组件接收请求,做一些事情(处理器、转换等,但为了简单起见,我在这里排除了),将其重定向到我的WebService实现,然后文件组件将文件的内容返回到WebService。

如果作为第一个配置进行配置,servlet组件接收请求,路由到cxf:consumer,然后启动对cxf:producer的TCP调用,该调用在'from(“cxf://incident?wsdlurl=wsdl/orderinfoservice.wsdl&dataformat=message”)'中定义。

有办法实现我想要的吗?除了使用'from'、'to'之外,我还可以定义CXF使用者或提供者吗?

有趣的是,我用ServiceMix/Fuse做了类似的事情。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:osgiRouter="http://osgi.salgar.org/osgirouter"
    xmlns:http="http://servicemix.apache.org/http/1.0"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://servicemix.apache.org/http/1.0 http://servicemix.apache.org/http/1.0/servicemix-http.xsd">

    <http:consumer service="http:FindOrders" endpoint="httpEndpoint" locationURI="http://localhost:8088/MockB2BService"
        defaultMep="http://www.w3.org/2004/08/wsdl/in-out" targetService="osgiRouter:mediation"  />

    <bean class="org.apache.servicemix.common.osgi.EndpointExporter" />
</beans>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eip="http://servicemix.apache.org/eip/1.0"
    xmlns:osgiRouter="http://osgi.salgar.org/osgirouter"
    xmlns:orderProvider_v1="http://v1.salgar.org/B2BService"
    xmlns:orderProvider_v2="http://v2.salgar.org/B2BService"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://servicemix.apache.org/eip/1.0 http://servicemix.apache.org/eip/1.0/servicemix-eip.xsd">

    <eip:content-based-router endpoint="osgiRouterMediation"
        service="osgiRouter:mediation">
        <eip:rules>
            <eip:routing-rule>
                <eip:predicate>
                    <eip:xpath-predicate id="wsdl_version_predicate_v1"
                        xpath="(//namespace::*[.='http://v1.salgar.org/B2BService']) = 'http://v1.salgar.org/B2BService'" />
                </eip:predicate>
                <eip:target>
                    <eip:exchange-target service="orderProvider_v1:findOrders" />
                </eip:target>
            </eip:routing-rule>
            <eip:routing-rule>
                <eip:predicate>
                    <eip:xpath-predicate id="wsdl_version_predicate_v2"
                        xpath="(//namespace::*[.='http://v2.salgar.org/B2BService']) = 'http://v2.salgar.org/B2BService'" />
                </eip:predicate>
                <eip:target>
                    <eip:exchange-target service="orderProvider_v2:findOrders" />
                </eip:target>
            </eip:routing-rule>
        </eip:rules>
    </eip:content-based-router>

    <bean class="org.apache.servicemix.common.osgi.EndpointExporter" />
</beans>




<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0"
    xmlns:orderProvider_v1="http://v1.salgar.org/B2BService"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://servicemix.apache.org/cxfbc/1.0 http://servicemix.apache.org/cxfbc/1.0/servicemix-cxf-bc.xsd">
    <cxfbc:provider endpoint="findOrdersProviderEndpoint"
        useJBIWrapper="false" wsdl="classpath:v1/B2BService.wsdl" service="orderProvider_v1:findOrders"
        locationURI="http://localhost:8989/MockB2BService" />

    <bean class="org.apache.servicemix.common.osgi.EndpointExporter" />
</beans>

它可以像预期的那样工作,但在那里我可以将endpoint显式定义为CXF提供程序,在这里我有同样的可能性吗?

共有1个答案

钱跃
2023-03-14

如果我理解你的问题正确,这将工作(和理想的解决方案在骆驼)

路线A

from("servlet://proxy?matchOnUriPrefix=true")
.to("direct:webservice-business-logic")
.to("direct:process-to-file");

路线B

from("direct:webservice-business-logic")
.to("actual-processors-to-do-webservice-business-logic");
from("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE")
.to("direct:webservice-business-logic);
 类似资料:
  • 我有一个消费者作为生产者消费者模式的一部分: 简化: 如果我移除 通过将线程设置为睡眠,CPU使用率攀升到极高的水平(13%),而不是0%。 此外,如果我实例化该类的多个实例,则每个实例的CPU使用率都会以13%的增量攀升。 大约每分钟(可能每30秒)都会向BlockingCollection添加一个新的LogItem,并将适用的消息写入文件。 有没有可能线程以某种方式阻止了其他线程的运行,而系统

  • 我在这里的部分问题是使用正确的词汇,所以我提前为可能是一个简单的术语问题道歉。 假设我有一个接口和一个实现该接口的类。 进一步假设我在某个地方有一个生产者方法(注释为),它返回一个。在内部,它返回一个新的,但这既不是这里也不是那里。 最后,假设我有另一个CDIBean,其注入点定义如下: 假设我有所有的文件就位等,并具有自举焊接或其他符合CDI-1.0的环境,因此我将得到一个不明确的定义错误。这很

  • 问题内容: 我需要编写一个类似于生产者- 消费者的问题,必须使用信号量。我尝试了几种解决方案,但都无济于事。首先,我在Wikipedia上尝试了一个解决方案,但没有成功。我当前的代码是这样的: 使用者的方法运行: 生产者的方法运行: 在上面的代码中,发生了一个消费者线程读取一个位置,然后另一个线程读取了相同位置而没有生产者填充该位置的情况,如下所示: 问题答案: 似乎您使用的是互斥锁而不是信号灯?

  • 我有一个生产者/消费者模式,如下所示 固定数量的生成器线程,每个线程写入它们自己的BlockingQueue,通过执行器调用 单个使用者线程,读取生产者线程 每个生产者都在运行一个数据库查询,并将结果写入其队列。消费者轮询所有生产者队列。目前,如果出现数据库错误,生产者线程就会死掉,然后消费者就会永远停留在产品队列中等待更多的结果。 我应该如何构造它来正确处理catch错误?

  • 我创建了一个带有三个分区的Kafka主题。使用Spring Kafka中的ProducerFactory,我可以创建一个producer实例。但是,我想创建三个生产者实例,因为我有三个分区。类似地,我想要三个consumer的实例。我该怎么做?请帮忙。