Вступление
Благодаря поддержке 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 Ксавьера Падро в блоге |