2016-06-22 29 views
1

Ich habe einen RSS-Feed-Reader mit Federintegration. Ich möchte Quelle eines RSS-Artikels lernen.Wie bekomme ich die Quelle von rss feedChannel SyndIntry-Nachricht in Spring Integration?

Beispielartikel:

  • Titel: "Top allgemein: Mehr Bodentruppen benötigt in Libyen"
  • link: "cnn.com/blabla"
  • pubDate: „2016.06.22 10 : 10: 10 "

Ich möchte wissen, in welche rss link mir dieses Element senden, weil ich es in init() -Funktion gesetzt habe.

Ergebnis: http://rss.cnn.com/rss/edition.rss

Hier ist mein Zuführkanal Konfig.

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

Dies ist ein dynamischer FeedChannel Creater. Ich lese rss Links von DB und create channel.

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

Und das ist der Leser der Elemente in einem Kanal.

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

So will ich gehen FeedEntryMessageSource von Nutzlast in ServiceActivator erhalten, um den Artikel zu wissen, gehört die RSS-Link. Ich habe es rss.getSource() getName(). "In dieser Zeile:

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

Antwort

0

Ich sehe, Sie haben eine direkte Verbindung zwischen rss.getLink() und rss.getSource().getName(). Also, wie wäre es, in Ihrem @ServiceActivator wie payload.getSource().getUri() gehen und einen gewünschten name von Ihrem rssLinkService abrufen.

+0

Danke für die Antwort aber Payload.getSource() ist null für alle Feeds. vermisse ich etw? – Richard