2009-07-26 25 views
7

Tôi có một ứng dụng Grails có một số tối ưu hóa tính toán chuyên sâu với thời gian chạy ~ 5 phút (có lẽ nhiều hơn). Hiện tại, tôi đang làm điều này trong chuỗi yêu cầu chính, nghĩa là phải mất 5 phút để yêu cầu trả lại. Nó hoạt động, nhưng tất nhiên là khủng khiếp từ một góc nhìn khả năng sử dụng.Cách tốt nhất để tạo hàng đợi cho các công việc lâu dài trong ứng dụng Grails là gì?

Vậy cách tốt nhất để thực hiện điều này theo cách không đồng bộ là gì? Tôi giả sử một ThreadPoolExecutor sẽ phải được tham gia, nhưng làm thế nào để tôi bắt đầu và truy cập nó? Tôi có thể mô hình hóa nó như một dịch vụ Grails không? Hoặc một công việc (có vẻ như là những người chỉ có nghĩa là cho công việc định kỳ mặc dù)?

Ngoài ra, cách tốt nhất để xử lý trạng thái công việc là gì? Thông qua một lá cờ hoặc có lẽ là một lớp học hoàn toàn mới trong DB? Trình duyệt có hiển thị trình quay vòng và tiếp tục bỏ phiếu cho đến khi trạng thái thay đổi không?

Trả lời

3

Có một plugin grails background-thread có thể chỉ là những gì bạn đang tìm kiếm.

Tất nhiên, bạn có thể cuộn nhóm tổng hợp của riêng mình hoặc sử dụng công cụ Java hiện có.

3

Tôi sẽ sử dụng grails JMS Plugin cho việc này.

Sau đó, bạn có thể tạo ra một dịch vụ với một phương pháp "onMessage" tương tác tự động với một nhà cung cấp jms cơ bản (như OpenMQ hoặc ActiveMQ.

Nó làm cho loại điều khá dễ dàng.

+0

Lợi ích gì so với việc sử dụng ThreadPoolExecutor? Nghe có vẻ phức tạp hơn thế. –

+0

Nó chắc chắn phức tạp hơn. Những lợi ích chính sẽ là xung quanh một số khả năng giám sát và bỏ phiếu mà câu hỏi của bạn ám chỉ đến một số yêu cầu xung quanh. Rất nhiều loại công cụ này được giải quyết trong thế giới JMS, nhưng có nhiều thiết lập/bảo trì xung quanh nó. Nó thực sự phụ thuộc vào cách "enterprisey" yêu cầu của bạn. Nếu bạn không quan tâm nhiều đến việc giám sát hoặc điều gì sẽ xảy ra nếu thùng chứa của bạn bị hỏng khi đang xử lý, thì tôi sẽ làm điều gì đó đơn giản hơn. Chỉ là một lựa chọn tiềm năng. –

+1

Ah, tôi hiểu rồi. Vâng, giám sát duy nhất tôi cần là dành cho người dùng đang chờ một công việc cụ thể hoàn thành. Tôi không cần an toàn giao dịch, vì vậy tôi sẽ đi cho một cách tiếp cận đơn giản hơn. –

2

Với tinh thần "Điều đơn giản nhất có thể làm việc" Tôi đã làm một cái gì đó như thế này như một dịch vụ đơn giản. (Tất nhiên nó có thể là quá đơn giản, những lời chỉ trích được hoan nghênh)

Tôi đã sử dụng tính năng của Groovy. sẽ đóng cửa. Xem http://groovy.codehaus.org/groovy-jdk/java/lang/Thread.html

tôi thực hiện một phương pháp trên một dịch vụ mà trông giống như:

synchronized def runThreadedTask() { 
    if(taskRunning) { 
    // taskRunning is defined as a service level flag to monitor job status 
    // if we are already running the task just return 
    return; 
    } 

    Thread.start { 
    taskRunning = true 
    // do job processing here 
    taskRunning = false 
    } 
} 
1

grails cài đặt plugin nền sợi

def backgroundService

backgroundService.execute ("làm điều tôi", {

// làm việc ở đây

});

3

Plugin chủ đề nền là lỗi thời vì vậy tôi sẽ không khuyên bạn nên sử dụng nó và JMS có vẻ quá mức cần thiết để xử lý nền. JMS có nhiều hàng đợi tin nhắn hơn là tiện ích xử lý nền.

Tôi khuyên bạn nên sử dụng plugin Quartz hoặc sử dụng gpars.

1

Đã lâu rồi kể từ khi được hỏi, nhưng vì nó chỉ xuất hiện trong một tìm kiếm, tôi nghĩ rằng tôi sẽ thêm rằng hiện tại có một kết thúc luồng Groovy trong đối tượng Thread. Bạn chỉ cần sử dụng:

 
Thread.start { 
    // async code goes here 
} 

và gọi nó là một ngày. Mã async của bạn có thể gọi một phương thức dữ liệu cập nhật hoặc một cái gì đó khi nó được thực hiện - bạn có thể muốn đồng bộ hóa nếu bạn có thể chạy nhiều luồng.

Các vấn đề liên quan