HTTPInvokerServiceExporter
背后的想法是提供一个接收移除方法调用的端点。
在服务器端侧很容易配置RemoteExporter
,声明您想要公开的接口并将其关联到将处理调用的真实bean。
在客户端这将是必要的配置RemoteAcessor
基本上需要接口将在服务器端访问。
通过HTTP实施,可以在服务器端像下面的示例使用HttpInvokerServiceExporter来完成:
服务接口:
package foo.bar.services;
public interface MyService {
public int sum(int num1, int num2);
}
对于此服务,你将有一个实现(比方说foo.bar.services.DefaultMyService
)。
上Spring上下文博览会和配置会是什么样子:
<bean name="myService" class="foo.bar.DefaultMyService" />
<bean name="/myService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="myService"/>
<property name="serviceInterface" value="foo.bar.MyService"/>
</bean>
有了这个配置我只是为了有我的执行MyService
正在通过由映射的URL下foo.bar.MyService
接口暴露一个实例/myService
(bean名称)在最简单的情况下使用BeanNameUrlHandlerMapping
,除了将URL映射到具有URL值的bean(本例为/myService
)之外别无其他。
在客户端(消费者),您将有一个配置的bean,只是声明您期望远程端暴露的接口。对于我们的服务会是这样的:
<bean id="httpInvokerProxy" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://foo.bar.org/springSample/myService"/>
<property name="serviceInterface" value="foo.bar.MyService"/>
</bean>
目前春季实例客户端上的豆子,一个代理实例化,然后每一个方法调用将被序列化并通过HTTP发送到终端(在这种情况下http://foo.bar.org/springSample/myService
。在服务器端,这个请求被反序列化和解释,即调用真实服务的方法被暴露(在我们的例子中,DefaultMyService)。服务将返回一些将被序列化的结果给客户端执行的HTTP请求。客户端会收到并反序列化它并将其返回给原始方法调用者。
正如你所看到的(并从S普林文档):
服务器侧将
反序列远程调用对象和远程串行化 调用结果对象。像RMI一样使用Java序列化,但 提供了与Caucho的基于HTTP的Hessian和Burlap协议相同的简易设置。
客户机端将
序列化远程调用对象和远程反序列 调用结果对象。像RMI一样使用Java序列化,但 提供了与Caucho的基于HTTP的Hessian和Burlap协议相同的简易设置。
与春季远程处理在这种情况下使用的序列化是Java序列化,这意味着HTTP请求保持包含序列化对象(实体主体是好事,记住,在这种情况下,JVM版本和类的版本必须是兼容)。
博览会是作为一个整体进行,你不能分开它有一个URL
该接口的每个方法。因此,使用Spring MVC会更容易,并且创建一个控制器(@Controller
)为接口上的每个方法实现一个方法,将它标注为@RequestMapping
(带有所需的URL),并按照以下示例调用服务上的方法:
控制器样品
package foo.bar;
import foo.bar.service.MyService;
@Controller
public class MyService {
@Autowired
private MyService myService;
@RequestMapping("/sum/{num1}/{num2}")
public int sum(@PathVariable("num1") int num1, @PathVariable("num2") int num2) {
return myService.sum(num1, num2);
}
}
使用上下文配置
<context:component-scan base-package="foo.bar"/>
它将映射吨他对foo.bar,并自动在包中发现的类,这意味着Service
实现(DefaultMyService
)可以与@Service
和@Autowired
映射到控制器的样品中进行的,没有上下文XML的bean配置。
但是,这将使您的服务通过REST接口公开,这意味着它将处理其他消费者(如PHP消费者可能会完成的HTTP简单请求(这不能用Spring Remoting完成,因为它使用纯Java序列化)。
如果你的客户是Java中,你可以明确地使用远程处理和暴露你的服务作为一个整体,如果不使用Spring MVC中的REST实现是一个很好的解决方案。
Spring文档可以发现here
我需要知道的。谢谢! – goh