2017-08-29 1 views
0

私はJdbcPollingChannelAdapterを使用してデータベースをポーリングし、その結果をJmsSendingMessageHandlerを使用してActivemqキューにポストするためにバネ統合を使用しています。私はMappingJackson2MessageConverterを使用してjsonの文字列としてjdbcの結果をシリアライズしています。メッセージが送信されると、arraylistとして送信されます。一度に1つのメッセージのペイロードで1つのjson-serializedオブジェクトのみを送信することは可能ですか?例えば ​​- これは私がそのようにSpring Integrationを使用して、メッセージペイロードを含む単一のjsonオブジェクト文字列を一度に送信しますか?

@JmsListener(destination = "${activemq.queue.name}") 
    public void receive(DomainObj obj) 

春の統合の設定

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

答えて

1
1つのレコードのみを取得するために、JDBCベンダーの構文を使用するようにselect文を変更

のようにキューに聞くことができるようになりますLIMIT 1

次に、setMaxRowsPerPoll()を削除します(デフォルトは0のままにしてください)。結果は1つです。

+0

ありがとうございました。私は本当に助けに感謝します。 – HaloMediaz

+0

私はそれを試しました。単一の結果が得られますが、オブジェクトはまだjson配列にシリアル化されています。結果をjsonオブジェクトにシリアル化することは可能ですか? – HaloMediaz

+1

私のapoligies;それは常にリストです。あなたは '@ Transformer'をフローに追加することができます。' public Object transform(List list){return list.get(0);} } '。 –

0

@Transformer public Object transform(List<Object> list) { return list.get(0); } SQL LIMITを使用して作業しました。これは配列の代わりにjsonオブジェクトを返す方法です。

関連する問題