【问题标题】:ActiveMq - Kaha - Store is locked... waiting 10 seconds for the Store to be unlockedActiveMq - Kaha - 商店已锁定...等待 10 秒以解锁商店
【发布时间】:2011-11-01 08:08:12
【问题描述】:

我的应用程序(Spring3-Hibernate-ActiveMq)上有两个队列。提前感谢您的 cmets。如果您能帮我避免以下错误,我会很高兴:

10:02:41,541 INFO KahaStore:463 - Kaha Store 使用数据目录 \tmp\kahadb 10:02:41,542 信息 KahaPersistenceAdapter:185 - 存储已锁定...等待 10 秒以解锁存储。 10:02:51,542 信息 KahaStore:463 - Kaha Store 使用数据目录 \tmp\kahadb 10:02:51,543 信息 KahaPersistenceAdapter:185 - 存储已锁定...等待 10 秒以解锁存储。 10:03:01,543 信息 KahaStore:463 - Kaha Store 使用数据目录 \tmp\kahadb .. .

这是我的 applicationContext.xml

<amq:connectionFactory id="amqConnectionFactory"
    brokerURL="vm://localhost" />

<bean id="connectionFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <constructor-arg ref="amqConnectionFactory" />  
    <property name="sessionCacheSize" value="100" />
</bean>

<bean id="jmsTemplateForProduct" class="org.springframework.jms.core.JmsTemplate"
    p:defaultDestinationName="Click.Queue.Product">
    <constructor-arg ref="connectionFactory" /> 
</bean>

<bean id="jmsTemplateForPayment" class="org.springframework.jms.core.JmsTemplate"
    p:defaultDestinationName="Click.Queue.Payment">
    <constructor-arg ref="connectionFactory" /> 
</bean>

<jms:listener-container concurrency="10">
    <jms:listener id="ProductListener" destination="Click.Queue.Product"
        ref="productListener" />
</jms:listener-container>

<jms:listener-container concurrency="10">
    <jms:listener id="PaymentListener" destination="Click.Queue.Payment"
        ref="paymentListener" />
</jms:listener-container>
<!-- ActiveMQ ends -->

【问题讨论】:

    标签: spring activemq


    【解决方案1】:

    嗯,我自己解决了这个问题。顺便说一句,感谢 jkysam 的 cmets。

    问题是由于多次加载 applicationContext 而发生的。因此,无论何时加载 applicationContext,都会创建一个新的 kaha db 实例并导致锁定。

    我所做的是将 jms 相关的配置从 applicationContext 中分离出来。因此,我创建了一个名为 jmsContext.xml 的新上下文 xml 文件,并将 jms(以及 activemq)相关的配置行移动到该文件中。然后在我的测试类中,我加载了不同的上下文 xml,这取决于它是否是 jmsTest。

    例如;我有两个 GenericUnitTest 类以分离上下文配置。首先是:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"/jmsContext.xml"})
    public abstract class GenericJmsUnitTest {  
    }   
    

    第二个是:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"/applicationContext.xml"})
    public abstract class GenericUnitTest { 
    }   
    

    然后我根据测试用例扩展这些类。这是一个例子;

    public class ProductQueueTest extends GenericJmsUnitTest{  
    @Autowired
    private ProductQueueService productQueueService;
    
    @Test
        public void productTest() {   
         productQueueService.sendProduct(); 
        }
    }
    

    非jms测试类样本为:

    public class SchedularTest extends GenericUnitTest {
        @Autowired
        private Processor schedulerProcessor;
    
        @Test
         public void scheduleForProduct() {
            schedulerProcessor.processForProducts();
        }
    }
    

    顺便说一句,我在 applicationContext.xml 中排除了与队列有关的组件扫描过滤器,并将它们包含在 jmsContext.xml 中。这是一个例子;

    applicationContext xml 在下面

    <context:component-scan base-package="com.project">
      <context:exclude-filter type="regex" expression="com.project.queue.*"/>
      <context:exclude-filter type="regex" expression="com.project.test.queue.*"/>
    </context:component-scan>
    

    jmsContext xml 在下面

     <context:component-scan base-package="com.project.queue"/>
     <context:component-scan base-package="com.project.test.queue"/>
    

    【讨论】:

      【解决方案2】:

      Kaha 是 ActiveMQ 的持久化存储,它有一个锁文件,可以防止多个 AMQ 进程同时访问它。在干净退出时,此锁将始终被删除,但如果由于任何原因该过程未正确完成,则该锁可能不会被删除。此外,如果您运行多个代理,他们可能会默认使用相同的 Kaha 位置,在您的情况下为 \tmp\kahadb,其中一个不会进入商店。有关重新配置位置的方法,请参阅 Kaha 链接。

      如果这两种情况都不适用于您的情况,您可能遇到了与代理有关的合法问题,但您需要提供有关如何使锁定检查代码失败的更多详细信息。

      【讨论】:

      • 嗨,首先谢谢。其实我有两个队列,可能是kaha被锁定的原因,你也是这个意思?
      • 不,2 个队列不应锁定您的 kahadb。 kahadb 被使用它的 AMQ 进程锁定。如果您知道您没有运行 2 个 AMQ 进程,您可以删除锁定文件。在您的 \tmp\kahadb 目录下有一个名为 lock 的文件。只需删除它,事情就会重新启动。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2012-03-11
      • 2019-07-18
      • 2016-03-04
      • 2018-11-19
      • 2018-06-18
      相关资源
      最近更新 更多