Integration
版本5.0.7.RELEASE
这部分参考文档涵盖了Spring Framework与许多Java EE(及相关)技术的集成。
1.使用Spring进行远程处理和Web服务
1.1。介绍
Spring提供了使用各种技术进行远程支持的集成类。远程支持简化了通常(Spring)POJO实现的远程启用服务的开发。目前,Spring支持以下远程技术:
-
远程方法调用(RMI)。通过使用
RmiProxyFactoryBean
和,RmiServiceExporter
Spring支持传统的RMI(带java.rmi.Remote
接口和java.rmi.RemoteException
)以及通过RMI调用者(带有任何Java接口)的透明远程处理。 -
Spring的HTTP调用者。Spring提供了一种特殊的远程处理策略,允许通过HTTP进行Java序列化,支持任何Java接口(就像RMI调用程序一样)。相应的支持类是
HttpInvokerProxyFactoryBean
和HttpInvokerServiceExporter
。 -
黑森州。通过使用Spring
HessianProxyFactoryBean
,HessianServiceExporter
您可以使用Caucho提供的基于HTTP的轻量级协议透明地公开您的服务。 -
JAX-WS。Spring通过JAX-WS(Java EE 5和Java 6中引入的JAX-RPC的后继者)为Web服务提供远程支持。
-
JMS。通过
JmsInvokerServiceExporter
和JmsInvokerProxyFactoryBean
类支持使用JMS作为底层协议进行远程处理 。 -
AMQP。Spring AMQP项目支持使用AMQP作为底层协议进行远程处理。
在讨论Spring的远程处理功能时,我们将使用以下域模型和相应的服务:
<span style="color:#34302d"><span style="color:rgba(0, 0, 0, 0.9)"><code><strong>public</strong> <strong>class</strong> <span style="color:#445588"><strong>Account</strong></span> <strong>implements</strong> <span style="color:inherit">Serializable</span>{
<strong>private</strong> <span style="color:inherit">String</span> name;
<strong>public</strong> <span style="color:inherit">String</span> getName(){
<span style="color:#000000"><strong>return</strong></span> name;
}
<strong>public</strong> <strong>void</strong> setName(<span style="color:inherit">String</span> name) {
<span style="color:#996633">this</span>.name = name;
}
}</code></span></span>
<span style="color:#34302d"><span style="color:rgba(0, 0, 0, 0.9)"><code><strong>public</strong> <strong>interface</strong> <span style="color:#445588"><strong>AccountService</strong></span> {
<strong>public</strong> <strong>void</strong> insertAccount(Account account);
<strong>public</strong> <span style="color:inherit">List</span><Account> getAccounts(<span style="color:inherit">String</span> name);
}</code></span></span>
<span style="color:#34302d"><span style="color:rgba(0, 0, 0, 0.9)"><code><span style="color:#999988"><em>// the implementation doing nothing at the moment</em></span>
<strong>public</strong> <strong>class</strong> <span style="color:#445588"><strong>AccountServiceImpl</strong></span> <strong>implements</strong> AccountService {
<strong>public</strong> <strong>void</strong> insertAccount(Account acc) {
<span style="color:#999988"><em>// do something...</em></span>
}
<strong>public</strong> <span style="color:inherit">List</span><Account> getAccounts(<span style="color:inherit">String</span> name) {
<span style="color:#999988"><em>// do something...</em></span>
}
}</code></span></span>
我们将使用RMI开始向远程客户端公开服务,并谈谈使用RMI的缺点。然后我们将继续展示使用Hessian作为协议的示例。
1.2。使用RMI公开服务
使用Spring对RMI的支持,您可以透明地通过RMI基础结构公开您的服务。完成此设置后,您基本上具有类似于远程EJB的配置,除了没有对安全上下文传播或远程事务传播的标准支持这一事实。在使用RMI调用程序时,Spring确实为这样的附加调用上下文提供了钩子,因此您可以在此处插入安全框架或自定义安全凭证。
1.2.1。使用RmiServiceExporter导出服务
使用RmiServiceExporter
,我们可以将AccountService对象的接口公开为RMI对象。RmiProxyFactoryBean
在传统RMI服务的情况下,可以使用或通过普通RMI 访问接口。在RmiServiceExporter
明确支持通过RMI调用任何非RMI业务。
当然,我们首先要在Spring容器中设置我们的服务:
<span style="color:#34302d"><span style="color:rgba(0, 0, 0, 0.9)"><code><span style="color:#008080"><bean</span> <span style="color:#000080">id</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">accountService</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">class</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">example.AccountServiceImpl</span><span style="color:#dd1144">"</span></span><span style="color:#008080">></span>
<span style="color:#999988"><em><!-- any additional properties, maybe a DAO? --></em></span>
<span style="color:#008080"></bean></span></code></span></span>
接下来,我们将使用以下方式公开我们的服务RmiServiceExporter
:
<span style="color:#34302d"><span style="color:rgba(0, 0, 0, 0.9)"><code><span style="color:#008080"><bean</span> <span style="color:#000080">class</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">org.springframework.remoting.rmi.RmiServiceExporter</span><span style="color:#dd1144">"</span></span><span style="color:#008080">></span>
<span style="color:#999988"><em><!-- does not necessarily have to be the same name as the bean to be exported --></em></span>
<span style="color:#008080"><property</span> <span style="color:#000080">name</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">serviceName</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">value</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">AccountService</span><span style="color:#dd1144">"</span></span><span style="color:#008080">/></span>
<span style="color:#008080"><property</span> <span style="color:#000080">name</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">service</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">ref</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">accountService</span><span style="color:#dd1144">"</span></span><span style="color:#008080">/></span>
<span style="color:#008080"><property</span> <span style="color:#000080">name</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">serviceInterface</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">value</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">example.AccountService</span><span style="color:#dd1144">"</span></span><span style="color:#008080">/></span>
<span style="color:#999988"><em><!-- defaults to 1099 --></em></span>
<span style="color:#008080"><property</span> <span style="color:#000080">name</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">registryPort</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">value</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">1199</span><span style="color:#dd1144">"</span></span><span style="color:#008080">/></span>
<span style="color:#008080"></bean></span></code></span></span>
如您所见,我们正在覆盖RMI注册表的端口。通常,您的应用程序服务器也维护一个RMI注册表,明智的做法是不干扰那个。此外,服务名称用于绑定服务。所以现在,服务将受到约束'rmi://HOST:1199/AccountService'
。我们稍后将使用该URL链接到客户端的服务。
该 |
1.2.2。链接到客户端的服务
我们的客户是使用AccountService
管理帐户的简单对象:
<span style="color:#34302d"><span style="color:rgba(0, 0, 0, 0.9)"><code><strong>public</strong> <strong>class</strong> <span style="color:#445588"><strong>SimpleObject</strong></span> {
<strong>private</strong> AccountService accountService;
<strong>public</strong> <strong>void</strong> setAccountService(AccountService accountService) {
<span style="color:#996633">this</span>.accountService = accountService;
}
<span style="color:#999988"><em>// additional methods using the accountService</em></span>
}</code></span></span>
要链接客户端上的服务,我们将创建一个单独的Spring容器,其中包含简单对象和连接配置位的服务:
<span style="color:#34302d"><span style="color:rgba(0, 0, 0, 0.9)"><code><span style="color:#008080"><bean</span> <span style="color:#000080">class</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">example.SimpleObject</span><span style="color:#dd1144">"</span></span><span style="color:#008080">></span>
<span style="color:#008080"><property</span> <span style="color:#000080">name</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">accountService</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">ref</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">accountService</span><span style="color:#dd1144">"</span></span><span style="color:#008080">/></span>
<span style="color:#008080"></bean></span>
<span style="color:#008080"><bean</span> <span style="color:#000080">id</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">accountService</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">class</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">org.springframework.remoting.rmi.RmiProxyFactoryBean</span><span style="color:#dd1144">"</span></span><span style="color:#008080">></span>
<span style="color:#008080"><property</span> <span style="color:#000080">name</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">serviceUrl</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">value</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">rmi://HOST:1199/AccountService</span><span style="color:#dd1144">"</span></span><span style="color:#008080">/></span>
<span style="color:#008080"><property</span> <span style="color:#000080">name</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">serviceInterface</span><span style="color:#dd1144">"</span></span> <span style="color:#000080">value</span>=<span style="color:#dd2200"><span style="color:#dd1144">"</span><span style="color:#dd1144">example.AccountService</span><span style="color:#dd1144">"</span></span><span style="color:#008080">/></span>
<span style="color:#008080"></bean></span></code></span></span>
这就是我们需要做的就是支持客户端上的远程帐户服务。Spring将透明地创建一个调用者并通过该远程启用帐户服务RmiServiceExporter
。在客户端,我们将其链接使用RmiProxyFactoryBean
。