You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2018/07/26 02:18:49 UTC

[incubator-dubbo] branch 2.6.3-release updated: Merge pull request #2126, ensure compatibility for elegant shutdown under servlet container.

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch 2.6.3-release
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/2.6.3-release by this push:
     new ee21cea  Merge pull request #2126, ensure compatibility for elegant shutdown under servlet container.
ee21cea is described below

commit ee21cea88855fea698e173d33421fd6c3adcc02f
Author: Huxing Zhang <hu...@gmail.com>
AuthorDate: Thu Jul 26 09:44:56 2018 +0800

    Merge pull request #2126, ensure compatibility for elegant shutdown under servlet container.
    
    Fixes #1998
---
 dubbo-config/dubbo-config-spring/pom.xml           |  7 +-
 .../DubboApplicationContextInitializer.java        | 39 ++++++++++
 .../src/main/resources/META-INF/web-fragment.xml   | 22 ++++++
 .../DubboApplicationContextInitializerTest.java    | 87 ++++++++++++++++++++++
 .../src/test/resources/applicationContext.xml      |  6 ++
 .../test/resources/webapps/test/WEB-INF/web.xml    | 14 ++++
 .../test/resources/webapps/test2/WEB-INF/web.xml   | 10 +++
 .../test/resources/webapps/test3/WEB-INF/web.xml   | 10 +++
 8 files changed, 193 insertions(+), 2 deletions(-)

diff --git a/dubbo-config/dubbo-config-spring/pom.xml b/dubbo-config/dubbo-config-spring/pom.xml
index a186182..89fc4f4 100644
--- a/dubbo-config/dubbo-config-spring/pom.xml
+++ b/dubbo-config/dubbo-config-spring/pom.xml
@@ -112,18 +112,21 @@
             <artifactId>javax.el</artifactId>
             <scope>test</scope>
         </dependency>
-
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-tx</artifactId>
             <scope>test</scope>
         </dependency>
-
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
+            <scope>test</scope>
+        </dependency>
 
     </dependencies>
     <build>
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializer.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializer.java
new file mode 100644
index 0000000..36727e6
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializer.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.config.spring.initializer;
+
+import org.springframework.context.ApplicationContextInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+
+/**
+ * Automatically register {@link DubboApplicationListener} to Spring context
+ * A {@link org.springframework.web.context.ContextLoaderListener} class is defined in
+ * src/main/resources/META-INF/web-fragment.xml
+ * In the web-fragment.xml, {@link DubboApplicationContextInitializer} is defined in context params.
+ * This file will be discovered if running under a servlet 3.0+ container.
+ * Even if user specifies {@link org.springframework.web.context.ContextLoaderListener} in web.xml,
+ * it will be merged to web.xml.
+ * If user specifies <metadata-complete="true" /> in web.xml, this will no take effect,
+ * unless user configures {@link DubboApplicationContextInitializer} explicitly in web.xml.
+ */
+public class DubboApplicationContextInitializer implements ApplicationContextInitializer {
+
+    @Override
+    public void initialize(ConfigurableApplicationContext applicationContext) {
+        applicationContext.addApplicationListener(new DubboApplicationListener());
+    }
+}
diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/web-fragment.xml b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/web-fragment.xml
new file mode 100644
index 0000000..220874a
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/web-fragment.xml
@@ -0,0 +1,22 @@
+<web-fragment version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
+              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd">
+
+    <name>dubbo-fragment</name>
+
+    <ordering>
+        <before>
+            <others/>
+        </before>
+    </ordering>
+
+    <context-param>
+        <param-name>contextInitializerClasses</param-name>
+        <param-value>org.apache.dubbo.config.spring.initializer.DubboApplicationContextInitializer</param-value>
+    </context-param>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+
+</web-fragment>
\ No newline at end of file
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializerTest.java
new file mode 100644
index 0000000..2c84095
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializerTest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.config.spring.initializer;
+
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.startup.ContextConfig;
+import org.apache.catalina.startup.Tomcat;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.web.context.ContextLoaderListener;
+
+
+public class DubboApplicationContextInitializerTest {
+
+    @Test
+    public void testSpringContextLoaderListenerInWebXml() throws Exception {
+        Tomcat tomcat = new Tomcat();
+        tomcat.setBaseDir("src/test/resources");
+        tomcat.setPort(12345);
+        StandardContext context = new StandardContext();
+        context.setName("test");
+        context.setDocBase("test");
+        context.setPath("/test");
+        context.addLifecycleListener(new ContextConfig());
+        tomcat.getHost().addChild(context);
+        tomcat.start();
+        // there should be 1 application listener
+        Assert.assertEquals(1, context.getApplicationLifecycleListeners().length);
+        // the first one should be Spring's built in ContextLoaderListener.
+        Assert.assertTrue(context.getApplicationLifecycleListeners()[0] instanceof ContextLoaderListener);
+        tomcat.stop();
+        tomcat.destroy();
+    }
+
+    @Test
+    public void testNoListenerInWebXml() throws Exception {
+        Tomcat tomcat = new Tomcat();
+        tomcat.setBaseDir("src/test/resources");
+        tomcat.setPort(12345);
+        StandardContext context = new StandardContext();
+        context.setName("test2");
+        context.setDocBase("test2");
+        context.setPath("/test2");
+        context.addLifecycleListener(new ContextConfig());
+        tomcat.getHost().addChild(context);
+        tomcat.start();
+        // there should be 1 application listener
+        Assert.assertEquals(1, context.getApplicationLifecycleListeners().length);
+        // the first one should be Spring's built in ContextLoaderListener.
+        Assert.assertTrue(context.getApplicationLifecycleListeners()[0] instanceof ContextLoaderListener);
+        tomcat.stop();
+        tomcat.destroy();
+    }
+
+    @Test
+    public void testMetadataComplete() throws Exception {
+        Tomcat tomcat = new Tomcat();
+        tomcat.setBaseDir("src/test/resources");
+        tomcat.setPort(12345);
+        StandardContext context = new StandardContext();
+        context.setName("test3");
+        context.setDocBase("test3");
+        context.setPath("/test3");
+        context.addLifecycleListener(new ContextConfig());
+        tomcat.getHost().addChild(context);
+        tomcat.start();
+        // there should be no application listeners
+        Assert.assertEquals(0, context.getApplicationLifecycleListeners().length);
+        tomcat.stop();
+        tomcat.destroy();
+    }
+
+}
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/applicationContext.xml b/dubbo-config/dubbo-config-spring/src/test/resources/applicationContext.xml
new file mode 100644
index 0000000..977a8a4
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/applicationContext.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+       http://www.springframework.org/schema/beans/spring-beans.xsd">
+</beans>
\ No newline at end of file
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test/WEB-INF/web.xml b/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test/WEB-INF/web.xml
new file mode 100644
index 0000000..25214e2
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test/WEB-INF/web.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.1">
+    <display-name>dubbo-demo</display-name>
+
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>classpath:applicationContext.xml</param-value>
+    </context-param>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+
+</web-app>
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test2/WEB-INF/web.xml b/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test2/WEB-INF/web.xml
new file mode 100644
index 0000000..0da8d8a
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test2/WEB-INF/web.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.1">
+    <display-name>dubbo-demo</display-name>
+
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>classpath:applicationContext.xml</param-value>
+    </context-param>
+
+</web-app>
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test3/WEB-INF/web.xml b/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test3/WEB-INF/web.xml
new file mode 100644
index 0000000..81a5a13
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/webapps/test3/WEB-INF/web.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.1" metadata-complete="true">
+    <display-name>dubbo-demo</display-name>
+
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>classpath:applicationContext.xml</param-value>
+    </context-param>
+
+</web-app>