我的应用程序上有两个队列(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 -->
答案 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链接。
如果这些方案中没有一个适用于您的情况,您可能遇到了代理的合法问题,但您需要提供有关如何使锁定检查代码失败的更多详细信息。