Author: norman
Date: Fri Nov 12 19:59:51 2010
New Revision: 1034548

URL: http://svn.apache.org/viewvc?rev=1034548&view=rev
Log:
Store BlobMessage payload in different subfolders (random) to improve 
performance when you have many messages in the queue (JAMES-1129)

Modified:
    
james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobStrategy.java
    
james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobTransferPolicy.java

Modified: 
james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobStrategy.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobStrategy.java?rev=1034548&r1=1034547&r2=1034548&view=diff
==============================================================================
--- 
james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobStrategy.java
 (original)
+++ 
james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobStrategy.java
 Fri Nov 12 19:59:51 2010
@@ -47,10 +47,12 @@ public class FileSystemBlobStrategy impl
     private final FileSystem fs;
     private final BlobTransferPolicy policy;
     private final ConcurrentHashMap<String, SharedFileInputStream> map = new 
ConcurrentHashMap<String, SharedFileInputStream>();
+    private int splitCount;
 
-    public FileSystemBlobStrategy(final BlobTransferPolicy policy, final 
FileSystem fs) {
+    public FileSystemBlobStrategy(final BlobTransferPolicy policy, final 
FileSystem fs, int splitCount) {
         this.fs = fs;
         this.policy = policy;
+        this.splitCount = splitCount;
     }
     
     /*
@@ -141,9 +143,15 @@ public class FileSystemBlobStrategy impl
      * @throws JMSException
      * @throws FileNotFoundException
      */
-    protected File getFile(ActiveMQBlobMessage message) throws JMSException, 
FileNotFoundException {
+    protected File getFile(ActiveMQBlobMessage message) throws JMSException, 
IOException {
+        if (message.getURL() != null) {
+            return fs.getFile(message.getURL().toString());
+        }
         String mailname = message.getStringProperty(JAMES_MAIL_NAME);
-        String queueUrl = policy.getUploadUrl() + "/";
+        int i = (int) (Math.random()*splitCount+1);
+
+        String queueUrl = policy.getUploadUrl() + "/" +i;
+
         File queueF = fs.getFile(queueUrl);
         
         // check if we need to create the queue folder

Modified: 
james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobTransferPolicy.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobTransferPolicy.java?rev=1034548&r1=1034547&r2=1034548&view=diff
==============================================================================
--- 
james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobTransferPolicy.java
 (original)
+++ 
james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobTransferPolicy.java
 Fri Nov 12 19:59:51 2010
@@ -33,11 +33,17 @@ import org.apache.james.services.FileSys
 public class FileSystemBlobTransferPolicy extends BlobTransferPolicy{
 
     private FileSystem fs;
+    private int splitCount = 10;
+    private FileSystemBlobStrategy strategy;
 
     @Resource(name="filesystem")
     public void setFileSystem(FileSystem fs) {
         this.fs = fs;
     }
+    
+    public void setSplitCount(int splitCount) {
+        this.splitCount  = splitCount;
+    }
 
     @Override
     public BlobTransferPolicy copy() {
@@ -53,12 +59,18 @@ public class FileSystemBlobTransferPolic
     
     @Override
     protected BlobDownloadStrategy createDownloadStrategy() {
-        return new FileSystemBlobStrategy(this, fs);
+        return getStrategy();
     }
 
     @Override
     protected BlobUploadStrategy createUploadStrategy() {
-        return new FileSystemBlobStrategy(this, fs);
+        return getStrategy();
     }
 
+    private synchronized FileSystemBlobStrategy getStrategy() {
+        if (strategy == null) {
+            strategy = new FileSystemBlobStrategy(this, fs, splitCount);
+        }
+        return strategy;
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to