Идея, лежащая в основе HTTPInvokerServiceExporter
, заключается в предоставлении конечной точки для приема вызова метода удаления.
На сервере стороны было бы просто, как настроить RemoteExporter
, объявляя интерфейс, который вы хотите, чтобы разоблачить и связать его с реальным боба, который будет обрабатывать вызовы.
На клиентском необходимо настроить RemoteAcessor
, который в основном нуждается в интерфейсе, который будет иметь доступ на стороне сервера.
Реализация через HTTP может быть сделано с помощью HttpInvokerServiceExporter на стороне сервера, как в следующем примере:
служба Интерфейс:
package foo.bar.services;
public interface MyService {
public int sum(int num1, int num2);
}
За эту услугу вы бы реализацию (скажем, foo.bar.services.DefaultMyService
).
Экспозиция и конфигурации от контекста ярового будут выглядеть так:
<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
подвергаясь под foo.bar.MyService
интерфейсом по URL, отображаемого /myService
(bean name) в самом простом случае с использованием BeanNameUrlHandlerMapping
, который не делает ничего, кроме как сопоставить URL-адрес компонента со значением URL (этот случай /myService
).
На стороне клиента (потребителя) у вас будет настроен компонент, просто объявляющий интерфейс, который вы ожидаете от удаленной стороны. Для нашей службы было бы что-то вроде:
<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-запрос, выполняемый клиентом. Клиент получит его и десериализует его и возвращает в исходный метод invocator.
Как вы можете видеть (и полученное от S Принг документация):
сторона сервера
Десериализует удаленные объекты Призыва и упорядочивает удаленные результат вызова объектов. Использует сериализацию Java точно так же, как RMI, но обеспечивает такую же легкость настройки, как протоколы Husian на основе HTTP Hessian и Burlap.
сторона клиент
Сериализует удаленные объекты Призыва и десериализует удаленные результат вызова объектов. Использует сериализацию Java точно так же, как RMI, но обеспечивает такую же легкость настройки, как протоколы Husian на основе HTTP Hessian и Burlap.
сериализации, используемый с Spring Remoting на этом случае является сериализация, то есть запрос HTTP держит тело лица, содержащее сериализованный объект (это хорошо иметь в виду, что в этом случае JVM версии и класса версий должна быть совместимый).
Экспозиция выполнена в целом, вы не можете ее разделить, имея один URL
для каждого метода этого интерфейса. Поэтому было бы проще использовать Spring MVC и создать контроллер (@Controller
) реализовать метод для каждого метода, который у вас есть на вашем интерфейсе, аннотируя его как (с желаемым 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.
Но это будет предоставлять вашу услугу через интерфейс REST, то есть он будет обрабатывать простые HTTP-запросы, которые могут быть сделаны другими потребителями, такими как пользователь PHP (это не может быть сделано с помощью Spring Remoting, поскольку использует чистую сериализацию Java).
Если ваш клиент является Java, вы можете окончательно использовать Remoting и выставить свою службу в целом, если не реализация REST с использованием Spring MVC является хорошим решением.
Spring Documentation можно найти here
Что мне нужно знать. благодаря! – goh