ActiveMq - Kaha - 商店被锁定...等待10秒才能解锁商店

时间:2011-11-01 08:08:12

标签: spring activemq

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

10:02:41,541 INFO KahaStore:463 - Kaha Store使用数据目录\ tmp \ kahadb 10:02:41,542 INFO KahaPersistenceAdapter:185 - 商店被锁定...等待10秒钟才能解锁商店。 10:02:51,542 INFO KahaStore:463 - Kaha Store使用数据目录\ tmp \ kahadb 10:02:51,543 INFO KahaPersistenceAdapter:185 - 商店被锁定...等待10秒才能解锁商店。 10:03:01,543 INFO KahaStore:463 - 使用数据目录\ tmp \ kahadb的Kaha Store ..

这是我的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 -->

2 个答案:

答案 0 :(得分:2)

好吧,我自己解决了这个问题。 BTW感谢jkysam的评论。

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

我所做的是我从applicationContext中分离了与jms相关的配置。因此,我创建了一个名为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();
    }
}

BTW,我排除了与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"/>

答案 1 :(得分:1)

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

如果这些方案中没有一个适用于您的情况,您可能遇到了代理的合法问题,但您需要提供有关如何使锁定检查代码失败的更多详细信息。