J'utilise l'intégration de printemps pour interroger une base de données à l'aide d'un JdbcPollingChannelAdapter, puis publier les résultats dans une file d'attente Activemq à l'aide de JmsSendingMessageHandler. Je sérialise les résultats de jdbc en tant que chaîne de json using un MappingJackson2MessageConverter. Lorsque le message est envoyé, il est envoyé en tant qu'arrayage. Est-il possible d'envoyer un seul objet json-sérialisé avec la charge utile d'un message à la fois? Cela me permettrait d'écouter ensuite sur la file d'attente comme siEnvoyer une seule chaîne d'objet json avec une charge utile de message à la fois avec Spring Integration?
@JmsListener(destination = "${activemq.queue.name}")
public void receive(DomainObj obj)
Configuration de l'intégration Spring
@Configuration
public class SpringIntegrationConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringIntegrationConfig.class);
@Value("${database.polling-interval.rate-in-milliseconds}")
private Long pollingRateInMilliSeconds;
@Value("${database.max-messages-per-poll}")
private Long maxMessagesPerPoll;
@Bean
public MessageChannel helloWorldChannel() {
return new DirectChannel();
}
@Bean
public PollerMetadata poller(PlatformTransactionManager transactionManager) {
PeriodicTrigger trigger = new PeriodicTrigger(pollingRateInMilliSeconds);
trigger.setFixedRate(true);
MatchAlwaysTransactionAttributeSource attributeSource = new MatchAlwaysTransactionAttributeSource();
attributeSource.setTransactionAttribute(new DefaultTransactionAttribute());
TransactionInterceptor interceptor = new TransactionInterceptor(transactionManager, attributeSource);
PollerMetadata poller = new PollerMetadata();
poller.setTrigger(trigger);
poller.setMaxMessagesPerPoll(maxMessagesPerPoll);
poller.setAdviceChain(Collections.singletonList(interceptor));
return poller;
}
@Bean
@InboundChannelAdapter(value = "helloWorldChannel", channel = "helloWorldChannel", poller = @Poller("poller"))
public MessageSource<?> helloWorldMessageSource(DataSource dataSource) {
JdbcPollingChannelAdapter adapter = new JdbcPollingChannelAdapter(dataSource, "select * from item where type = 2");
adapter.setUpdateSql("update item set type = 10 where id in (:id)");
adapter.setRowMapper(new ItemRowMapper());
adapter.setMaxRowsPerPoll(maxMessagesPerPoll.intValue());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "helloWorldChannel")
public MessageHandler jsmOutboundAdapter(JmsTemplate template, Queue queue, MessageConverter converter) {
template.setMessageConverter(converter);
JmsSendingMessageHandler handler = new JmsSendingMessageHandler(template);
handler.setDestination(queue);
return handler;
}
@Bean // Serialize message content to json using TextMessage
public MessageConverter jsonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
}
Merci. J'apprécie vraiment l'aide. – HaloMediaz
Je viens de l'essayer. Il obtient un résultat unique, mais l'objet est toujours sérialisé dans un tableau json. Est-il possible d'avoir le résultat sérialisé à un objet JSON? – HaloMediaz
Mes apoligies; c'est toujours une liste; vous pouvez ajouter un @ Transformer' au flux 'public Transformer l'objet (liste List