簡體   English   中英

Spring JMS偵聽器容器未完全停止

[英]Spring JMS Listener Container not stopping fully

我對JMS偵聽器容器有奇怪的問題。 萬一我停止了監聽器容器,一半的消息仍會傳遞到應用程序並由監聽器處理。 這是我的部署描述符:

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

這是我的Spring配置:

<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 for 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 to 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 which recieves messages from 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>

嘗試在此處啟動監聽器

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

}

在此處停止偵聽器。

@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";

    }

}

根的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>

在博客中讀到“這可能是錯誤”,因為您正在將容器加載到Web上下文(DispatcherServlet的上下文)和根上下文(ContextLoaderListener的上下文)中。這意味着您有2個容器,並且僅在其中停止了一個servlet上下文”

問題是類似的Spring JMS偵聽器容器僅停止一半的偵聽器

但是解決方案尚不清楚。

我怎樣才能解決這個問題。

在您的web.xml中,將Dispatcher Servlet定義更改為以下內容。

    <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/jms-config.xml,WEB-INF/root-context.xml</param-value>      
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

根據用戶評論更新

推薦的模式是為非Web內容和Web內容分別設置上下文。 但是在您的情況下,根上下文似乎沒有任何內容,如果您的應用程序以這種方式工作,則可以跳過它。

將來,如果您需要根范圍(例如,您在應用程序中添加了ORM支持),則始終可以將ContextLoaderListener條目與contextConfigLocation上下文參數一起保留在其中,該值僅作為您的根上下文配置文件名。

附帶說明一下,即使您決定在應用程序中添加ORM支持,也可以在Web上下文中很好地做到這一點,並且該應用程序應該可以正常運行,只是不建議這樣做。

更新試試這個。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM