如何使用JMS知道何时处理了列表的最后一条消息

时间:2015-06-10 01:29:42

标签: java spring jms

我将使用JMS异步处理的1500条记录分成更小的组(~250)。

然而,

1500也不是固定值。对于每个客户可以或多或少。在某些情况下,可能有8000种产品或更多。我将有N个客户每天进行一次,两次,三次或四次这样的操作。

我一直在将记录分成较小的组,以避免发生1500条记录的交易。

我只有在处理了所有部分时才需要启动一些任务(全部为1500)。

我该怎么做?我使用Spring 4,JMS 2,HornetQ,现在使用注释配置。

也许我没有使用JMS做正确的事情。我也需要帮助。我有一个包含1500个产品(代码,价格,库存,stock_local,标题)的XML文件(来自web服务),我必须坚持所有这些。

之后,只有在处理了所有这些之后,我才需要根据新存储的值(以及其他一些条件)启动将更新每个(进入远程系统)的Stock和Price值的任务

代码:

// in some RestController i have
Lists.partition(newProducts, 250).forEach(listPart->
    myQueue.add(createMessage(Lists.newArrayList(listPart))));

//called some times. Each message contains a list of 250 products to persist
public void add(ProductsMessage message) {
    this.jmsTemplate.send(QUEUE_NAME, session -> session.createObjectMessage(message));
}

@JmsListener(destination = QUEUE_NAME, )
public void importProducts(ProductsMessage message) { 
.... 
//at this method i get message.getList and persist all 250 products
}

实际配置JMS:

@Configuration
@EnableJms
public class JmsConfig {

public static final int DELIVERY_DELAY = 1000;
public static final int SESSION_CACHE_SIZE = 10;

@Bean
@Autowired
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(PlatformTransactionManager transactionManager) {
    DefaultJmsListenerContainerFactory factory =
            new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setDestinationResolver(destinationResolver());
    factory.setConcurrency("1-2");
    factory.setTransactionManager(transactionManager);


    return factory;
}

@Bean
public DestinationResolver destinationResolver() {
    return new DynamicDestinationResolver();
}

@Bean
public ConnectionFactory connectionFactory() {

    TransportConfiguration transport = new TransportConfiguration(InVMConnectorFactory.class.getName());
    ConnectionFactory originalConnectionFactory = HornetQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transport);

    CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
    connectionFactory.setTargetConnectionFactory(originalConnectionFactory);
    connectionFactory.setSessionCacheSize(SESSION_CACHE_SIZE);

    return connectionFactory;
}

@Bean
public JmsTemplate template(ConnectionFactory connectionFactory) {
    JmsTemplate template = new JmsTemplate();
    template.setConnectionFactory(connectionFactory);
    template.setDeliveryDelay(DELIVERY_DELAY);
    template.setSessionTransacted(true);
    return template;
}

/**
 * Inicializa um broker JMS embarcado
 */
@Bean(initMethod = "start", destroyMethod = "stop")
public EmbeddedJMS startJmsBroker() {
    return new EmbeddedJMS();
}

}

0 个答案:

没有答案