You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2018/10/05 09:21:32 UTC
[camel] branch master updated: camel-servlet - Restore missing
source snippets in doc (#2553)
This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new 9001350 camel-servlet - Restore missing source snippets in doc (#2553)
9001350 is described below
commit 9001350772361fc201be5aea909bbd5b65f46293
Author: Tadayoshi Sato <sa...@gmail.com>
AuthorDate: Fri Oct 5 18:21:20 2018 +0900
camel-servlet - Restore missing source snippets in doc (#2553)
---
.../src/main/docs/servlet-component.adoc | 247 ++++++++++++++++++---
1 file changed, 218 insertions(+), 29 deletions(-)
diff --git a/components/camel-servlet/src/main/docs/servlet-component.adoc b/components/camel-servlet/src/main/docs/servlet-component.adoc
index a22025d..04ef4d3 100644
--- a/components/camel-servlet/src/main/docs/servlet-component.adoc
+++ b/components/camel-servlet/src/main/docs/servlet-component.adoc
@@ -226,22 +226,66 @@ Spring web applications. See link:servlet-tomcat-example.html[Servlet
Tomcat Example] for details.
In this sample, we define a route that exposes a HTTP service at
-http://localhost:8080/camel/services/hello. +
- First, you need to publish the
-http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
-through the normal Web Container, or OSGi Service. +
- Use the `Web.xml` file to publish the
-http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
+http://localhost:8080/camel/services/hello.
+
+First, you need to publish the
+https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
+through the normal Web Container, or OSGi Service. Use the `Web.xml` file to publish the
+https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
as follows:
+[source,xml]
+-------------------------------------------------------------------------
+<web-app>
+
+ <servlet>
+ <servlet-name>CamelServlet</servlet-name>
+ <display-name>Camel Http Transport Servlet</display-name>
+ <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>CamelServlet</servlet-name>
+ <url-pattern>/services/*</url-pattern>
+ </servlet-mapping>
+
+</web-app>
+-------------------------------------------------------------------------
+
+
Then you can define your route as follows:
-NOTE: *Specify the relative path for camel-servlet endpoint*
-Since we are binding the Http transport with a published servlet, and we
+[source,java]
+-------------------------------------------------------------------------
+from("servlet:hello?matchOnUriPrefix=true").process(new Processor() {
+ public void process(Exchange exchange) throws Exception {
+ String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
+ String path = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
+ path = path.substring(path.lastIndexOf("/"));
+
+ assertEquals("Get a wrong content type", CONTENT_TYPE, contentType);
+ // assert camel http header
+ String charsetEncoding = exchange.getIn().getHeader(Exchange.HTTP_CHARACTER_ENCODING, String.class);
+ assertEquals("Get a wrong charset name from the message heaer", "UTF-8", charsetEncoding);
+ // assert exchange charset
+ assertEquals("Get a wrong charset naem from the exchange property", "UTF-8", exchange.getProperty(Exchange.CHARSET_NAME));
+ exchange.getOut().setHeader(Exchange.CONTENT_TYPE, contentType + "; charset=UTF-8");
+ exchange.getOut().setHeader("PATH", path);
+ exchange.getOut().setBody("<b>Hello World</b>");
+ }
+});
+-------------------------------------------------------------------------
+
+[NOTE]
+====
+*Specify the relative path for camel-servlet endpoint*
+
+Since we are binding the HTTP transport with a published servlet, and we
don't know the servlet's application context path, the `camel-servlet`
endpoint uses the relative path to specify the endpoint's URL. A client
can access the `camel-servlet` endpoint through the servlet publish
-address: `("http://localhost:8080/camel/services") + RELATIVE_PATH("/hello")`.
+address: `("http://localhost:8080/camel/services") + RELATIVE_PATH("/hello")`
+====
==== Sample when using Spring 3.x
@@ -254,42 +298,187 @@ often required to load the Spring ApplicationContext _after_ the Servlet
component has started. This can be accomplished by using Spring's
`ContextLoaderServlet` instead of `ContextLoaderListener`. In that case
you'll need to start `ContextLoaderServlet` after
-http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
+https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
like this:
[source,xml]
-------------------------------------------------------------------------
-
<web-app>
- <servlet>
- <servlet-name>CamelServlet</servlet-name>
- <servlet-class>
- org.apache.camel.component.servlet.CamelHttpTransportServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet>
- <servlet-name>SpringApplicationContext</servlet-name>
- <servlet-class>
- org.springframework.web.context.ContextLoaderServlet
- </servlet-class>
- <load-on-startup>2</load-on-startup>
- </servlet>
+ <servlet>
+ <servlet-name>CamelServlet</servlet-name>
+ <servlet-class>
+ org.apache.camel.component.servlet.CamelHttpTransportServlet
+ </servlet-class>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet>
+ <servlet-name>SpringApplicationContext</servlet-name>
+ <servlet-class>
+ org.springframework.web.context.ContextLoaderServlet
+ </servlet-class>
+ <load-on-startup>2</load-on-startup>
+ </servlet>
<web-app>
-------------------------------------------------------------------------
==== Sample when using OSGi
From *Camel 2.6.0*, you can publish the
-http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
-as an OSGi service with help of SpringDM like this.
+https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
+as an OSGi service with help of SpringDM like this:
+
+[source,xml]
+-------------------------------------------------------------------------
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:osgi="http://www.springframework.org/schema/osgi"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+ <bean id="camelServlet" class="org.apache.camel.component.servlet.CamelHttpTransportServlet">
+ </bean>
+
+ <!--
+ Enlist it in OSGi service registry
+ This will cause two things:
+ 1) As the pax web whiteboard extender is running the CamelServlet will
+ be registered with the OSGi HTTP Service
+ 2) It will trigger the HttpRegistry in other bundles so the servlet is
+ made known there too
+ -->
+ <osgi:service ref="camelServlet">
+ <osgi:interfaces>
+ <value>javax.servlet.Servlet</value>
+ <value>org.apache.camel.component.http.CamelServlet</value>
+ </osgi:interfaces>
+ <osgi:service-properties>
+ <entry key="alias" value="/camel/services" />
+ <entry key="matchOnUriPrefix" value="true" />
+ <entry key="servlet-name" value="CamelServlet"/>
+ </osgi:service-properties>
+ </osgi:service>
+
+</beans>
+-------------------------------------------------------------------------
Then use this service in your camel route like this:
+[source,xml]
+-------------------------------------------------------------------------
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:camel="http://camel.apache.org/schema/spring"
+ xmlns:osgi="http://www.springframework.org/schema/osgi"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
+ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+ <osgi:reference id="servletref" interface="org.apache.camel.component.http.CamelServlet">
+ <osgi:listener bind-method="register" unbind-method="unregister">
+ <ref bean="httpRegistry"/>
+ </osgi:listener>
+ </osgi:reference>
+
+ <bean id="httpRegistry" class="org.apache.camel.component.servlet.DefaultHttpRegistry"/>
+
+ <bean id="servlet" class="org.apache.camel.component.servlet.ServletComponent">
+ <property name="httpRegistry" ref="httpRegistry" />
+ </bean>
+
+ <bean id="servletProcessor" class="org.apache.camel.itest.osgi.servlet.ServletProcessor" />
+
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+ <route>
+ <!-- notice how we can use the servlet scheme which is that osgi:reference above -->
+ <from uri="servlet:///hello"/>
+ <process ref="servletProcessor"/>
+ </route>
+ </camelContext>
+
+</beans>
+-------------------------------------------------------------------------
+
For versions prior to Camel 2.6 you can use an `Activator` to publish
the
-http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
-on the OSGi platform
+https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet]
+on the OSGi platform:
+
+[source,java]
+-------------------------------------------------------------------------
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.camel.component.servlet.CamelHttpTransportServlet;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.http.HttpContext;
+import org.osgi.service.http.HttpService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.osgi.context.BundleContextAware;
+
+public final class ServletActivator implements BundleActivator, BundleContextAware {
+ private static final Logger LOG = LoggerFactory.getLogger(ServletActivator.class);
+ private static boolean registerService;
+
+ /**
+ * HttpService reference.
+ */
+ private ServiceReference<?> httpServiceRef;
+
+ /**
+ * Called when the OSGi framework starts our bundle
+ */
+ public void start(BundleContext bc) throws Exception {
+ registerServlet(bc);
+ }
+
+ /**
+ * Called when the OSGi framework stops our bundle
+ */
+ public void stop(BundleContext bc) throws Exception {
+ if (httpServiceRef != null) {
+ bc.ungetService(httpServiceRef);
+ httpServiceRef = null;
+ }
+ }
+
+ protected void registerServlet(BundleContext bundleContext) throws Exception {
+ httpServiceRef = bundleContext.getServiceReference(HttpService.class.getName());
+
+ if (httpServiceRef != null && !registerService) {
+ LOG.info("Register the servlet service");
+ final HttpService httpService = (HttpService)bundleContext.getService(httpServiceRef);
+ if (httpService != null) {
+ // create a default context to share between registrations
+ final HttpContext httpContext = httpService.createDefaultHttpContext();
+ // register the hello world servlet
+ final Dictionary<String, String> initParams = new Hashtable<String, String>();
+ initParams.put("matchOnUriPrefix", "false");
+ initParams.put("servlet-name", "CamelServlet");
+ httpService.registerServlet("/camel/services", // alias
+ new CamelHttpTransportServlet(), // register servlet
+ initParams, // init params
+ httpContext // http context
+ );
+ registerService = true;
+ }
+ }
+ }
+
+ public void setBundleContext(BundleContext bc) {
+ try {
+ registerServlet(bc);
+ } catch (Exception e) {
+ LOG.error("Cannot register the servlet, the reason is " + e);
+ }
+ }
+
+}
+-------------------------------------------------------------------------
==== Usage with Spring-Boot