`
xiangshouxiyang
  • 浏览: 49274 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

用dubbo直接调用webservice

阅读更多

       场景:他人的服务端暴露的webservice接口,我这边客户端集成了dubbo,所以想用dubbo直接去调用webservice。因为dubbo的官方文档上说dubbo有提供这些功能。

      dubbo版本2.3.0以上版本支持。需要在pom里添加依赖,它是基于CXF的frontend-simpletransports-http实现。maven依赖:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-simple</artifactId>
    <version>2.6.1</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>2.6.1</version>
</dependency>

 具体做法是:

如果webservice的接口是:http://172.16.123.xxx:8880/xxx/webservice/com.xxx.riviews.webservice.ITongdunService?wsdl

则在dubbo的xml配置里添加

<dubbo:reference id="tongdunServicePortType" interface="com.hylandtec.riviews.webservice.ITongdunService" url="webservice://172.16.123.xxx:8880/xxx/webservice/com.xxx.riviews.webservice.ITongdunService?wsdl"/>

 即把url中的http改成webservice,作为dubbo配置中的url,形成点对点的访问。

实际的接口ITongdunService,注意包的路径:

package com.xxxx.riviews.webservice;

/**
 * 同盾接口
 * Created by cd_huang on 2017/4/19.
 */
public interface ITongdunService {
	/**
     *
     * @param arg0
     * @param arg1
     * @return
     */
    String query(String arg0,String arg1);
}

 接口的方法和参数对应webservice声明的方法和参数。

使用的时候在调用的类里加上

@Autowired
	private ITongdunService tongdunServicePortType;

 

String result = tongdunServicePortType.query(arg0, arg1);

 即可完成webservice的调用。

      这样子调用有个很麻烦的地方,那就是,我接口所在的包路径被定死掉了。然后我就想着能不能用dubbo的泛化调用,即客户端不需要拥有服务端对应的api也能访问的方式。

      在

<dubbo:reference id="tongdunServicePortType" interface="com.hylandtec.riviews.webservice.ITongdunService" url="webservice://172.16.123.xxx:8880/xxx/webservice/com.xxx.riviews.webservice.ITongdunService?wsdl"/>
 中加入generic="true"配置。
@Autowired
	private GenericService tongdunServicePortType;
 调用则为
String result =tongdunServicePortType.$invoke("query", new String[]{"java.lang.String","java.lang.String"}, new Object[] {arg0,arg1}).toString();
 完成一个泛化调用。
然后是运行结果:
com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote service: interface com.alibaba.dubbo.rpc.service.GenericService, method: $invoke, cause: Error reading XMLStreamReader.

	at com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol.getRpcException(AbstractProxyProtocol.java:118)
	at com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol$2.doInvoke(AbstractProxyProtocol.java:98)
	at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144)
	at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74)
	at com.onlyou.olyfinance.remote.filter.RemoteTestFilter.invoke(RemoteTestFilter.java:22)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.GenericImplFilter.invoke(GenericImplFilter.java:138)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52)
	at com.alibaba.dubbo.common.bytecode.proxy3.$invoke(proxy3.java)
	at com.onlyou.olyfinance.remote.DemoTestRemote.tongdunTest(DemoTestRemote.java:83)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader.
	at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
	at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
	at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
	at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
	at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
	at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
	at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:811)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1590)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1486)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1305)
	at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
	at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:623)
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
	at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:541)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
	at org.apache.cxf.frontend.ClientProxy.invoke(ClientProxy.java:81)
	at com.sun.proxy.$Proxy30.$invoke(Unknown Source)
	at com.alibaba.dubbo.common.bytecode.Wrapper3.invokeMethod(Wrapper3.java)
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
	at com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol$2.doInvoke(AbstractProxyProtocol.java:93)
	... 47 more
 报错了。debug后发现,泛化调用并不会直接在客户端把$invoke方法改成调用query方法,所以在进入cxf的代码里时,去调用的还是$invoke方法,和webservice声明的query方法不符合,导致webservice解析SOAP的xml协议报错了。看来泛化调用只能在调用的两端都是dubbo的情况下来使用,这是dubbo预留的机制,有点类似Rest调用。
分享到:
评论

相关推荐

    基于Dubbo+Zookeeper实现webservice

    - **配置Zookeeper**:确保Zookeeper服务正常运行,并配置好Dubbo服务使用的Zookeeper连接信息。 - **测试与调优**:通过调用测试工具验证服务是否正常工作,根据性能指标调整服务参数,如超时时间、重试次数等。 ...

    dubbo服务调用

    Dubbo 提供了基于 HTTP、RMI、Hessian、Hessian2、Thrift、Webservice 等多种协议的服务调用方式,以满足不同场景的需求。服务调用的核心组件包括 Invoker 和 Exporter,Invoker 是服务调用的抽象,Exporter 是服务...

    dubbo的jar包 2.5.3和2.8.4

    - **协议支持**:支持多种通信协议,如RMI、Hessian、HTTP、Webservice等,其中Dubbo默认使用高效的Dubbo协议。 - **负载均衡策略**:内置多种负载均衡策略,如Random、RoundRobin、LeastActive等,可以根据实际...

    Dubbo入门案例和项目源码

    【Dubbo入门案例和项目源码】是一个针对初学者的教程资源,包含了使用Dubbo构建Web服务的基础示例和完整的项目源代码。Dubbo是阿里巴巴开源的一款高性能、轻量级的Java服务框架,广泛应用于分布式系统开发,尤其在...

    Dubbo手册.pdf

    【Dubbo启动时依赖服务不可用会怎样?】 默认情况下,Dubbo在启动时会检查依赖服务的可用性,如果不可用会抛出异常阻止Spring初始化。可通过设置check="false"关闭此检查。 【Dubbo推荐使用什么序列化框架?】 ...

    webservice(dubbo)开源框架

    【标题】:“Webservice(Dubbo)开源框架” 在IT行业中,Web Service是一种基于XML的开放式标准,用于在不同系统间实现互操作性,而Dubbo则是阿里巴巴开源的一款高性能、轻量级的服务治理框架,主要面向Java平台。...

    SpringMVC整合dubbo和zookeeper详细教程

    Dubbo 的服务调用可以使用 SpringMVC 的 Controller 来调用,提供更加灵活和简洁的服务调用方式。 五、基本概念 * RMI(Remote Method Invocation):Java 的一组拥护开发分布式应用程序的 API。RMI 使用 Java ...

    dubbo中文文档说明

    - **webservice://**:使用WebService协议进行远程方法调用。 - **thrift://**:使用Thrift协议进行远程方法调用。 - **memcached://**:使用Memcached协议进行远程方法调用。 - **redis://**:使用Redis协议进行...

    Dubbo面试.pdf

    1. dubbo协议:使用单一长连接和NIO异步通讯模型,适合高并发且数据量小的服务调用,尤其在消费者数量远大于提供者时更为适用。它采用TCP传输协议,异步通信方式,利用Hessian序列化机制。这种协议的优点是性能好,...

    dubbo rest rpc相关jar包

    在使用这些jar包时,开发者需要配置Dubbo服务提供者和消费者的相关参数,包括服务接口、实现类、版本、协议等。例如,对于REST服务,可能需要指定服务暴露的URL路径、HTTP方法(GET、POST等)以及数据的序列化方式...

    dubbo.xsd资源

    【标题】:“dubbo.xsd资源”是Dubbo框架的核心配置文件 【描述】:Dubbo.xsd是Dubbo服务治理框架的一个核心组件,它定义了Dubbo服务的XML Schema,用于...理解和掌握dubbo.xsd,对于使用和优化Dubbo系统至关重要。

    dubbo源码解析

    4. Java RPC机制:Dubbo作为一个RPC框架,其底层实现涉及到Java的远程过程调用机制,包括但不限于RMI、Hessian、Thrift、WebService等。这些技术都涉及到网络通信和对象序列化等原理。 5. Java其他内容:文章指出,...

    Dubbo 30道面试题及答案.docx

    Dubbo 推荐使用 dubbo:// 协议,但也可以选择 rmi://、hessian://、http://、webservice://、thrift://、Memcached://、Redis:// 等协议。 在同一个服务多个注册的情况下,可以点对点直连某一个服务,修改配置...

    dubbo-user-book

    - **上下文信息传递**:在Dubbo调用链中,可以传递一些上下文信息,如TraceId等。 - **异步调用**:Dubbo支持异步调用模式,能够提高服务调用的响应速度。 - **本地伪装与延迟暴露**:在开发和测试环境中,可以将...

    dubbo_user_book

    - **隐式参数**:在Dubbo调用中自动传递的一些参数,这些参数通常用于系统内部的管理和监控。 ##### 4. 异步调用与本地调用 - **异步调用**:客户端发起调用后无需等待结果即可继续执行其他操作,服务端完成处理后...

    dubbo用户手册

    - 讲解了 Dubbo 对异步调用和本地调用的支持,以及其适用场景。 **参数回调与事件通知** - 解释了如何使用参数回调机制以及 Dubbo 的事件通知模型。 **本地伪装与延迟暴露** - 介绍了本地伪装和延迟暴露的配置...

    Dubbo学习总结

    Dubbo是一款高性能、透明化RPC(Remote Procedure Call,远程过程调用)的分布式服务框架。它为分布式系统提供了服务治理能力,致力于解决高性能、透明化的远程服务调用,以及SOA(Service Oriented Architecture,...

    dubbo-作者梁飞

    Dubbo 支持多种远程调用协议,如 Netty、Mina、Grizzly 等,同时也兼容 RMI、Hessian、WebService 等传统远程调用协议。这使得开发者可以根据实际需求灵活选择合适的协议。 #### 2. **服务动态发现** Dubbo 提供了...

    dubbo开发者文档

    - **协议参考手册**: 详细介绍支持的协议如dubbo://、rmi://、hessian://、***、webservice://、thrift://、memcached://、redis://等。 #### 6. 工具和最佳实践 - **telnet命令参考手册、maven插件参考手册**: ...

    dubbo-admin-0.2.0.jar

    Dubbo是一款基于Netty的高性能、轻量级的RPC框架,其主要功能包括:面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册和发现、依赖分析与降级。支持dubbo、rmi、hessian、http、webservice、thrift、...

Global site tag (gtag.js) - Google Analytics