Статьи

ОТДЫХ с Apache Camel

Есть много способов представить конечную точку HTTP в Camel : jetty, tomcat, servlet, cxfrs и restlet. Два из этих компонентов — cxfrs и restlet также поддерживают семантику REST с помощью всего лишь нескольких строк кода. Этот простой пример демонстрирует, как выполнять CRUD-операции с camel-restlet и camel-jdbc. Четыре HTTP-глагола выполняют разные операции и отображаются на следующий единственный шаблон URI:

  • POST — создать нового пользователя: / user
  • GET — запросить текущее состояние пользователя, указанного в URI: / user / {userId}
  • PUT — обновить пользователя по указанному URI с новой информацией: / user / {userId}
  • УДАЛИТЬ — удалить пользователя, идентифицируемого данным URI: / user / {userId}

Существует также URI / users, который возвращает всех пользователей независимо от используемого метода HTTP. Создать такое приложение с помощью Camel просто. После добавления всех необходимых зависимостей (restlet, spring, jdbc…) настройте web.xml для загрузки контекста Camel:

1
2
3
4
5
6
7
8
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:camel-config.xml</param-value>
    </context-param>
    <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener
 </listener-class>
    </listener>

и сопоставьте сервлет Restlet

01
02
03
04
05
06
07
08
09
10
11
12
<servlet>
  <servlet-name>RestletServlet</servlet-name>
  <servlet-class>org.restlet.ext.spring.SpringServerServlet</servlet-class>
  <init-param>
    <param-name>org.restlet.component</param-name>
    <param-value>RestletComponent</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>RestletServlet</servlet-name>
  <url-pattern>/rs/*</url-pattern>
</servlet-mapping>

В контексте Spring есть немного больше Restlet и код установки источника данных в памяти:

1
2
3
4
5
6
7
8
9
<bean id="RestletComponent" class="org.restlet.Component"/>
<bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent">
   <constructor-arg index="0">
     <ref bean="RestletComponent"/>
   </constructor-arg>
</bean>
<jdbc:embedded-database id="dataSource" type="HSQL">
   <jdbc:script location="classpath:sql/init.sql"/>
</jdbc:embedded-database>

После того, как все настройки выполнены, следующим шагом будет создание маршрутов Camel, которые будут обрабатывать HTTP-запросы и выполнять соответствующие операции CRUD. Первый — это маршрут createUser, который выполняет команду SQL-вставки с параметрами только из запросов POST и возвращает вновь созданного пользователя в теле ответа:

01
02
03
04
05
06
07
08
09
10
11
<route id="createUser">
   <from uri="restlet:/user?restletMethod=POST"/>
   <setBody>
     <simple>insert into user(firstName, lastName) values('${header.firstName}','${header.lastName}');  </simple>
   </setBody>
   <to uri="jdbc:dataSource"/>
   <setBody>
     <simple>select * from user ORDER BY id desc LIMIT 1</simple>
   </setBody>
   <to uri="jdbc:dataSource"/>
</route>

Маршрут ‘управляет пользователем’ обрабатывает методы HTTP GET, PUT и DELETE, но в зависимости от используемого метода выполняет различные команды SQL:

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
<route id="manipulateUser">
  <from uri="restlet:/user/{userId}?restletMethods=GET,PUT,DELETE"/>
  <choice>
    <when>
    <simple>${header.CamelHttpMethod} == 'GET'</simple>
    <setBody>
      <simple>select * from user where id = ${header.userId}</simple>
    </setBody>
   </when>
   <when>
     <simple>${header.CamelHttpMethod} == 'PUT'</simple>
       <setBody>
       <simple>update user set firstName='${header.firstName}', lastName='${header.lastName}' where id = ${header.userId}</simple>
       </setBody>
   </when>
   <when>
     <simple>${header.CamelHttpMethod} == 'DELETE'</simple>
     <setBody>
       <simple>delete from user where id = ${header.userId}</simple>
     </setBody>
   </when>
   <otherwise>
     <stop/>
   </otherwise>
  </choice>
  <to uri="jdbc:dataSource"/>
</route>

И последний путь для перечисления всех пользователей не требует пояснений:

1
2
3
4
5
6
7
<route id="listUsers">
  <from uri="restlet:/users"/>
  <setBody>
    <constant>select * from user</constant>
  </setBody>
  <to uri="jdbc:dataSource"/>
</route>

Если вы хотите увидеть приложение в действии, извлеките исходный код из github и запустите его с помощью встроенного плагина maven-jetty, набрав: mvn jetty: run. Вы даже можете попробовать несколько быстрых запросов, если у вас установлен curl:

Чтобы создать пользователя, выполните запрос HTTP POST с параметрами firstName и lastName.

1
curl -d 'firstName=test&lastName=user' http://localhost:8080/rs/user/

Чтобы обновить существующего пользователя, выполните запрос HTTP PUT с параметрами firstName и lastName.

1
curl -X PUT -d 'firstName=updated&lastName=user' http://localhost:8080/rs/user/2

Чтобы получить существующего пользователя, выполните http GET-запрос с userId как частью URL-адреса.

1
curl -X GET http://localhost:8080/rs/user/2

Чтобы удалить существующего пользователя, сделайте запрос http DELETE с userId как частью URL

1
curl -X DELETE http://localhost:8080/rs/user/2

Чтобы получить всех существующих пользователей, сделайте http GET-запрос для пользователей URL

1
curl -X GET http://localhost:8080/rs/users

Ссылка: ОТДЫХ с Apache Camel от нашего партнера JCG Билгина Ибряма в блоге OFBIZian