2016-05-13 15 views
12

Trong dự án thú cưng của tôi, tôi có một công việc đang chạy dài, tôi muốn hiển thị trạng thái cho người dùng về quy trình và cách nó đi xa. Vì vậy, đang đẩy các đối tượng trạng thái vào chủ đề JMS từ đó đang chọn và đưa vào ứng dụng WS để truyền chúng tới một ứng dụng khách hợp lệ. Tôi đã viết các điểm cắt trong mùa xuân AOP (cụ thể là @Before, @AfterReturn) và gọi dịch vụ của tôi để gửi tin nhắn đến chủ đề. Bây giờ tôi muốn đăng nhập trạng thái của dịch vụ không phải trên phương thức bắt đầu hoặc sau khi trả về bên trong phương thức. Vì vậy, tôi gọi là dịch vụ (trong đó có jmsTamplete tiêm và lấy đối tượng trạng thái). Có cách nào để giảm thiểu các cuộc gọi này để tôi không thể lặp lại các cuộc gọi dịch vụ. đây là mã sudo của tôi.Làm thế nào hiệu quả là Spring AOP trong trường hợp tiêu thụ bộ nhớ

public class Myservice{ 

UserDao userDao; 
LegService legservice; 
ProviderDao providerDao; 
.... 
StatusServive statusServie; 

//aop will call the same service to send info to JMS topic 
fetchandCalculateLeg(){ 
    // here i called statusServie.senStatus(StatusObject); 
    List<Users> = userDao.fetchUserInfo(); 
    // here i called statusServie.senStatus(StatusObject); 
    .... 
    loop: #forEachUser 
    // here i called statusServie.senStatus(StatusObject); 
    someList = legservice.fecthLegInfoForEachUser(); 
    // here i called statusServie.senStatus(StatusObject); 
    :endloop; 
    .... 
} } 

Hiện tại tôi có 3 tác vụ chạy dài và tôi gọi cùng trong mỗi lớp phương pháp. tôi muốn giảm thiểu các cuộc gọi.

EDIT1: Tôi cũng có thể áp dụng AOP trên các phương thức gọi nhưng hiệu suất trong trường hợp này là gì? Làm thế nào để đo hiệu suất AOP (bao nhiêu bộ nhớ nó tiêu thụ trong quá trình ứng dụng Lên hoặc để tạo các đối tượng proxy). Xin lỗi vì đã hỏi rất nhiều câu hỏi.

+3

Tiêu đề câu hỏi của bạn dường như không được phản ánh trong câu hỏi của bạn. – bhspencer

Trả lời

4

Nếu bạn sử dụng hiệu suất AOP sẽ tốt hơn điều này vì nó được kiểm tra và tối ưu hóa khuôn khổ để thực hiện các hoạt động đó. Dù sao bạn có thể kiểm tra bằng cách trừ đi thời gian bắt đầu và kết thúc.

Bạn có thể sử dụng mã hiện tại và mã triển khai AOP để kiểm tra hiệu suất. Nó sẽ là công việc rất thú vị. Làm một cái gì đó như dưới đây để thiết lập thời gian bắt đầu và kết thúc và trừ.

System.currentTimeMillis() 

Cú pháp trên, Trả về thời gian hiện tại tính bằng mili giây. Lưu ý rằng mặc dù đơn vị thời gian của giá trị trả lại là một phần nghìn giây, độ chi tiết của giá trị phụ thuộc vào hệ điều hành cơ bản và có thể lớn hơn. Ví dụ, nhiều hệ điều hành đo thời gian theo đơn vị hàng chục mili giây. Xem mô tả của lớp Ngày để thảo luận về sự khác biệt nhỏ có thể phát sinh giữa "thời gian máy tính" và thời gian quốc tế phối hợp (UTC).

Có sẵn nhiều Khung nguồn mở AOP.

  1. Spring AOP: AOP với Spring Framework. Quảng cáo. Một trong những thành phần chính của Spring Framework là khung công tác lập trình hướng đối tượng (AOP). Lập trình hướng khía cạnh đòi hỏi phải phá vỡ logic chương trình thành các phần riêng biệt được gọi là các mối quan tâm được gọi là.

  2. AspectJ: AspectJ là một phần mở rộng theo hướng khía cạnh liền mạch với ngôn ngữ lập trình Java, nền tảng Java tương thích và dễ học và dễ sử dụng. AspectJ cho phép mô đun hóa rõ ràng các mối quan tâm xuyên suốt như: kiểm tra và xử lý lỗi, đồng bộ hóa, hành vi nhạy cảm với ngữ cảnh, tối ưu hóa hiệu năng, giám sát và ghi nhật ký, hỗ trợ gỡ lỗi, giao thức đa đối tượng.

  3. AspectWerkz: AspectWerkz là một khung công tác AOP động, nhẹ và có hiệu suất cao cho Java. AspectWerkz cung cấp cả sức mạnh và sự đơn giản và sẽ giúp bạn dễ dàng tích hợp AOP trong cả dự án mới và hiện tại. AspectWerkz sử dụng sửa đổi bytecode thời gian chạy để dệt các lớp của bạn trong thời gian chạy. Nó móc vào và dệt các lớp được nạp bởi bất kỳ trình nạp lớp nào ngoại trừ trình nạp lớp bootstrap. Nó có một mô hình điểm kết nối rất phong phú và trực giao cao. Các khía cạnh, lời khuyên và giới thiệu được viết bằng Java đơn giản và các lớp đích của bạn có thể là các POJO thông thường.Bạn có khả năng thêm, xóa và tái cấu trúc lời khuyên cũng như trao đổi việc thực hiện các giới thiệu của bạn khi chạy. Các khía cạnh của bạn có thể được định nghĩa bằng cách sử dụng tệp định nghĩa XML hoặc sử dụng thuộc tính thời gian chạy.

EDIT 1

mùa xuân cũng hỗ trợ AspectJ. Tôi đã thử nghiệm nó với AspectJ 1.7.2 nó không hiển thị rò rỉ bộ nhớ. Bạn, có thể sao chép giống nhau trong ứng dụng của bạn bằng cách tạo ra rất nhiều hạt sau đó lấy đống sau một thời gian vì việc thu gom rác đòi hỏi một thời gian nó không phải là ngay lập tức.

Như, theo thử nghiệm của tôi. Hiệu suất là phong nha với rất lớn không có cuộc gọi.

Ví dụ đơn giản là có sẵn trong MKYong: http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/

LƯU Ý: Bạn nên thay đổi hiệu suất câu hỏi của bạn được đo thời gian và không gian. Và, theo nhận xét của bạn, có vẻ như bạn đang hỏi về tối ưu hóa bộ nhớ hoặc công cụ quản lý. Ngoài ra, chủ đề câu hỏi của bạn khác với câu hỏi.

+0

@Praiyush Cảm ơn bạn đã trả lời sự cố của tôi không đúng với thời gian (mặc dù bây giờ tôi không quan tâm đến vấn đề này), tôi đặc biệt chú ý đến mức tiêu thụ bộ nhớ và đống như được đề cập ở đây [link] (https://jira.spring.io/ duyệt/SPR-11999) may mắn là họ đã sửa trong 4.2. Vì vậy, như thế này là có bất kỳ mối quan tâm bất cứ ai nhận thức được. Tôi cũng googling để tìm hiểu thêm về các loại khác nhau của tình hình một nhà phát triển phải đối mặt (không phải tất cả trong số họ, tìm kiếm chỉ phù hợp với tình hình của tôi). Vì vậy, bạn có thể sửa đổi câu trả lời của mình nếu bạn có thêm thông tin về điều này. Cảm ơn một lần nữa. – mallikarjun

+0

Cảm ơn bạn sẽ thử, bạn có thể chia sẻ kết quả kiểm tra rò rỉ bộ nhớ. – mallikarjun

2

Điều bạn đang yêu cầu không rõ ràng, tiêu đề của câu hỏi là gây hiểu lầm.

Bạn thực sự có thể sử dụng Spring Aop cho tác vụ bạn muốn làm, bạn chỉ cần tiêm với lệnh gọi nhật ký các phương thức fetchUserInfo() và fecthLegInfoForEachUser() và tương tự. Bạn cũng có thể sử dụng @Around để kiểm soát tốt hơn.

Đối với mặt hiệu suất, cho rằng đoạn mã này rất hạn chế, bạn có thể dễ dàng thực hiện một số hồ sơ với & mà không cần trên đỉnh. Hãy nhớ rằng AOP cho việc ghi nhật ký được sử dụng rất rộng rãi và Spring tạo ra các đối tượng proxy cho nhiều thực thể và mục đích, như các nhà máy, do đó được kiểm tra và thực hiện tốt.

+1

nếu bạn không hiểu câu hỏi nói như vậy trong một bình luận không có trong một câu trả lời. – bhspencer

+0

Rất tiếc, bạn đã đúng nhưng tôi không được phép nhận xét tại thời điểm đăng bài. – Maxvader

1

(1) nhiệm vụ dài chạy có nghĩa là 'công việc', vì vậy bạn có thể cần: Quartz

(2) Nếu bạn chỉ muốn biết nơi chương trình của bạn đi, bạn có thể cần một công cụ khai thác gỗ như: Logback. Một appender được xác định rõ ràng sẽ giải quyết vấn đề của bạn.

+0

SO câu trả lời không dành cho giới thiệu các công cụ hoặc thư viện. – bhspencer

3

NẾU bạn có công việc lâu dài như vậy, tại sao bạn không đặt nó vào một thời gian chạy Spring-Batch? Triển khai trình đọc tùy chỉnh -> bộ xử lý -> người viết và hệ thống sẽ làm mọi thứ cho bạn. Và để hiển thị chi tiết về các hành vi công việc như vậy, tôi đã tạo ra DTO https://gist.github.com/idyoshin/b035317db8c61b1b49ccb8898848171e và nhà sưu tập https://gist.github.com/idyoshin/74ad80841a51e1be62208f3fd58eeb6a. Tiện ích này, là công việc xung quanh, bởi vì tôi không muốn nhúng ứng dụng quản trị hàng loạt vào ứng dụng chính của mình. Tôi sử dụng chúng để hiển thị chi tiết hoạt động/lưu trữ hoạt động của các công việc cụ thể (dựa trên tên) của hệ thống của tôi.

Cũng sử dụng các tiện ích như vậy, bạn có thể triển khai bộ thu thập dữ liệu dựa trên bộ đếm thời gian tùy chỉnh, sẽ đẩy dữ liệu này đến JMS hoặc Websocket. Spring-batch cũng có các trình nghe tốt, bạn có thể thực hiện, ví dụ như org.springframework.batch.core.ChunkListener sẽ cho phép bạn thực hiện "thanh tiến trình" như cập nhật - bạn sẽ biết thời điểm đoạn tin của bạn được xử lý, và do đó cập nhật về tiến trình xuất hiện.

Ngược lại với giải pháp AOP ban đầu của bạn, phương pháp tiếp cận với lô mùa xuân sẽ trở nên eo hẹp, (mã java thuần túy), và cũng sẽ giải quyết được vấn đề bổ sung: giao dịch cập nhật lớn lâu dài: nó sẽ cắt toàn bộ tập dữ liệu thành các khối và xử lý từng đoạn trong giao dịch đơn lẻ.

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