2016-06-22 1 views
1

스프링 통합을 사용하는 RSS 피드 리더가 있습니다. 나는 RSS 항목의 출처를 배우고 싶다.스프링 통합 소스에서 rss feedChannel SyndEntry 메시지를 가져 오는 방법은 무엇입니까?

예 항목 :

  • 제목 : "최고 일반 : 리비아에 필요한 더 많은 지상군"
  • 링크 : "cnn.com/blabla"
  • pubDate의 "2016년 6월 22일 10 : 10 : 10 "

init() 함수에서 설정했기 때문에이 항목을 보내려는 RSS 링크를 알고 싶습니다.

결과 : http://rss.cnn.com/rss/edition.rss

가 여기 내 공급 채널 ​​설정이다.

@Bean 
public MessageChannel feedChannel() { 
return new QueueChannel(500); 
} 

이것은 동적 피드 채널 크리에이터입니다. DB에서 rss 링크를 읽고 채널을 만듭니다.

@PostConstruct 
public void init() throws Exception{ 

List<RssLink> rssLinks = rssLinkService.findAll(); 

if(rssLinks != null && rssLinks.size() > 0) 
{ 
    for(RssLink rss : rssLinks) { 
    QueueChannel channel = (QueueChannel) context.getBean("feedChannel"); 
    SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter(); 
    adapter.setApplicationContext(context); 
    adapter.setBeanName("adapter." + rss.getSource().getName()); 

    FeedEntryMessageSource source = new FeedEntryMessageSource(new URL(rss.getLink()), rss.getSource().getName()); 
    source.setApplicationContext(context); 
    source.setBeanName(rss.getSource().getDomain()); 
    source.setBeanFactory(beanFactory); 
    source.afterPropertiesSet(); 

    adapter.setSource(source); 
    adapter.setOutputChannel(channel); 
    PeriodicTrigger trigger = new PeriodicTrigger(300000); 
    adapter.setTrigger(trigger); 

    adapter.setMaxMessagesPerPoll(100); 
    adapter.setBeanFactory(beanFactory); 
    adapter.afterPropertiesSet(); 
    adapter.start(); 
    } 
} 
} 

그리고 이것은 채널의 항목을 읽는 독자입니다.

@ServiceActivator(inputChannel = "feedChannel") 
public void feedChannel(Message<SyndEntry> message) { 
    SyndEntry payload = message.getPayload(); 
    MessageHeaders header = message.getHeaders(); 
    Feed feed = new Feed(); 
    feed.setLink(payload.getLink()); 
    feed.setTitle(payload.getTitle()); 
    //feed.setSource(I don't know which rss link send me this item); 
} 

그래서 나는 항목이있는 RSS 링크를 속하는 알기 위해 ServiceActivator에서 페이로드의 FeedEntryMessageSource 가서합니다. 나는이 라인에 '. rss.getSource() getName()'을 설정합니다

FeedEntryMessageSource source = new FeedEntryMessageSource(new URL(rss.getLink()), rss.getSource().getName()); 

답변

0

난 당신이 rss.getLink()rss.getSource().getName() 사이의 직접 링크를 참조하십시오. 따라서 @ServiceActivator 번으로가는 길은 payload.getSource().getUri()이고, rssLinkService에서 원하는 name을 검색하는 방법은 어떨까요?

+0

답변 주셔서 감사 합니다만 payload.getSource()는 모든 피드에 대해 null입니다. 나는 sth을 놓친다? – Richard

관련 문제