`
xiangshouxiyang
  • 浏览: 48189 次
  • 性别: 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服务框架,广泛应用于分布式系统开发,尤其在...

    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 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 30道面试题及答案.docx

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

    dubbo面试题dubbo面试题

    Dubbo支持多种通信协议,如RMI、Hessian、HTTP、Webservice、Thrift等,其中默认使用的是基于TCP的Dubbo协议,具有高吞吐量、低延迟的特点。 4. **什么是服务注册与发现?** 服务注册是指服务提供者将自身服务的...

    dubbo-admin-0.2.0.jar

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

    dubbo的功能列表1

    dubbo 支持同步调用和异步调用,这样可以根据不同的场景选择适合的调用方式,以提高服务的性能和可扩展性。 16. 参数回调 dubbo 提供了参数回调功能,这样可以在服务调用时,回调客户端逻辑。 17. 事件通知 dubbo ...

    dubbo案列demo代码

    Dubbo的主要目的是解决分布式系统中的服务调用问题,提高服务的可扩展性和高可用性。 在描述中提到的"Dubbo案例Demo代码",我们可以理解为一组示例代码,用于演示如何在实际项目中应用Dubbo。这些代码可能包含了...

    Dubbo基础教程及源码.zip

    同步调用是最常见的,消费者直接等待服务提供者的响应;异步调用则允许消费者在调用服务后立即返回,不阻塞当前线程,提高系统并发能力;回调模式则是异步调用的一种扩展,服务提供者在处理完请求后会主动通知消费者...

    dubbo技术介绍

    webservice:// thrift:// memcached:// redis:// 注册中心参考手册 Multicast注册中心 Zookeeper注册中心 Redis注册中心 Simple注册中心 Simple监控中心 Telnet命令参考手册 ls ps cd pwd trace count invoke status...

    Dubbo简介.docx

    dubbo : 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用, 以及消费者远大于提供者。传输协议 TCP,异步, Hessian 序列化; . rmi : 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现 ...

    Dubbo面试题答案整理1

    1. 为什么使用Dubbo? 在现代软件开发中,随着业务的复杂性增加,服务化成为一种常见的架构模式,SOA(面向服务架构)应运而生。Dubbo作为一款高性能、轻量级的Java服务治理框架,能够有效地管理和协调分布式系统中...

    Dubbo服务框架面试题及答案.zip

    Dubbo是阿里巴巴开源的一款基于Java的RPC(远程过程调用)框架,它能够使服务消费方和服务提供方通过网络进行通信,简化分布式系统的开发和维护。 2. **Dubbo的核心组件有哪些?** 主要包括:服务提供方...

    Java Dubbo面试及答案

    3. WebService 协议:基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用。 4. HTTP 协议:基于 Http 表单提交的...

Global site tag (gtag.js) - Google Analytics