2017-08-29 2 views
0

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; 
     } 
    } 

Répondre

1

Modifier votre instruction select d'utiliser la syntaxe du fournisseur JDBC pour ne récupérer un enregistrement - par exemple LIMIT 1.

Ensuite, retirez le setMaxRowsPerPoll() (laissez-le par défaut à 0) et vous obtiendrez le résultat unique.

+0

Merci. J'apprécie vraiment l'aide. – HaloMediaz

+0

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

+1

Mes apoligies; c'est toujours une liste; vous pouvez ajouter un @ Transformer' au flux 'public Transformer l'objet (liste List ) {return list.get (0); } '. –

0

@Transformer public Object transform(List<Object> list) { return list.get(0); } travaillé avec l'utilisation d'une limite SQL. C'est ainsi que vous obtenez un objet json au lieu d'un tableau.