Web Service学习笔记之----JAX-RPC

JAX-WS一个很简单的RPC风格的Web Service同步调用 Web Service技术,无疑会越来越被广泛应用的,可以非常好的实现异构应用程序之间的相互通信。JAX-WS是SUN推出的一种实现Web Service的工具。下面是我学习用JAX-WS实现的一个很简单Web Service例子。 服务端: 新建Java Project 1、 创建服务接口Endpoint package leon.rpcws.iface; import javax 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 导读 本文是我对学习jwsdp-1.2时所做笔记的整理,其中主要是一些指导性的内容,并没有多少概念以及原理的介绍,读者可能觉得略显简单,如果想要学习基本概念可以参考网上有关Web Service的资料。本文例子所使用的开发环境是WindowXP JWSDP-1.2。 一.Web Service简介 1.定义 由两部分组成 ·SOAP--Web Service之间的基本通信协议。 ·WSDL--Web Service描述语言,它定义了Web Service做什么,怎么做和查询的信息。 2.简单的Web Service实现 包含四个基本步骤 ·创建Web Service的商业逻辑(通常是一些Java类) ·将这些Java类部署到一个SOAP服务器上 ·生成客户访问代码 ·部署客户应用 注意:WSDL等文件的生成通常是利用厂商提供的工具来完成 3.WSDL解析 WSDL描述语言一般包含三部分 ·What部分--包括了type、message和portType元素 Type:定义了Web Service使用的数据结构(使用XML Schema定义) Message:一个Message是SOAP的基本通信元素。每个Message可以有一个或多个Part,每个Part代表一个参数。 PortType:消息汇总为不同的操作并归入到一个被称为portType的实体中。一个portType代表一个接口(Web Service支 持的操作集合),每个Web Service可以有多个接口,它们都使用portType表示。每个操作又包含了input和 output部分。 ·How部分--包含binding元素 binding元素将portType绑定到特定的通信协议上(如HTTP上的SOAP协议) ·Where部分--由service元素组成 它将portType,binding以及Web Service实际的位置(URI)放在一起描述 4.客户端 通常Web Service可以有三种类型的客户 ·商业伙伴(Business Partner)--包括分发商,零售商以及大型消费者) 此类客户通过SOAP、WSDL、ebXML、UDDI等XML技术与Web Service连接 ·瘦客户--包括Web浏览器、PDA以及无线设备 该类客户通常经由轻量协议(如HTTP)与Web Service连接 ·肥客户--包括Applet、各类应用以及现存系统 通常使用重量级协议(如IIOP)连接Web Service 二.使用JAX-RPC开发Web Service 1.JAX-RPC支持的数据类型 JAX-RPC除了支持Java的基本数据类型外还支持一些自定义对象,但这些对象有一些条件限制 ·有缺省构造函数的对象 ·没有实现java.rmi.Remote接口 ·字段必须是JAX-RPC支持的类型 ·公有字段不能声明为final或transient ·非公有字段必须有对应的setter和getter方法 2.使用JAX-RPC创建Web Service ·基本步骤 A. 编写服务端接口并实现 一个服务的end-point有一些规定:必须实现java.rmi.Remot接口而且每个方法需要抛出RemoteException异常。 B. 编译、生成并且将所有服务需要的类和文件打包成WAR文件 C. 部署包含服务的WAR文件 ·如何创建服务 A. 编译服务所需的类文件 B. 生成服务所需文件 可以使用wscompile工具生成model.gz文件,它包含了描述服务的内部数据结构命令如下 wscompile -define -d build -nd build -classpath build config.xml -model build/model.gz define标志告诉工具读取服务的 endpoint接口并且创建WSDL文件。-d和-nd标志告诉工具将输出文件写入指定的目录build。工具需要读以下的config.xml文件 <?xml version=”1.0” encoding=”UTF-8”?> <configuration xmlns=”http://java.sun.com/xml/ns/jax-rpc/ri/config”> <service name=”HelloService” targetNamespace=”urn:Star” typeNamespace=”urn:Star” packageName=”helloservice”> <interface name=”helloservice.HelloIF”/> </service> </configuration> 该文件告诉wscompile创建model文件所需的信息 ·服务名称:MyHelloService ·WSDL名字空间:urn:Star ·HelloService的所有类在包helloservice中 ·服务的端点(endpoint)接口:helloservice.HelloIF C. 将服务打包为WAR文件 WEB-INF/classes/hello/HelloIF.class WEB-INF/classes/hello/HelloImpl.class WEB-INF/jaxrpc-ri.xml WEB-INF/model.gz WEB-INF/web.xml jaxrpc-ri.xml文件如下所述 <?xml version=”1.0” encoding=”UTF-8”?> <webServices xmlns=”http://java.sun.com/xml/ns/jax-rpc/ri/dd” version=”1.0” targetNamespaceBase=”urn:Star” typeNamespaceBase=”urn:Star” urlPatternBase=”webservice”> <endpoint name=”Hello” displayName=”HelloWorld Service” description=”A simple web service” interface=”helloservice.HelloIF” model=”/WEB-INF/model.gz” implementation=”helloservice.HelloImpl”/> <endpointMapping endpointName=”Hello” urlPattern=”/hello”/> </webServices> D. 处理WAR文件 使用命令行 wsdeploy -o hello-jaxrpc.war hello-jaxrpc-original.war wsdeploy工具完成以下几个任务 ·读 hello-jaxrpc-original.war作为输入 ·从jaxrpc-ri.xml文件中获得信息 ·为服务生成tie classes ·生成名为HelloService.wsdl的WSDL文件 ·将tie classes和HelloService.wsdl文件打包到新的war文件中 E. 在服务器上部署服务 如果你使用的是TOMCAT,你可以将WAR文件拷贝到webapps目录下,然后可以在 <http://localhost:8080/[context]/[servicename>上看是否配置成功 ·如何使用JAX-RPC创建Web Service客户端 通常有三种类型的客户:Static Stub、Dynamic Proxy和Dynamic Invocation Interface(DII) Static Stub客户 ·生成Stub 通过使用config-wsdl.xml和wscompile工具,可以生成stub wscompile -gen:client -d build -classpath build config-wsdl.xml config-wsdl.xml文件如下 <?xml version="1.0" encoding="UTF-8"?> <configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config"> <wsdl location="http://localhost:8080/helloWS/hello?WSDL" packageName="staticstub"/> </configuration> wscompile工具读取服务器上的WSDL文件并生成stub ·编写静态客户代码 Stub stub=(Stub)(new HelloService_Impl().getHelloIFPort()); HelloIF hello=(HelloIF)stub; Hello.sayHello(“starchu”); 注意:HelloService_Impl类由wscompile生成 ·编译代码 ·运行客户端(需要包含saaj API和JAX-RPC API运行) Dynamic Proxy客户 ·生成接口 通过使用config-wsdl.xml文件和wscompile工具,可以生成客户所需的接口 wscompile -import -d build -classpath build config-wsdl.xml config-wsdl.xml和前面列出的文件内容相同。 ·编写动态客户代码 ServiceFactory factory=ServiceFactory.newInstance(); URL wsdlUrl=new URL(“<your web service wsdl url>”); Service service=factory.createService(wsdlUrl, new QName(“urn:Star”,”HelloService”)); HelloIF hello=(HelloIF)service.getPort( new QName(“urn:Star”,”HelloIFPort”),HelloIF.class); Hello.sayHello(“starchu”); 注意:这里不再需要静态客户代码的HelloService_Impl类 ·编译代码 ·运行客户端(需要包含saaj API和JAX-RPC API运行) Dynamic Invocation Interface客户 这个方法为我们提供了更有弹性的客户调用方式,客户代码不在需要由wscompile工具生成的运行时类,当然这种代码更加复杂。具体步骤如下: ·创建ServiceFactory实例 ServiceFactory factory=ServiceFactory.newInstance(); ·创建Service(利用服务名的Qname) Service service=factory.createService(new QName(“HelloService”)); ·创建Call对象(使用端点接口的Qname) Call call=service.createCall(new QName(“HelloIF”)); ·设置端点的地址和一些Call对象属性 call.setTargetEndpointAddress(args[0]); call.setProperty(Call.SOAPACTION_USE_PROPERTY,new Boolean(true)); call.setProperty(Call.SOAPACTION_URI_PROPERTY,””); call.setProperty(“javax.xml.rpc.encodingstyle.namespace.uri”, “http://schemas.xmlsoap.org/soap/encoding/”); ·设置远程调用的返回类型、操作名和参数 QName stringType=new Qname(“http://www.w3.org/2001/XMLSchema”,”string”) call.setReturnType(stringType); call.setOperationName(new Qname(“urn:Star”,”sayHello”)); call.addParameter(“String_1”,stringType,ParameterMode.IN); ·调用call的invoke方法 String [] param={ “ starchu “ }; String retValue=call.invoke(param); ·编译代码并对Main方法设置<http://localhost:8080/helloWS/hello参数(服务器需有效>) 3.SOAP Message Handler的例子 通常使用JAX-RPC建立的Web Service并不需要开发人员自己处理SOAP消息,但是JAX-RPC提供了一种机制可以使程序员获得这种处理能力,这就是所谓的消息处理器。总的来说,像日志和加解密功能可以通过SOAP消息处理器实现,除此之外,你根本不需要处理SOAP消息。 ·基本Handler处理过程 SOAP请求 ·客户端处理器在请求消息发送到服务器前被调用 ·服务端处理器在请求消息分发到端点前被调用 SOAP应答 ·服务端处理器在应答消息发送回客户前被调用 ·客户端处理器在应答消息转换成Java方法返回前被调用 SOAP错误 处理过程与SOAP应答的方式一样 注意:处理器可以在任意端组成处理器链 A.Handler基本编程模型 服务端 ·编写服务端点接口代码、实现服务并且实现服务端处理器类 ·创建jaxrpc-ri.xml文件,以便wscompile使用,其中包含了Handler的信息 ·创建web.xml文件 ·编译所有代码 ·将文件打包为WAR文件 ·用wsdeploy工具将原始war文件替换为完整可部署的war文件 ·在服务器上部署war文件 客户端 ·编写客户程序以及客户端处理器代码 ·创建config.xml文件以便wscompile使用,它包含了客户端处理器的信息 ·编译代码 ·运行wscompile生成服务端点接口和客户类 ·编译所有代码,并运行客户应用 B.建立客户端处理器 处理器必须扩展javax.xml.rpc.handler.GenericHandler类并且提供至少两个方法的实现init和getHandlers。此外,你可以利用handleXXX方法处理请求、应答和错误SOAP消息。基本步骤如下 ·编写客户端处理器代码 Public class ClientHandler extends GenericHandler{ Public void init(HandlerInfo info){ This.info=info; } public QName[] getHeaders(){ return info.getHeaders(); } public boolean handleRequest(MessageContext context){ SOAPMessageContext smc=(SOAPMessageContext)context; SOAPMessage message=smc.getMessage(); file://You can use SOAP API to implement your own logic file://such as logging and encrypt …… file://Set a logger element in the SOAPHeader SOAPHeaderElement loggerElement= header.addHeaderElement(envelope.createName(“loginfo”, “ns1”,”urn:Star:headprops”)); loggerElement.setMustUnderstand(true); loggerElement.setValue(“10”); file://Set a name element in the SOAP Header SOAPHeaderElement nameElement= Header.addHeaderElement(envelope.createName(“client”, “ns1”,”urn:Star:headprops”)); nameElement.addTextNode(“Star chu”); } } ·编辑config.xml文件 <?xml version=”1.0” encoding=”UTF-8”?> <configuration xmlns=”http://java.sun.com/xml/ns/jax-rpc/ri/config”?> <wsdl location=”http://localhost:8080/handlerWS/handler?WSDL packageName=”client”> <handlerChains> <chain runAt=”client”> <handler className=”client.ClientHandler”> <property name=”name” value=”client handler”/> </handler> </chain> </handlerChains></wsdl></configuration> ·编写静态客户 C.建立服务端处理器 ·编写服务端处理器(与客户端结构类似) Public boolean handleRequest(MessageContext context){ SOAPMessageContext smc=(SOAPMessageContext)context; …… Iterator it=header.examineAllHeaderElements(); While(it.hasNext()){ SOAPElement element=(SOAPElement)it.next(); If(element name is loginfo and must understand it){ element.getValue(); element.detach(); file://Invoke only when the setMustUnderstand(true) } } } detach方法用来移除元素,这个需求仅当一个元素设置了mustUnderstand属性在必要。 ·编辑jaxrpc-ri.xml文件 <?xml version=”1.0” encoding=”UTF-8”?> <webServices xmlns=”http://java.sun.com/jax-rpc/config/ri/dd” version=”1.0” targetNamespaceBase=”urn:Star:wsdl” typeNamespaceBase=”urn:Star:types” urlPatternBase=”/handler”> <endpoint name=”HandlerTest” displayName=”Handler Test” description=” … …” interface=”service.HandlerTest” model=”/WEB-INF/model.gz” implementation=”service.HandlerTestImpl”> <handlerChains> <chain runAt=”server”> <handler className=”service.LoggerHandler” headers=”ns1:loginfo” xmlns:ns1=”urn:Star:headerprops”> <property name=”name” value=”Logger”/> </handler> <handler className=”service.NameHandler”> <propery name=”name” value=”Name”/> </handler> </chain> </handlerChains> </endpoint> <endpointMapping endpointName=”HandlerTest” urlPattern=”/handler”/> </webServices> 在第一个处理器中,XML使用了属性 headers描述头信息。这是因为客户代码告诉服务端,logger头必须被理解,否则客户将收到SOAP错误消息 ·生成WAR文件并部署到服务器上 4.源代码 ·HelloIF.java(endpoint接口) package helloservice; import java.rmi.RemoteException; import java.rmi.Remote; public interface HelloIF extends Remote{ public String sayHello(String target) throws RemoteException; } ·HelloImpl.java package helloservice; public class HelloImpl implements HelloIF{ private String message="Hello"; public String sayHello(String target){ return message target; } } ·StaticClient.java package staticstub; import javax.xml.rpc.Stub; public class StaticClient{ private static String endpointAddress; public static void main(String [] args){ if(args.length!=1){ System.err.println("Usage : java HelloClient [endpoint address]"); System.exit(-1); } endpointAddress=args[0]; System.out.println("Connect to :" endpointAddress); try{ Stub stub=createStub(); stub._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, endpointAddress); HelloIF hello=(HelloIF)stub; System.out.println(hello.sayHello(" Starchu!")); }catch(Exception e){System.err.println(e.toString());} } private static Stub createStub(){ return (Stub)(new HelloService_Impl().getHelloIFPort()); } } ·DynamicClient.java package dynamicproxy; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.rpc.Service; import javax.xml.rpc.ServiceFactory; import javax.xml.rpc.JAXRPCException; import staticstub.HelloIF; public class DynamicClient{ private static String wsdl; private static String namespaceUri="urn:Star:wsdl"; private static String serviceName="HandlerService"; private static String portName="HandlerTestPort"; public static void main(String [] args){ if(args.length!=1){ System.err.println("Usage : java DynamicClient [server Url]"); System.exit(-1); } System.out.println("Connect to :" args[0]); helloWsdl=args[0] "?WSDL"; try{ URL wsdlUrl=new URL(wsdl); ServiceFactory serviceFactory=ServiceFactory.newInstance(); Service service= serviceFactory.createService(wsdlUrl, new QName(namespaceUri,serviceName)); HandlerTest proxy=(HandlerTest)service.getPort( new QName(namespaceUri,portName),HandlerTest.class); proxy.test(); }catch(Exception e){ System.err.println(e.toString()); } } } ·DIIClient.java package dii; import javax.xml.rpc.*; import javax.xml.namespace.*; public class DIIClient{ private static String qnameService = "HelloService"; private static String qnamePort = "HelloIF"; private static String BODY_NAMESPACE_VALUE ="urn:Star"; private static String ENCODING_STYLE_PROPERTY ="javax.xml.rpc.encodingstyle.namespace.uri"; private static String NS_XSD ="http://www.w3.org/2001/XMLSchema"; private static String URI_ENCODING ="http://schemas.xmlsoap.org/soap/encoding/"; public static void main(String [] args){ try{ ServiceFactory factory=ServiceFactory.newInstance(); Service service=factory.createService(new QName(qnameService)); QName port=new QName(qnamePort); Call call=service.createCall(port); call.setTargetEndpointAddress(args[0]); call.setProperty(Call.SOAPACTION_USE_PROPERTY,new Boolean(true)); call.setProperty(Call.SOAPACTION_URI_PROPERTY,""); call.setProperty(ENCODING_STYLE_PROPERTY,URI_ENCODING); QName qnameTypeString=new QName(NS_XSD,"string"); call.setReturnType(qnameTypeString); call.setOperationName(new QName(BODY_NAMESPACE_VALUE,"sayHello")); call.addParameter("String_1",qnameTypeString,ParameterMode.IN); String [] params = { "Starchu" }; System.out.println((String)call.invoke(params)); }catch(Exception e){ System.err.println(e.toString()); } } } ·Ant文件build.xml <project name="helloWS" basedir="." default="deploy"> <property file="build.properties"/> <property name="build" value="build"/> <property name="dist" value="${build}/classes"/> <property name="lib" value="${build}/lib"/> <property name="src" value="src"/> <property name="etc" value="${src}/etc"/> <target name="clean"> <delete dir="${build}"/> </target> <target name="init"> <mkdir dir="${build}"/> <mkdir dir="${dist}"/> <mkdir dir="${lib}"/> </target> <path id="classpath"> <fileset dir="${tomcat.home}"> <include name="jaxrpc/**/*.jar"/> <include name="jaxb/**/*.jar"/> <include name="jaxp/**/*.jar"/> <include name="saaj/**/*.jar"/> <include name="jwsdp-shared/lib/**/*.jar"/> </fileset> <pathelement path="${dist}"/> <pathelement location="${lib}"/> </path> <target name="compile-service" depends="init"> <javac srcdir="${src}" destdir="${dist}" includes="HelloService/**/*.java"/> </target> <target name="generate-sei-service" depends="compile-service"> <exec executable="wscompile.bat"> <arg line="-define -d ${build} -nd ${build} -classpath ${dist} ${etc}/config-interface.xml -model ${build}/model.gz"/> </exec> <copy todir="${build}"> <fileset dir="${etc}" includes="*.xml"/> </copy> </target> <target name="package-service" depends="generate-sei-service"> <war warfile="${build}/${ant.project.name}-portable.war" webxml="${build}/web.xml"> <webinf dir="${build}" includes="*.xml,*.gz,*.wsdl" excludes="web.xml"/> <classes dir="${dist}" includes="**/*.class" defaultexcludes="no"/> </war> </target> <target name="process-war" depends="package-service"> <exec executable="wsdeploy.bat"> <arg line="-o ${ant.project.name}.war ${build}/${ant.project.name}-portable.war"/> </exec> </target> <target name="deploy"> <copy file="${ant.project.name}.war" todir="${server}"/> </target> <target name="undeploy"> <delete file="${server}/${ant.project.name}.war"/> </target> <!-- Generating Static Client --> <target name="generate-stubs" depends="init"> <exec executable="wscompile.bat"> <arg line="-gen:client -d ${dist} -classpath ${dist} ${etc}/config-wsdl.xml"/> </exec> </target> <target name="compile-client" depends="generate-stubs"> <javac srcdir="${src}" destdir="${dist}" includes="StaticStub/**/*.java"> <classpath refid="classpath"/> </javac> </target> <target name="package-client" depends="compile-client"> <jar destfile="${lib}/client.jar" basedir="${dist}" excludes="HelloService/**/*.class"/> </target> <target name="run-client" depends="package-client"> <java classname="staticstub.HelloClient" classpathref="classpath" fork="true"> <sysproperty key="endpoint" value="${endpoint}"/> <arg value="${server.port.url}"/> </java> </target> <!-- Generating Dynamic Client --> <target name="generate-interface" depends="init"> <exec executable="wscompile.bat"> <arg line="-import -d ${dist} -classpath ${dist} ${etc}/config-wsdl.xml"/> </exec> </target> <target name="compile-dynamic-client" depends="generate-interface"> <javac srcdir="${src}" destdir="${dist}" includes="DynamicProxy/**/*.java"> <classpath refid="classpath"/> </javac> </target> <target name="package-dynamic-client" depends="compile-dynamic-client"> <jar destfile="${lib}/client.jar" basedir="${dist}" includes="**/HelloIF.class,**/DynamicClient.class"/> </target> <target name="run-dynamic-client" depends="package-dynamic-client"> <java classname="dynamicproxy.DynamicClient" classpathref="classpath" fork="true"> <sysproperty key="endpoint" value="${endpoint}"/> <arg value="${server.port.url}"/> </java> </target> <!-- Generating Dynamic Invocation Interface --> <target name="compile-dii"> <javac srcdir="${src}" destdir="${dist}" includes="DII/**/*.java"> <classpath refid="classpath"/> </javac> </target> <target name="run-dii" depends="compile-dii"> <java classname="dii.DIIClient" classpathref="classpath" fork="true"> <sysproperty key="endpoint" value="${endpoint}"/> <arg value="${server.port.url}"/> </java> </target> </project> ·属性文件(build.xml文件使用) server=C:/Java/jwsdp-1.2/webapps tomcat.home=C:/Java/jwsdp-1.2 endpoint=http://localhost:8080/helloWS/hello server.port.url=http://localhost:8080/helloWS/hello 参考资料 1. Developing Web Service Series <http://www.theserverside.com/resources/article.jsp?l=Systinet-web-services-part-1> www.theserverside.com 2. JWSDP-1.2 Tutorial java.sun.com
Web Service 学习笔记 Web Service 即 web 服务,它是一种跨编程语言和跨操作系统平台的远程调用技术。 Java 中共有三种 Web Service 规范: - JAX-WS(JAX-RPC): 基于 xml 数据 - JAXM&SAAJ - JAX-RS:基于 xml 或 json 数据 阅读详情

相关推荐

Graybox Overview

Graybox功能使能够在sub_module上执行扫描和ATPG操作,然后能够在更高层次的层次上执行扫描和ATPG操作时使用该子模块的简化的Graybox表示,从而简化了分层设计中的扫描插入和ATPG操作过程。由于子模块的graybox表示只包含极少量的互连电路(子模块与top的互连),在大型分层设计中使用graybox可以极大地减少执行扫描插入,优化计时,分析故障和创建测试pattern所需的memory和工具runtime。

weixin_44954910的博客 1087

Web Service学习笔记之----JAX-RPC (转)

Web Service学习笔记之----JAX-RPC (转)[@more@]web Service学习笔记之----JAX-RPC 导读本文是我对学习jwsdp-1.2时所做笔记的整理,其中主要是一些指导性的内容,并没有多少...

csd3176的博客 228

Win11系统下Notepad++右键菜单失效?3种修复方法实测有效(附注册表备份指南)

本文针对Windows 11系统中Notepad++右键菜单失效的常见问题,提供了三种经过实测有效的修复方法。核心解决方案包括使用官方NppShell.dll重新注册、手动修复注册表项以及系统级问题排查,并详细说明了操作前的注册表备份指南,确保修复过程安全可靠。

m2n3b4v5c6的博客 328

基于JAX-RPC的快速Web服务开发方案(转)

前两天写了两篇Blog使用SOAP开发java web服务--Axis开发方案 ,深入探索SOAP1.1--使用SAAJ1.2.1 ,有些读者可能对Java的web服务开发抱怨了,怎的那么复杂呢?不如在net平台下敲几个键就行了,:),请先不用着急,前两天我的Blog只是为了让各位读者深入了解一下什么是SOAP,以及其在Java中的封装接口实现,今天我们来讨论一下,一种高层的web服务实现方案,那

JofeeDong's Blog 1490

我用WorkBuddy“克隆“了一个我,从此每句话像我自己说的

各位,做这件事花了多长时间?准备样本可能要半小时,提炼风格十分钟,保存固化再花十分钟。加起来不到一个小时。但这一个小时之后呢?你就拥有了一个"永远在线的文字替身"。以后写口播稿,打开WorkBuddy跟它说;写课程逐字稿,跟它说;写公众号文章,也跟它说。写出来的东西,你的学员一看——“嘿,这不就是翟猛老师说的嘛。说到这儿,可能有人会问:老师,我的风格有那么重要吗?AI写的不都挺好的吗?各位你想想看,你为什么愿意听某个老师的课?不只是因为他讲的内容好,更是因为你喜欢他讲话的方式。

weixin_39284145的博客 824

实战拆解:RAG vs Agent在金融风控中的性能对比

2024年上半年我帮某华东地区城商行做零售交易反欺诈系统升级时,技术团队曾发生过一次激烈争论:一派认为应该优先上RAG(检索增强生成)方案,成本低、落地快、合规性好;另一派坚持要上Agent(智能体)方案,推理能力强、能应对复杂新型欺诈。最终我们做了完整的AB测试,结论是两者没有绝对的优劣,只有场景适配的差异:RAG适合高并发、低时延的实时风控场景,Agent适合低并发、高准确率要求的事后核查/大额审批场景,两者结合的 hybrid 方案能覆盖95%以上的风控需求。本文我会结合真实项目的测试数据,从核心概念

AI天才研究院 252

SOAP Web Service的RPC风格与Document风格

style SOAP Web Service有两种风格(style),RPC和Document。 RPC RPC style有由SOAP标准定义的固定的SOAP消息body格式要求,由远程调用的方法名元素包裹着许多个参数元素构成,由于有固定的格式,marshalling/unmarshalling是标准中的一部分,SOAP库自动化这个过程。RPC风格的服务对应用程序代码的耦合较紧。 <soa...

扶摇升的IT博客 838

向华为学习——IPD流程体系之IPD术语

《IPD体系核心概念与业务术语解析》摘要: IPD(集成产品开发)是一种以市场为导向的结构化产品开发管理模式,通过跨部门协作、异步开发、CBB(通用构建模块)和管道管理等手段,实现产品全生命周期高效管理。体系包含七大核心要素:跨部门团队(如IPMT决策层、PDT执行层)、结构化流程(分阶段评审)、端到端项目管理(WBS分级计划)、客户需求分析、投资组合优化及质量管控(TR技术评审)。各业务领域术语涵盖财务(NPV、IRR)、开发(需求分解、基线化)、制造(可制造性设计)、采购(Sourcing团队)及市场(

cdfunlove的博客 483

基于JAX-WS的Web Service服务端/客户端

JAX-WS(Java API for XML-Based Web Services)用于简化使用Java构建WebService服务端和

怀揣梦想,努力前行 3万+

专栏三:解析spatialCNV的使用

文章Spatially resolved clonal copy number alterations in benign and malignant tissue发在natur

m0_58549466的博客 1253

如何实现Docker镜像导入导出 ?

摘要: Docker镜像迁移与备份可通过两种方式实现:1)镜像操作(save/load)完整保存分层结构和元数据,适用于完整备份;2)容器操作(export/import)仅保存文件系统快照,适合创建轻量模板。关键区别在于前者保留历史记录和分层,后者生成单层镜像。save/load命令示例:docker save -o nginx.tar nginx:latest,export/import示例:docker export -o container.tar abc123 && docker

weixin_39291964的博客 876

与Java Web Service相关的若干概念(JAX-WS,JAX-RS)

本篇关键词: JWS ,JAX-WS ,JAX-RS,REST,Restlet,SOAP 这一段时间从.NET转战java了。表示对java的一套相当不熟悉。新手,必须是新手。作为新手,我感到压力很大。 面对开发环境中的若干包,若干插件,若干技术。只写过Java 控制台里边

line_cheng的专栏 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

web service和rpc的区别

Web 服务已经出现很久了。首先是 SOAP,但 SOAP 仅描述消息的情况,然后是 WSDL,WSDL 并不会告诉您如何使用 Java 编写 Web 服务。在这种情况下,JAX-RPC 1.0 应运而生。经过数月使用之后,编写此规范的 Java Community Process (JCP) 人员认识到需要对其进行一些调整,调整的结果就是 JAX-RPC 1.1。该规范使用大约一年之后,JCP 人

qq_24558789的博客 612

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JAX-WS和JAX-RPC方式调用Web Service的Java客户端

基于JAX-WS调用Web Service的Java客户端一般采用两种方式:proxy方式以及dispatch方式。 proxy方式,proxy的步骤主要如下图所示: 一,proxy方式的调用代码片段一般如下: [java] view plaincopy URL wsdlURL = new URL("file:///D:/JAVA

Tony Chen的专栏 5616

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JAX-WS实现Web Service

一、为什么使用Web Service?        Java系统相互间可以通过RMI实现远程过程调用,但是由于其局限于只能用于java系统间进行调用,且开发过程相对来说较复杂,已经逐步被Web Service取代。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service为整个企业甚至多个组织之间的业务流程的集...

wxq_768992698的博客 345

`javax.xml.rpc` 是 **JAX-RPC 1.1(Java API for XML-based RPC)** 标准定义的核心包

`javax.xml.rpc` 是 **JAX-RPC 1.1(Java API for XML-based RPC)** 标准定义的核心包,用于早期Java实现SOAP RPC风格Web Service,属于老旧Java Web服务规范,**现已被JAX-WS完全取代**。 ### 1. 归属体系 - 规范:JSR 101(JAX-RPC 1.0/1.1) - 用途:基于XML SOAP协议做远程过程调用,早期WebService客户端/服务端开发 - 生命周期:Java EE 1.4时代主流,Java

[Blog][Domain] programb.blog.youkuaiyun.com 1074

jax-rpc for web service

http://www-900.ibm.com/developerWorks/cn/webservices/ws-jax-rpc/part1/index.shtmlhttp://www-900.ibm.com/developerWorks/cn/webservices/wsdk/install_guide.shtml

samlover的专栏 1074

jax-ws 生成soap_使用JAX-RPC发送和接收SOAP消息

Web服务的基础之一是互操作性。 这意味着Web服务以标准格式发送和接收消息。 通常,该格式是SOAP。 有很多发送SOAP消息的方法。 最基本的是对URL流执行println ,但这要求您对SOAP协议以及服务期望并发送的SOAP消息了解得太多。 没有简单的方法可以从服务中获取此信息,并且这种方法的可伸缩性不是很高。 加强使用SAAJ API(带有Java附件的SOAP)。 SAAJ...

cuyi7076的博客 629

spring+JAX-RPC(Axis) 构建webservice。

介绍关于用eclipse+wtp发布webservice是相当的简单。这里只简单介绍一下,wtp下发布webservice有以下几个步骤:·创建Dynamic Web Project.(wtp自带项目)·在soure folder 下面创建要发布的java bean。本例中发布了一个User.java·在创建的工程上面新建Web Service. (wtp自带) 浏览中选择创建的U

1511
上一篇: 标签库使用指南1-Application标签库
下一篇: “Java之父”指责微软左右市场
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值