java - Spring JMS Listener Container not stopping fully -
i have weird problem jms listener container. in case stop listener container, half of messages still delivered app , processed listener. here deployment descriptor:
<servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <context-param> <param-name>contextconfiglocation</param-name> <param-value>web-inf/jms-config.xml,web-inf/root-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener> </web-app>
here spring configuration:
<context:component-scan base-package="com.con.*" /> <bean class="org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor" /> <!-- web methods environment mappings --> <bean id="webmethodproperties" class="org.springframework.beans.factory.config.propertyplaceholderconfigurer"> <property name="location" value="file:/opt/app/jboss/current/modules/com/con/commons/logconfiguration/main/webmethods.properties" /> </bean> <bean id="intialcontext" class="javax.naming.initialcontext"> <constructor-arg> <map> <entry key="java.naming.factory.initial" value="${java.naming.factory.initial}" /> <entry key="java.naming.provider.url" value="${java.naming.provider.url}" /> <entry key="com.webmethods.jms.naming.clientgroup" value="${com.webmethods.jms.naming.clientgroup}" /> </map> </constructor-arg> </bean> <!-- jndi template accessing web method resources --> <bean id="webmethodsjnditemplate" class="org.springframework.jndi.jnditemplate"> <property name="environment"> <map> <entry key="java.naming.factory.initial" value="${java.naming.factory.initial}" /> <entry key="java.naming.provider.url" value="${java.naming.provider.url}" /> <entry key="com.webmethods.jms.naming.clientgroup" value="${com.webmethods.jms.naming.clientgroup}" /> </map> </property> </bean> <bean id="destinationresolver" class="org.springframework.jms.support.destination.jndidestinationresolver"> <property name="jnditemplate" ref="webmethodsjnditemplate" /> <property name="cache" value="true" /> <property name="fallbacktodynamicdestination" value="false" /> </bean> <!-- custom connectionfactory customize clientid --> <bean id="remotejmsconnectionfactory" class="org.springframework.beans.factory.config.methodinvokingfactorybean"> <property name="targetobject" ref="connectionfactoryhelper"/> <property name="targetmethod" value="createjmsconnectionfactory"/> </bean> <!-- jms mdb container recieves messages vantage s --> <jms:listener-container container-type="default" connection-factory="remotejmsconnectionfactory" destination-type="durabletopic" destination-resolver="destinationresolver" acknowledge="auto"> <jms:listener destination="beconeventingjmstopic" ref="beconlistener" id="jmslistener" selector="${scrmessageselector}" subscription="${screventingsubscriber}" method="onmessage" /> </jms:listener-container> <bean id="beconlistener" class="com.con.jms.omilistener"/> </beans>
trying start listener here
@controller public class startjmscontroller { @resource(name="jmslistener") private defaultmessagelistenercontainer beconlistener; @requestmapping("/startscrjms") public string hello( @requestparam(value = "name", required = false, defaultvalue = "world") string name, model model) { beconlistener.start(); model.addattribute("message", "jms listener started."); return "jmsmessage"; } }
stop listener here.
@controller public class stopjmscontroller { @resource(name="jmslistener") private defaultmessagelistenercontainer beconlistener; @requestmapping("/stopscrjms" ) public string printwelcome(modelmap model, httpsession session) { beconlistener.stop(new runnable() { public void run() { system.out.println("jms listener stopped."); } }); model.addattribute("message", "jms listener stopped."); return "jmsmessage"; } }
root-context.xml
<?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"> <!-- empty --> </beans>
pom.xml
<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>webmethodtopicsubscriber</groupid> <artifactid>omiscrpayload</artifactid> <version>1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupid>com.wm.g11n</groupid> <artifactid>wm-g11nutils</artifactid> <version>8.2.2.4</version> <scope>provided</scope> </dependency> <dependency> <groupid>com.webmethods.jms</groupid> <artifactid>wm-brokerclient</artifactid> <version>8.2.3</version> <scope>provided</scope> </dependency> <dependency> <groupid>com.webmethods.jms</groupid> <artifactid>wm-jmsnaming</artifactid> <version>8.2.2</version> <scope>provided</scope> </dependency> <dependency> <groupid>com.webmethods.jms</groupid> <artifactid>wm-jmsclient</artifactid> <version>8.2.2.0</version> <scope>provided</scope> </dependency> <dependency> <groupid>antlr</groupid> <artifactid>antlr</artifactid> <version>2.7.7</version> <scope>provided</scope> </dependency> <dependency> <groupid>aopalliance</groupid> <artifactid>aopalliance</artifactid> <version>1.0</version> <scope>provided</scope> </dependency> <dependency> <groupid>commons-collections</groupid> <artifactid>commons-collections</artifactid> <version>3.2.1</version> <scope>provided</scope> </dependency> <dependency> <groupid>commons-dbcp</groupid> <artifactid>commons-dbcp</artifactid> <version>1.4</version> <scope>provided</scope> </dependency> <dependency> <groupid>commons-logging</groupid> <artifactid>commons-logging</artifactid> <version>1.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupid>commons-pool</groupid> <artifactid>commons-pool</artifactid> <version>1.6</version> <scope>provided</scope> </dependency> <dependency> <groupid>dom4j</groupid> <artifactid>dom4j</artifactid> <version>1.6.1</version> <scope>provided</scope> </dependency> <dependency> <groupid>com.logicblaze.fuse.liferay.dependencies</groupid> <artifactid>jms</artifactid> <version>fuse-4.1.2</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.quartz-scheduler</groupid> <artifactid>quartz</artifactid> <version>2.2.1</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-beans</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context-support</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-core</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-expression</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-jdbc</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-jms</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-orm</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-tx</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-web</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>4.0.3.release</version> <scope>provided</scope> </dependency> <dependency> <groupid>com.con.commons</groupid> <artifactid>configuration</artifactid> <version>1.0</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.apache.logging.log4j</groupid> <artifactid>log4j-api</artifactid> <version>2.1</version> </dependency> <dependency> <groupid>org.apache.logging.log4j</groupid> <artifactid>log4j-core</artifactid> <version>2.1</version> </dependency> <dependency> <groupid>javax.servlet</groupid> <artifactid>javax.servlet-api</artifactid> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <sourcedirectory>src/main/java</sourcedirectory> <resources> <resource> <directory>src/main/java</directory> <filtering>true</filtering> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <artifactid>maven-compiler-plugin</artifactid> <version>3.1</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <artifactid>maven-war-plugin</artifactid> <version>2.3</version> <configuration> <warsourcedirectory>webcontent</warsourcedirectory> <failonmissingwebxml>false</failonmissingwebxml> </configuration> </plugin> </plugins> </build> </project>
read in blog error " loading container both web context (dispatcherservlet's context) , root context (contextloaderlistener's context). means have 2 containers , stopping 1 in servlet context"
issue similar spring jms listener container stop half of listeners
but fix not clear in answer.
how can fix this. ?
in web.xml change dispatcher servlet definition below.
<servlet> <servlet-name>spring</servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <init-param> <param-name>contextconfiglocation</param-name> <param-value>web-inf/jms-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
and remove following part.
<context-param> <param-name>contextconfiglocation</param-name> <param-value>web-inf/jms-config.xml,web-inf/root-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener>
updated per user comments
the recommended pattern have separate context non web stuff , web stuff. in case there doesn't seem in root context, can skip if app works way.
in future if require root scope - add orm support in app - keep contextloaderlistener
entry in there contextconfiglocation
context param value root context config file name.
as side note, if decide add orm support in app in web context , app should work fine, not recommended.
update try this.
<servlet> <servlet-name>spring</servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <init-param> <param-name>contextconfiglocation</param-name> <param-value>web-inf/jms-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <context-param> <param-name>contextconfiglocation</param-name> <param-value>web-inf/root-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener>
Comments
Post a Comment