2010-08-11 28 views
7

Có ứng dụng mùa xuân (thực sự là ứng dụng grails) chạy máy chủ apache-activemq làm bean mùa xuân và vài tuyến apache-lạc đà. Ứng dụng sử dụng ngủ đông để làm việc với cơ sở dữ liệu. Vấn đề rất đơn giản. Activemq + Camel khởi động BEFORE grails tiêm các phương thức đặc biệt vào các đối tượng miền ngủ đông (thực sự là lưu/cập nhật các phương thức, vv). Vì vậy, nếu activemq đã có một số dữ liệu khi khởi động - lạc đà bắt đầu xử lý các thông điệp với các phương thức grails DAO được tiêm. Điều này không thành công với grails.lang.MissingMethodException. Phải trì hoãn khởi động activemq/camel trước khi Grails tiêm các phương thức đặc biệt vào các đối tượng miền.Làm thế nào để trì hoãn khởi động hạt đậu mùa xuân?

Trả lời

4

bạn có thể di chuyển MQ managment vào một plugin? Nó sẽ tăng tính mô đun và nếu bạn khai báo trong plugin-descriptor

def loadAfter = ['hibernate'] 

bạn nên có hành vi mong muốn. Hoạt động cho JBPM plugin

+0

Vâng, trung thực tôi sẽ KHÔNG tạo/duy trì plugin riêng biệt chỉ để khởi động AMQ sau khi ngủ đông được tải. Tôi chắc chắn rằng có cách tốt hơn. – Archer

+0

cũng trong plugin grails là thành phần. Tôi đã phát triển một số plugin cho các ứng dụng chỉ vì tôi nghĩ rằng chúng sẽ được mô đun hóa tốt hơn. Plugin cũng là một cách hữu ích để tích hợp dữ liệu hoặc hệ thống kế thừa. Bạn duy trì chúng khi bạn duy trì ứng dụng. Bạn không cần phải thả chúng vào tự nhiên. – Sammyrulez

+0

Tôi đã có nó;) Nhưng trong mọi trường hợp - tôi sẽ KHÔNG di chuyển tệp khởi tạo activemq.xml duy nhất từ ​​ứng dụng chính sang một 'thành phần' khác với cấu trúc dự án plugin grails hoàn chỉnh, đăng nó lên svn và duy trì một loạt các nguồn khác trì hoãn khởi tạo AMQ. Có cách đơn giản hơn. AMQ bean hỗ trợ 'start' tài sản mà chỉ ra nó nên được tự khởi động hay không. Sẽ sử dụng nó như bây giờ. – Archer

4

Nếu tất cả chúng được định nghĩa là đậu mùa xuân, bạn có thể sử dụng

<bean id="activeMqBean" depends-on="anotherBean" /> 

này sẽ đảm bảo anotherBean được khởi tạo trước khi activeMqBean

+0

Cảm ơn Bonzo, nhưng tôi biết câu lệnh 'phụ thuộc vào '. Thật không may nó sẽ không hoạt động như khởi tạo Grails là trên một số lớp khác nhau sau đó mùa xuân. Vì vậy, chỉ có không có bean mà activemq nên phụ thuộc vào. – Archer

3

Tôi không chắc chắn trong trường hợp của bạn nhưng tải chậm cũng có thể giúp ví dụ:

<bean id="lazybean" class="com.xxx.YourBean" lazy-init="true"> 

Đậu lười được khởi tạo chỉ ra vùng chứa IoC để tạo cá thể đậu khi được yêu cầu lần đầu tiên. Điều này có thể giúp bạn trì hoãn việc tải đậu bạn muốn.

+0

Điều này sẽ không hoạt động, vì hạt DAO của tôi chắc chắn được yêu cầu TRƯỚC KHI hibernate được tải. – Archer

0

Tôi biết câu hỏi này là khá cũ, nhưng bây giờ tôi đang đối mặt với cùng một vấn đề trong năm 2015 - và chủ đề này không cung cấp một giải pháp cho tôi.

Tôi đã đưa ra một bean xử lý tùy chỉnh có một CountDownLatch, mà tôi đếm ngược sau khi khởi động ứng dụng. Vì vậy, các tin nhắn sẽ được nhàn rỗi cho đến khi ứng dụng đã bắt đầu đầy đủ và nó làm việc cho tôi.

/** 
* bootstrap latch processor 
*/ 
@Log4j 
class BootstrapLatchProcessor implements Processor { 
    private final CountDownLatch latch = new CountDownLatch(1) 

    @Override 
    void process(Exchange exchange) throws Exception { 

     if(latch.count > 0){ 
      log.info "waiting for bootstrapped @ ${exchange.fromEndpoint}" 
      latch.await() 
     } 

     exchange.out = exchange.in 
    } 

    /** 
     * mark the application as bootstrapped 
     */ 
    public void setBootstrapped(){ 
     latch.countDown() 
    } 
} 

Sau đó, sử dụng nó như một bean trong ứng dụng của bạn và gọi phương thức setBootstrapped trong Bootstrap.groovy bạn

Sau đó, trong RouteBuilder của bạn, bạn đặt bộ xử lý giữa thiết bị đầu cuối và điểm đến của bạn cho tất cả các tuyến đường mà bạn mong đợi thông điệp đến trước khi ứng dụng đã bắt đầu:

from("activemq:a.in ").processRef('bootstrapProcessor').to("bean:handlerService?method=handle") 
Các vấn đề liên quan