2008-12-21 11 views
6

Chúng tôi đã cấp phép một sản phẩm thương mại (sản phẩm không quan trọng trong ngữ cảnh này), bị giới hạn bởi số lượng người dùng đồng thời. Người dùng truy cập sản phẩm này bằng cách đi qua bộ điều khiển Spring.Giới hạn quyền truy cập vào bộ điều khiển MVC Spring - N phiên tại một thời điểm

Chúng tôi có N giấy phép cho sản phẩm này và nếu người dùng N + 1 truy cập vào sản phẩm, họ sẽ nhận được thông báo lỗi khó chịu về việc cần mua thêm giấy phép. Tôi muốn đảm bảo rằng người dùng không thấy thông báo này và muốn các yêu cầu đó đến sản phẩm chỉ đơn giản là "xếp hàng", thay vì có người dùng N + 1 thực sự truy cập vào nó. Tất nhiên, họ muốn tôi mua giấy phép hơn, vì vậy công cụ của họ sẽ không cho phép chúng tôi làm điều này một cách tự nhiên.

Thay vì có thể điều khiển công cụ, tôi muốn giới hạn số lượng phiên đồng thời cho bộ điều khiển để không bao giờ lớn hơn N. Mọi người khác có thể đợi.

Chúng tôi đang sử dụng Spring MVC.

Bất kỳ ý tưởng nào?

Trả lời

7

Điều bạn cần là ObjectPool. Kiểm tra Hồ bơi Apache Commons http://commons.apache.org/pool

Khi khởi động ứng dụng, bạn nên tạo một Object Pool với giấy phép hoặc đối tượng của thư viện thương mại (Không chắc chắn loại giao diện công khai nào họ có).

public class CommercialObjectFactory extends BasePoolableObjectFactory { 
    // for makeObject we'll simply return a new commercial object 
    @Override 
    public Object makeObject() { 
     return new CommercialObject(); 
    } 
} 

GenericObjectPool pool = new GenericObjectPool(new CommercialObjectFactory()); 

// The size of pool in our case it is N 
pool.setMaxActive(N) 
// We want to wait if the pool is exhausted 
pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK) 

Và khi bạn cần đối tượng thương mại trong mã của bạn.

CommercialObject obj = null; 
try { 
    obj = (CommercialObject)pool.borrowObject(); 

    // use the commerical object the way you to use it. 
    // .... 

} finally { 
    // be nice return the borrwed object 
    try { 
     if(obj != null) { 
      pool.returnObject(obj); 
     } 
    } catch(Exception e) { 
     // ignored 
    } 
} 

Nếu đây không phải là thứ bạn muốn thì bạn sẽ cần cung cấp thêm chi tiết về thư viện thương mại của mình.

0

Tôi đang nghĩ về một SessionListener để tăng số khi phiên được tạo và giảm khi phiên bị vô hiệu hoặc hết thời gian và một khía cạnh để bảo vệ cuộc gọi đến URL. Nhưng một thiết kế rõ ràng kết hôn với hai ý tưởng với nhau là eluding tôi.

3

Mùa xuân có org.springframework.aop.interceptor.ConcurrencyThrottleInterceptor có thể được sử dụng thông qua AOP (hoặc mã cơ bản có thể được sử dụng độc lập). Đó có thể là một cách tiếp cận trọng lượng nhẹ hơn so với việc sử dụng một nhóm đối tượng.