Skip to content

Commit

Permalink
Merge pull request #2126, ensure compatibility for elegant shutdown u…
Browse files Browse the repository at this point in the history
…nder servlet container.

Fixes #1998
  • Loading branch information
ralf0131 authored and chickenlj committed Jul 26, 2018
1 parent 47a4876 commit ee21cea
Show file tree
Hide file tree
Showing 8 changed files with 193 additions and 2 deletions.
7 changes: 5 additions & 2 deletions dubbo-config/dubbo-config-spring/pom.xml
Expand Up @@ -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>
Expand Down
@@ -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());
}
}
@@ -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>
@@ -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();
}

}
@@ -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>
@@ -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>
@@ -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>
@@ -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>

0 comments on commit ee21cea

Please sign in to comment.