我将使用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();
}
}