我希望使用以下代码从Java Spring中的RSS Feed接收数据:
package org.springframework.integration.samples.feed;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.messaging.Message;
import org.springframework.messaging.PollableChannel;
import com.rometools.rome.feed.synd.SyndEntry;
public class Feed {
public static void main(String[] args) {
ConfigurableApplicationContext ac =
new ClassPathXmlApplicationContext("META-INF/spring/integration/FeedInboundChannelAdapterSample-context.xml");
PollableChannel feedChannel = ac.getBean("feedChannel", PollableChannel.class);
for (int i = 0; i < 10; i++) {
Message<SyndEntry> message = (Message<SyndEntry>) feedChannel.receive(1000);
if (message != null){
SyndEntry entry = message.getPayload();
System.out.println(entry.getTitle());
}
else {
break;
}
}
ac.close();
}
}
FeedInboundChannelAdapterSample-context.xml中:
<?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:int-feed="http://www.springframework.org/schema/integration/feed"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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-feed:inbound-channel-adapter id="feedAdapter"
channel="feedChannel"
auto-startup="true"
url="http://pharmacie.lu/flux_rss.xml">
<int:poller fixed-rate="10000" max-messages-per-poll="100" />
</int-feed:inbound-channel-adapter>
<int:channel id="feedChannel">
<int:queue/>
</int:channel>
包含Feed的网址:http://pharmacie.lu/flux_rss.xml
问题是我收到了一条空信息,我不知道原因:
14:32:13.614 INFO [main][org.springframework.integration.config.IntegrationRegistrar] No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
14:32:13.621 DEBUG [main][org.springframework.integration.config.IntegrationRegistrar] The '#jsonPath' SpEL function cannot be registered: there is no jayway json-path.jar on the classpath.
14:32:13.621 DEBUG [main][org.springframework.integration.config.IntegrationRegistrar] SpEL function '#xpath' isn't registered: there is no spring-integration-xml.jar on the classpath.
14:32:13.739 INFO [main][org.springframework.integration.config.DefaultConfiguringBeanFactoryPostProcessor] No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
14:32:13.743 INFO [main][org.springframework.integration.config.DefaultConfiguringBeanFactoryPostProcessor] No bean named 'taskScheduler' has been explicitly defined. Therefore, a default ThreadPoolTaskScheduler will be created.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
14:32:14.075 DEBUG [main][org.springframework.integration.config.GlobalChannelInterceptorProcessor] No global channel interceptors.
14:32:14.078 INFO [main][org.springframework.integration.endpoint.EventDrivenConsumer] Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
14:32:14.078 INFO [main][org.springframework.integration.channel.PublishSubscribeChannel] Channel 'org.springframework.context.support.ClassPathXmlApplicationContext@3b764bce.errorChannel' has 1 subscriber(s).
14:32:14.078 INFO [main][org.springframework.integration.endpoint.EventDrivenConsumer] started _org.springframework.integration.errorLogger
14:32:14.080 INFO [main][org.springframework.integration.endpoint.SourcePollingChannelAdapter] started feedAdapter
14:32:14.085 TRACE [main][org.springframework.integration.channel.QueueChannel] preReceive on channel 'feedChannel'
14:32:14.125 DEBUG [task-scheduler-1][org.springframework.integration.feed.inbound.FeedEntryMessageSource] EVENT: Feed Polled. URL = http://pharmacie.lu/flux_rss.xml
14:32:14.242 DEBUG [task-scheduler-1][org.springframework.integration.feed.inbound.FeedEntryMessageSource] retrieved feed at url 'http://pharmacie.lu/flux_rss.xml'
14:32:14.243 DEBUG [task-scheduler-1][org.springframework.integration.endpoint.SourcePollingChannelAdapter] Received no Message during the poll, returning 'false'
14:32:15.086 TRACE [main][org.springframework.integration.channel.QueueChannel] postReceive on channel 'feedChannel', message is null
14:32:15.091 INFO [main][org.springframework.integration.endpoint.SourcePollingChannelAdapter] stopped feedAdapter
14:32:15.091 INFO [main][org.springframework.integration.endpoint.EventDrivenConsumer] Removing {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
14:32:15.091 INFO [main][org.springframework.integration.channel.PublishSubscribeChannel] Channel 'org.springframework.context.support.ClassPathXmlApplicationContext@3b764bce.errorChannel' has 0 subscriber(s).
14:32:15.092 INFO [main][org.springframework.integration.endpoint.EventDrivenConsumer] stopped _org.springframework.integration.errorLogger
当我使用url rss.cnn.com/rss/cnn_topstories.rss 时,代码可以运行。
(代码来自Spring Integration RSS Feed Module的一个例子 github:https://github.com/spring-projects/spring-integration-samples/tree/master/basic/feed)
我的问题是为什么上面的代码适用于示例中的url而不是url pharmacie.lu/flux_rss.xml ?
答案 0 :(得分:2)
目前,FeedEntryMessageSource中的spring-integration期望Feed的条目具有最后修改日期,但在pharmaie.lu的Feed中没有,因此忽略所有条目并且不返回任何内容。