2011-10-12 26 views
12

Trong tài liệu sau đây, xử lý sự kiện được mô tả như lấy nơi khai thác gỗ http://akka.io/docs/akka/1.2/general/event-handler.htmltại sao sử dụng AKKA eventhandler cho khai thác gỗ

Có một Handler tổ chức sự kiện mà mất vị trí của một hệ thống khai thác gỗ trong Akka:

akka.event.EventHandler

Cụ thể, liên kết này cung cấp một ví dụ về làm thế nào để làm điều này trong khi sử dụng slf4j: http://akka.io/docs/akka/1.2/general/slf4j.html

Câu hỏi của tôi là 'những gì thuận lợi thực hiện điều này cho? 'tại sao tôi lại làm điều này thay vì chỉ sử dụng một logger sử dụng mẫu chuẩn?'

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
... 
private static Logger log = LoggerFactory.getLogger(MyActor.class); 
... 
log.info("doing something"); 

Có một số lợi ích cơ bản tôi nhận được, dựa trên luồng hoặc bộ điều phối nội bộ, bằng cách sử dụng trình xử lý sự kiện trên mẫu nhật ký trên mà tôi không thấy? Nếu không, sử dụng trình xử lý sự kiện để ghi nhật ký có cảm giác như bị lệch khỏi một mẫu quen thuộc không có lý do rõ ràng.

Thanks cho bất kỳ đầu vào!

Trả lời

11

Logging thường có nghĩa là IO, có thể làm chậm hoạt động của mã của bạn. Trong ngữ cảnh của một diễn viên trong đó mỗi thông báo phải được xử lý một tệp trong phương thức nhận của bạn, thì trong một số trường hợp, phí trên có thể tạo ra một thứ tự (hoặc nhiều) chênh lệch độ lớn trong phương thức đó. Nó đã là một mô hình phổ biến trong các hệ thống dựa trên Erlang để di chuyển việc ghi nhật ký bên ngoài luồng điều khiển luồng (hoặc quá trình, trong quả cầu Erlang) đang chạy khối nhận. Nếu các diễn viên của bạn không phụ thuộc nhiều vào thời gian của khối nhận, bạn luôn có thể quay trở lại mẫu ghi nhật ký chuẩn nếu điều đó làm cho mọi việc dễ dàng hơn cho bạn, nhưng có thể là một ý tưởng hay để làm quen với cách tiếp cận dựa trên EventHandler.

+0

Cảm ơn Thomas, mà làm cho tốt giác quan. Tôi đã đi trước và thay đổi việc đăng nhập vào các diễn viên của mình để sử dụng các phương thức EventHandler.info() vv. Nó dường như không tôn trọng bố cục mẫu của tôi được chỉ định trong tệp log4j.xml của tôi, nhưng tôi thấy thông báo cấp INFO của mình ít nhất. –

+1

Ghi nhật ký không đồng bộ có vẻ hơi nguy hiểm. Tôi đảm bảo rằng a) các câu lệnh log xuất hiện theo thứ tự đúng và b) rằng EventHandler có thể theo kịp với phần còn lại của hệ thống (nếu đăng nhập là phần chậm nhất của hệ thống, hàng đợi đăng nhập sẽ phát triển và phát triển cho đến khi một OutOfMemory xảy ra). Nó có ý nghĩa để ghi lỗi đồng bộ không? –

+0

Nếu bạn phụ thuộc vào một trình tự cụ thể hoặc đảm bảo về việc đặt hàng, có lẽ cách tiếp cận dựa trên diễn viên không phù hợp với bạn.Điều đó nói rằng, kể từ khi đăng nhập là chính nó được xử lý bởi một diễn viên và các diễn viên được đưa ra thông điệp của họ theo thứ tự họ nhận được, điều này không phải là một vấn đề. Hơn nữa, Akka có một thông điệp rất vững chắc xếp hàng thực hiện cũng có thể điều chỉnh/điều chỉnh theo nhu cầu của bạn. Nếu bạn lo lắng về việc tràn bộ đệm (tôi không chắc chắn giới hạn của Akka là gì), bạn có thể sử dụng hàng đợi tin nhắn bị chặn và tạo trình xử lý ghi nhật ký của riêng bạn sử dụng nó. –

0

@DParsin, bạn sẽ cần phải có application.conf tập tin trong classpath của bạn với ít nhất như sau: cũng

akka { 
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"] 
    loglevel = DEBUG 
    stdout-loglevel = INFO 
} 

và sau đó dĩ nhiên chắc chắn rằng bạn đang sử dụng logback (hoặc slf4j-log4j, vv). Nếu bạn có logback-classic-1.0.0.jar trong classpath của bạn, hãy chắc chắn rằng bạn KHÔNG có bất kỳ bộ điều hợp SLF4J nào khác trong classpath của bạn.

0

Hãy cẩn thận sử dụng Slf4jEventHandler trong Akka 1.2. Bạn mất khả năng để thiết lập mức độ khai thác gỗ trên cơ sở mỗi lớp so với

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
... 
private static Logger log = LoggerFactory.getLogger(MyActor.class); 
... 
log.info("doing something"); 

Lý do là Slf4jEventHandler chỉ sử dụng một logger với tên của "akka.event.slf4j.Slf4jEventHandler"

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