Вступление
Благодаря поддержке Spring Integration ваше приложение может вызывать веб-службу с помощью шлюза исходящих веб-служб. Вызов обрабатывается этим шлюзом, поэтому вам просто нужно беспокоиться о создании сообщения запроса и обработке ответа. Однако при таком подходе не очевидно, как настроить дополнительные параметры, такие как установка таймаутов или кэширование операций. Эта статья покажет, как установить время ожидания клиента и интегрировать его со шлюзом.
Эта статья состоит из следующих разделов:
- Введение.
- Обзор вызова веб-службы.
- Настройка отправителя сообщения.
- Пример приложения.
- Вывод.
- Исходный код можно найти на github .
Обзор вызовов веб-сервисов
Исходящий шлюз веб-службы делегирует вызов веб-службы веб-службе Spring Web Services . Когда сообщение поступает на исходящий шлюз, этот шаблон использует отправителя сообщения для создания нового соединения. Диаграмма ниже показывает обзор потока:
По умолчанию шаблон веб-службы устанавливает HttpUrlConnectionMessageSender в качестве отправителя сообщения, что является базовой реализацией без поддержки параметров конфигурации. Это поведение, однако, может быть переопределено путем установки более продвинутого отправителя сообщения с возможностью установки таймаутов чтения и соединения.
Мы настроим отправителя сообщения в следующем разделе.
Настройка отправителя сообщения
Мы собираемся настроить отправителя сообщения на исходящий шлюз. Таким образом, шлюз установит отправителя сообщения шаблона в соответствии с предоставленным.
Реализация, которую мы предоставляем в этом примере, — это класс HttpComponentsMessageSender , также из проекта Spring Web Services. Этот отправитель сообщения позволяет нам определить следующие таймауты:
- connectionTimeout : устанавливает время ожидания до установления соединения.
- readTimeout : устанавливает время ожидания сокета для базового HttpClient. Это время, необходимое для ответа службы.
Конфигурация:
|
1
2
3
4
|
<bean id="messageSender" class="org.springframework.ws.transport.http.HttpComponentsMessageSender"> <property name="connectionTimeout" value="${timeout.connection}"/> <property name="readTimeout" value="${timeout.read}"/></bean> |
Файл свойств содержит значения, которые оба установлены в две секунды:
timeout.connection = 2000
timeout.read = 2000
После настройки мы добавляем его в конфигурацию исходящего шлюза веб-службы:
|
1
2
3
|
marshaller="marshaller" unmarshaller="marshaller" request-channel="requestChannel" message-sender="messageSender"/> |
Чтобы использовать отправителя этого сообщения, вам необходимо добавить следующую зависимость:
|
1
2
3
4
5
|
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.3</version></dependency> |
Вот и все; следующий раздел покажет пример приложения, чтобы увидеть, как оно работает.
Пример приложения
Поток прост; он состоит из приложения, которое отправляет запрос веб-службе и получает ответ. Исходный код веб-сервиса можно найти на github .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd http://www.springframework.org/schema/integration/ws http://www.springframework.org/schema/integration/ws/spring-integration-ws.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"> <context:component-scan base-package="xpadro.spring.integration.ws"/> <context:property-placeholder location="classpath:props/service.properties"/> <!-- System entry --> <int:gateway id="systemEntry" default-request-channel="requestChannel" service-interface="xpadro.spring.integration.ws.gateway.CourseService"/> <!-- Web service invocation --> marshaller="marshaller" unmarshaller="marshaller" request-channel="requestChannel" message-sender="messageSender"/> <oxm:jaxb2-marshaller id="marshaller" contextPath="xpadro.spring.integration.ws.types" /> <bean id="messageSender" class="org.springframework.ws.transport.http.HttpComponentsMessageSender"> <property name="connectionTimeout" value="${timeout.connection}"/> <property name="readTimeout" value="${timeout.read}"/> </bean></beans> |
Шлюз содержит метод, с помощью которого мы войдем в систему обмена сообщениями:
|
1
2
3
4
5
|
public interface CourseService { @Gateway GetCourseResponse getCourse(GetCourseRequest request);} |
Наконец, тест:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@ContextConfiguration(locations = {"/xpadro/spring/integration/ws/config/int-course-config.xml"})@RunWith(SpringJUnit4ClassRunner.class)public class TestIntegrationApp { @Autowired private CourseService service; @Test public void invokeNormalOperation() { GetCourseRequest request = new GetCourseRequest(); request.setCourseId("BC-45"); GetCourseResponse response = service.getCourse(request); assertNotNull(response); assertEquals("Introduction to Java", response.getName()); } @Test public void invokeTimeoutOperation() { try { GetCourseRequest request = new GetCourseRequest(); request.setCourseId("DF-21"); GetCourseResponse response = service.getCourse(request); assertNull(response); } catch (WebServiceIOException e) { assertTrue(e.getCause() instanceof SocketTimeoutException); } }} |
Вывод
Мы узнали, как установить дополнительные параметры для исходящего шлюза веб-службы, чтобы установить время ожидания. В следующем посте я объясню, как кэшировать этот вызов.
| Ссылка: | Spring Integration — Настройте время ожидания клиента веб-службы у нашего партнера по JCG Ксавьера Падро в блоге |
