ActiveMq - Kaha - Магазин заблокирован ... ждет 10 секунд, пока Магазин будет разблокирован - PullRequest
3 голосов
/ 01 ноября 2011

У меня в приложении две очереди (Spring3-Hibernate-ActiveMq).Спасибо за ваши комментарии заранее.Я был бы рад, если бы вы помогли мне избежать следующей ошибки:

10: 02: 41,541 INFO KahaStore: 463 - Хранить Kaha с использованием каталога данных \ tmp \ kahadb 10: 02: 41,542 INFO KahaPersistenceAdapter: 185 - Store isзаблокирован ... ожидание 10 секунд до открытия магазина.10: 02: 51,542 ИНФОРМАЦИЯ KahaStore: 463 - хранилище Kaha с использованием каталога данных \ tmp \ kahadb 10: 02: 51,543 ИНФОРМАЦИЯ KahaPersistenceAdapter: 185 - Магазин заблокирован ... ожидает 10 секунд, пока Магазин будет разблокирован.10: 03: 01,543 ИНФОРМАЦИЯ KahaStore: 463 - Магазин Kaha с использованием каталога данных \ tmp \ kahadb ...

А вот мое приложениеContext.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 ]

2 голосов
/ 03 ноября 2011

Ну, я решил проблему сам. Кстати, спасибо jkysam за ваши комментарии.

Проблема возникла из-за загрузки applicationContext более одного раза. Поэтому каждый раз, когда загружается applicationContext, создается новый экземпляр kaha db, и это приводит к блокировке.

Что я сделал, так это отделил конфигурацию, связанную с jms, от applicationContext. Итак, я создал новый контекстный XML-файл с именем jmsContext.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"/>
1 голос
/ 02 ноября 2011

Каха - это хранилище постоянных данных ActiveMQ, и в нем есть файл блокировки, который предотвращает одновременный доступ к нему нескольких процессов AMQ. При чистом выходе эта блокировка всегда будет удалена, но если по какой-либо причине процесс не завершился правильно, блокировка может не быть удалена. Кроме того, если вы используете несколько брокеров, они могут по умолчанию использовать одно и то же местоположение Kaha, в вашем случае \ tmp \ kahadb, и один из них не попадет в магазин. См. Ссылку Kaha для способа перенастройки местоположения.

Если ни один из этих сценариев не применим к вашей ситуации, возможно, вы столкнулись с допустимой проблемой с брокером, но вам необходимо предоставить более подробную информацию о том, как заставить код проверки блокировки завершиться с ошибкой.

...