当前位置: 首页 > 知识库问答 >
问题:

如何停止DefaultMessageListenerContainer重试队列连接?

归誉
2023-03-14

我正在使用spring jms在独立应用程序中加载spring应用程序(使用spring 2.5,无法升级到3.0),如下所示

AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

下面是我的申请ontext.xml

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destinationName" value="destinationName"/>
    <property name="messageListener" ref="jmsMessageListener" />
    <property name="exceptionListener" ref="exceptionListener"/> 
</bean>

<bean id="jmsMessageListener" class="Listener"/>

<bean id="connectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
            <property name="hostName" value="${hostName}"/>
            <property name="port" value="${port}"/>
            <property name="queueManager" value="${queueManager}"/>
            <property name="transportType" value="${transportType}"/>
            <property name="channel" value="${channel}"/> 
   </bean>
    <bean id = "exceptionListener" class="ExceptionListener">

   public class ExceptionListener implements ExceptionListener{
   @Override
public void onException(JMSException arg0) {
     System.out.println("Exception");

}
   }

现在,问题是默认情况下DefaultMessageListenerContainer会尝试恢复与queue的连接,直到成功,我可以在下面的日志文件中看到消息

INFO [jmsContainer-1] org.springframework.jms.listener.DefaultMessageListenerContainer - Could not refresh JMS Connection - retrying in 5000 ms: javax.jms.JMSException: MQJMS2005: failed to create MQQueueManager for 'hostName:queueManager'

但我的要求是,如果它无法连接我的应用程序上下文应该停止加载,我可以报告一个错误,它无法连接并抛出JMSException。

我尝试为DMLC使用ExctionListener,但它的onException消息没有被触发。

我认为,如果我在加载spring应用程序上下文时以某种方式重写DMLC的默认行为或捕获异常,我就可以解决这个问题。

有谁能建议我如何实现上述任何一项,或者是否有其他选择?

共有1个答案

吕华彩
2023-03-14

将连接工厂和JMS模板放在单独的上下文中。加载该上下文并尝试将消息发送到(可能是虚拟的)队列。如果成功,创建一个新的应用程序上下文,将小上下文作为父上下文(这样bean就可以看到连接工厂),设置configLocations,并refresh()

 类似资料:
  • 我是尝试使用websphereMq和spring jms功能通过soap over jms实现服务的新手。我已经确定下面的事情 生成的绑定文件没有遇到任何错误 队列管理器和队列的状态为已启动并正在运行。 我在尝试将消息放入websphereMQ时遇到以下错误 null

  • 问题内容: 我正在使用nodejs和mongoose —尝试在嵌套有递归函数和foreach的深层注释中找到特定的注释。有没有一种方法可以停止nodejs forEach?据我了解,每个forEach迭代都是一个函数,并且我不能只执行“ break”,而只能执行“ return”,但这不会停止foreach。 问题答案: 您无法打破。不过,我可以想到三种伪造方法。 1.The Ugly Way :

  • 我想要实现的是,我有一个来自UI的REST调用,它调用添加一个用户。因此,用户必须执行异步队列(这是一个约束),但在将结果发送回UI之前,必须等待响应队列一段配置的时间并对其进行处理。如果队列返回时引用号为空,那么我必须删除用户记录并抛出异常,说明用户无效。如果响应返回时引用有效(或者超时发生),那么我假设它有效并返回success。 我有一个应用程序,我在其中发送一条队列消息,以获取我的用户对象

  • 问题内容: 我有一个单一的线程生产者,它创建了一些任务对象,然后将它们添加到一个(大小固定的)对象中。 我还启动了一个多线程使用者。这是作为固定线程池()构建的。然后,我向该threadPool提交一些ConsumerWorker实例,每个ConsumerWorker都引用了上述ArrayBlockingQueue实例。 每个这样的Worker将在队列中执行并处理任务。 我的问题是,什么时候不再需

  • 问题内容: 在我的组织中,我们有许多Redis工作人员来完成我们的关键任务。通常,一天一次或两次,我们的工人会停止处理队列。 该代码基本上如下所示: 如果看到的话,就代码而言,发生的事情并不多,但是每隔一段时间,队列就会开始建立,并且工作程序不会从队列中弹出任何项目。为设置超时根本没有用,因为我们假设问题出在Redis客户端连接上。 目前,我们已经建立了一些侦听器,这些侦听器会在队列建立时提醒我们

  • 问题内容: 该程序在九次打印后完成: 如何停止进程(例如eclipse中的Java进程),因为它在9秒的时间限制后没有停止? 问题答案: 您遇到的问题是,取消哔声任务后,调度程序会保留活动线程。 如果存在活动的非守护程序线程,则JVM保持活动状态。 它使该线程保持不变的原因是您已在此行中告诉它这样做: 请注意以下文档: -即使在空闲状态下要保留在池中的线​​程数。 因此,您有两种可能的方法来导致J