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

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

[C++][SFML 2.2] Strange Performance Issues - Moving Mouse Lowers CPU Usage -

ios - Possible to get UIButton sizeThatFits to work? -