INT-1527, INT-786 refactoread and renamed MetadataPersister to MetadataSore strategy, provided a very simple file-based implementation as FileBasedPropertiesStore which ises DefaultPropertiesPersister, modified FEED module to depend on it

This commit is contained in:
Oleg Zhurakousky
2010-10-17 22:35:35 -04:00
parent 6adb950390
commit 3bf404cc2a
13 changed files with 162 additions and 426 deletions

View File

@@ -15,10 +15,6 @@
*/
package org.springframework.integration.feed;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@@ -28,10 +24,11 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import org.springframework.integration.Message;
import org.springframework.integration.context.IntegrationObjectSupport;
import org.springframework.integration.context.metadata.FileBasedPropertiesStore;
import org.springframework.integration.context.metadata.MetadataStore;
import org.springframework.integration.core.MessageSource;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.util.Assert;
import org.springframework.util.DefaultPropertiesPersister;
import org.springframework.util.StringUtils;
import com.sun.syndication.feed.synd.SyndEntry;
@@ -46,18 +43,17 @@ import com.sun.syndication.feed.synd.SyndFeed;
* @author Oleg Zhurakousky
*/
public class FeedEntryReaderMessageSource extends IntegrationObjectSupport implements MessageSource<SyndEntry>{
private final DefaultPropertiesPersister persister = new DefaultPropertiesPersister();
private volatile MetadataStore metadataStore;
private volatile Properties lastPersistentEntry = new Properties();
private volatile Queue<SyndEntry> entries = new ConcurrentLinkedQueue<SyndEntry>();
private volatile FeedReaderMessageSource feedReaderMessageSource;
private final Object monitor = new Object();
private volatile String feedMetadataIdKey;
private volatile String persistentIdentifier;
private volatile boolean initialized;
private volatile long lastTime = -1;
private volatile File persisterFile;
private Comparator<SyndEntry> syndEntryComparator = new Comparator<SyndEntry>() {
public int compare(SyndEntry syndEntry, SyndEntry syndEntry1) {
long x = syndEntry.getPublishedDate().getTime() -
@@ -81,6 +77,10 @@ public class FeedEntryReaderMessageSource extends IntegrationObjectSupport imple
this.persistentIdentifier = persistentIdentifier;
}
public void setMetadataStore(MetadataStore metadataStore) {
this.metadataStore = metadataStore;
}
public String getComponentType(){
return "feed:inbound-channel-adapter";
}
@@ -125,14 +125,11 @@ public class FeedEntryReaderMessageSource extends IntegrationObjectSupport imple
@Override
protected void onInit() throws Exception {
if (StringUtils.hasText(this.persistentIdentifier)){
File dir = new File(System.getProperty("user.home") + "/temp/spring-integration");
dir.mkdirs();
persisterFile = new File(dir, this.persistentIdentifier + ".last.entry");
if (!persisterFile.exists()){
persisterFile.createNewFile();
}
FileInputStream inStream = new FileInputStream(persisterFile);
persister.load(lastPersistentEntry, inStream);
if (this.metadataStore == null){
logger.info("Creating FileBasedPropertiesStore");
metadataStore = new FileBasedPropertiesStore(this.persistentIdentifier);
}
lastPersistentEntry = metadataStore.load();
}
else {
logger.info("Your '" + this.getComponentType() + "' is anonymous (no ID attribute), therefore no feed entries will be persisted " +
@@ -158,26 +155,8 @@ public class FeedEntryReaderMessageSource extends IntegrationObjectSupport imple
this.lastTime = next.getPublishedDate().getTime();
this.lastPersistentEntry.put(this.feedMetadataIdKey, this.lastTime + "");
if (persisterFile != null){
FileOutputStream fo = null;
try {
fo = new FileOutputStream(persisterFile);
persister.store(this.lastPersistentEntry, fo, "Last feed entry");
}
catch (IOException e) {
// not fatal for the functionality of the component
logger.warn("Failed to persist feed entry. This may result in a duplicate " +
"feed entry after this component is restarted", e);
}
finally {
try {
fo.close();
}
catch (IOException e) {
// not fatal for the functionality of he component
logger.warn("Failed to close output stream to " + persisterFile.getAbsolutePath(), e);
}
}
if (metadataStore != null){
metadataStore.write(this.lastPersistentEntry);
}
return next;

View File

@@ -41,7 +41,7 @@ import com.sun.syndication.feed.synd.SyndFeed;
public class FeedEntryReaderMessageSourceTests {
@Before
public void prepare(){
File persisterFile = new File(System.getProperty("user.home") + "/temp/spring-integration", "feedReader.last.entry");
File persisterFile = new File(System.getProperty("java.io.tmpdir") + "spring-integration/", "feedReader.last.entry");
if (persisterFile.exists()){
persisterFile.delete();
}

View File

@@ -56,7 +56,7 @@ public class FeedMessageSourceBeanDefinitionParserTests {
private static CountDownLatch latch;
@Before
public void prepare(){
File persisterFile = new File(System.getProperty("user.home") + "/temp/spring-integration", "feedAdapter.last.entry");
File persisterFile = new File(System.getProperty("java.io.tmpdir") + "spring-integration/", "feedAdapter.last.entry");
if (persisterFile.exists()){
persisterFile.delete();
}
@@ -84,7 +84,7 @@ public class FeedMessageSourceBeanDefinitionParserTests {
@Test
public void validateSuccessfullNewsRetrievalWithFileUrlAndMessageHistory() throws Exception{
File persisterFile = new File(System.getProperty("user.home") + "/temp/spring-integration", "feedAdapterUsage.last.entry");
File persisterFile = new File(System.getProperty("java.io.tmpdir") + "spring-integration/", "feedAdapterUsage.last.entry");
if (persisterFile.exists()){
persisterFile.delete();
}