Another thing I’ve played with recently is Spring Integration, adding an RSS reader to the example I’m working with. There are a lot of examples of Spring Integration about the place, but there weren’t any doing exactly what I wanted – the clearest examples tended to rely on XML rather than annotations.
(An interesting discussion on a recent Java Council podcast discussed how common it was to find obsolete answers voted up on Stack Overflow. It’s easy to find answers to technical questions these days, but sometimes it’s harder to find the most up-to-date answer).
Anyway, I put together a working, if clunky, RSS reader, and thought I would make a quick summary of the changes it required.
build.gradle
Some new dependencies were needed in build.gradle:
compile("org.springframework.boot:spring-boot-starter-integration") compile("org.springframework.integration:spring-integration-feed") compile 'com.rometools:rome:1.6.0'
resources/feed-bean.xml
For the sake of expediency, I succumbed to a little XML. With a little more time, I could transalte this into the newer annotation format:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration" xmlns:feed="http://www.springframework.org/schema/integration/feed" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd http://www.springframework.org/schema/integration/feed http://www.springframework.org/schema/integration/feed/spring-integration-feed.xsd"> <int:channel id="feedChannel"> <int:queue /> </int:channel> <feed:inbound-channel-adapter id="feedAdapter" channel="feedChannel" url="http://feeds.bbci.co.uk/news/rss.xml?edition=uk"> <int:poller fixed-rate="30000" max-messages-per-poll="100" /> </feed:inbound-channel-adapter> </beans>
Controller Java class
I added a new method to my existing controller (which is turning into a little of a catch-all class – I’ll be a little more tidy when I come to do this as part of my Java infrastructure write-up)
@PostConstruct public void setUpRssReader() { ApplicationContext context = new ClassPathXmlApplicationContext( "/feed-bean.xml"); // create a pollable channel PollableChannel feedChannel = context.getBean("feedChannel", PollableChannel.class); for (int i = 0; i < 10; i++) { // receive the message feed Message<SyndEntry> message = (Message<SyndEntry>) feedChannel.receive(1000); if (message != null) { SyndEntry entry = message.getPayload(); log.info(entry.getPublishedDate() + " - " + entry.getTitle()); Entry myEntry = new Entry(entry.getTitle(), entry.getLink()); entryRepository.save(myEntry); } else { try { Thread.sleep(10000); } catch (Throwable t) { // ignore } } } }
It’s not a particularly sophisticated example, but it illustrates how easy it is to set up simple integrations in Spring. I’m now going to proceed to set up a decent front end – once that is done, I can put it all together to make a very simple Java prototype.