2017-09-12 10 views
0

私は安らかなWebサービスに接続し、そこからデータを取得するために、スプリング(ブート)の統合を使用して、ここに私のコードの一部です:春ために、ブート統合URLのページネーションソリューション

@Bean 
public PollerMetadata downloadTrigger() 
{ 
    PeriodicTrigger trigger = new PeriodicTrigger(config.getDownloadInterval()); 
    trigger.setFixedRate(true); 
    PollerMetadata pollerMetadata = new PollerMetadata(); 
    pollerMetadata.setTrigger(trigger); 
    pollerMetadata.setMaxMessagesPerPoll(1); 
    return pollerMetadata; 
} 

@Bean(name = PollerMetadata.DEFAULT_POLLER) 
public PollerMetadata poller() 
{ 
    PeriodicTrigger trigger = new PeriodicTrigger(10); 
    trigger.setFixedRate(true); 
    PollerMetadata pollerMetadata = new PollerMetadata(); 
    pollerMetadata.setTrigger(trigger); 
    return pollerMetadata; 
} 

@InboundChannelAdapter(value = "channel1", poller = @Poller("downloadTrigger")) 
public ResponseEntity<AppsItem[]> download() 
{ 
    String url = "https://example.com/?page{pageNumber}"; 
    try 
    { 
     SSLUtil.turnOffSslChecking(); 
    } 
    catch (Exception e) 
    { 

    } 

    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setAccept(Collections.singletonList(new MediaType("application","json"))); 
    HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders); 
    template.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 


    ResponseEntity<AppsItem[]> responseEntity = template.exchange(url, HttpMethod.GET, requestEntity, AppsItem[].class, 10, 1); 


    return responseEntity; 
} 

@Splitter(inputChannel = "channel1", outputChannel = "channel2") 
public List<AppsItem> scrape(ResponseEntity<AppsItem[]> payload) 
{ 

    //do something; 
} 

あなたが見ることができるように、私はpageNumの名前で変数を受け入れるURLを持っていますが、レスポンスボディが空である間にページ番号を増やしたいのですが、私はspring integrationで実装することができません。

1 - Poller calling inbound method once peer hour 
2 - Inbound method start calling WebService from page 1 to page n. 
3 - Inbound method should pass data to next channel before fetching next page 

私は以下のようなものが必要です:

@InboundChannelAdapter(value = "channel1", poller = @Poller("downloadTrigger")) 
public ResponseEntity<AppsItem[]> download() 
{ 
    String url = "https://example.com/?page{pageNumber}"; 
    try 
    { 
     SSLUtil.turnOffSslChecking(); 
    } 
    catch (Exception e) 
    { 

    } 

    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setAccept(Collections.singletonList(new MediaType("application","json"))); 
    HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders); 
    template.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 


    ResponseEntity<AppsItem[]> responseEntity; 
     int i = 0; 
     do 
     { 
      i++; 
      responseEntity = template.exchange(url, HttpMethod.GET, requestEntity, AppsItem[].class, 10, i); 
      scraper.parse(responseEntity); 
      LOG.info("entry={}", ""); 
      //Send response to the next channel in this loop 
     } 
     while (responseEntity.hasBody()); 


    return responseEntity; 
} 

答えて

1

downloadTriggerからsetMaxMessagesPerPoll(1)を削除し、(各ポーリング上)ポーラーは、それがnullを返すまでdownload()を呼び出し続けます。

各コールでページカウントを増加させ、それ以上ページが存在しない場合はリセットします。間隔の後にポーラが次に実行されます。

+0

いくつかのコードを投稿してください。 私は春のブートで初心者です – Ali

+0

私はどのような受信方法もありません。 – Ali

+1

申し訳ありません。私はダウンロードを意味しました。内部的には、あなたを呼び出す受信メソッドがあります。 –

関連する問題