2011-02-08 42 views
8

Tôi đang sử dụng javaeventing để viết một trình bao định hướng để truy cập cơ sở dữ liệu. Vì vậy, trường hợp sử dụng của tôi là:Lập trình Java và lập trình sự kiện

  1. mở vỏ trong dòng lệnh.
  2. Bây giờ, trình bao kết nối tới cơ sở dữ liệu và lắng nghe lệnh đến.
  3. khi nó nhận lệnh, nó thực hiện và trả lại kết quả yêu cầu.

Bây giờ, làm cách nào để tránh while(!exit){ //do stuff } loại vòng lặp ở đây? Làm thế nào để sử dụng Java eventing một cách chính xác?

Cách thẳng về phía trước có thể là:

while(!exit) 
{ 
    exit = myClass.execute("command"); //when command is exit, return true. 
} 

Nhưng, tôi đang tìm kiếm nếu java eventing có thể cung cấp một giải pháp tốt hơn.

Update1:

Đây là những gì tôi đang cố gắng để thực hiện:

  1. ứng dụng của tôi là một vỏ (như vỏ MongoDB) để thử ra một cơ sở dữ liệu quan trọng có giá trị.
  2. Mã đơn giản:

init(); //Initialize the connection with database
while(!exit) {
//exit = myClass.execute("put(5)"); //This returns false
exit = myClass.execute("exit"); //returns true, i.e. the user wants to exit the shell
}

Bây giờ, ở đây tôi không thấy việc sử dụng java eventing và tôi giải quyết vấn đề của tôi, bạn có thể vui lòng cho tôi biết, CÁCH java eventi ng sẽ đến trong hình ảnh ở đây? Tôi muốn người dùng kích hoạt sự kiện.

+0

Có thể tôi hiểu nhầm câu hỏi của bạn, nhưng đây không phải là sự kiện chính xác là gì? Bạn đăng ký sự kiện của bạn, tại đây để thoát ra, và khi nó xảy ra, mã của bạn được gọi. Vì vậy, không cần cho bạn để viết một vòng lặp như vậy. Vui lòng sửa tôi nếu tôi ở ngoài trường bên trái. –

+0

vâng, bạn nói đúng. Nhưng tôi không thể tìm ra, làm thế nào để đạt được điều đó? – zengr

Trả lời

2

Tôi thấy khó hiểu những gì bạn đang cố gắng làm chính xác, nhưng tôi có kinh nghiệm với javaEventing và tôi sẽ cố gắng giúp bạn hết sức có thể. Will Hartung là chính xác, bạn cần phải tạo ra các sự kiện của bạn ở đâu đó.Vì vậy, nếu tôi hiểu bạn một cách chính xác, bạn muốn bắt đầu java-ứng dụng của bạn từ dòng lệnh, sau đó bạn muốn kết nối với một cơ sở dữ liệu và xem cho một số lệnh được chèn vào, và khi chèn, bạn muốn tạo một sự kiện. Điều này có đúng không?

Trong trường hợp đó, bạn có thể cần thực hiện một số cuộc thăm dò đối với cơ sở dữ liệu, vì cơ sở dữ liệu thông thường không có cách nào để thông báo cho ứng dụng của bạn khi một số điều kiện là đúng. Điều này có nghĩa là bạn có thể cần trong khi mệnh đề {}, trong đó bạn thực hiện các truy vấn đối với cơ sở dữ liệu, chờ một tập kết quả chứa lệnh bạn đang tìm kiếm. Khi tìm thấy, bạn có thể tạo ra một sự kiện như thế này:

Class ReceivedCommandEvent extends EventManager.EventObject {} // define your event 

while (command==null) { 
    command = pollDataBaseForCommand(); //poll your databae for commands 
    waitForSomePeriod(); 
} 

EventManager.triggerEvent(this, new ReceivedCommandEvent(command));  //trigger your event, with the command as payload 

Bây giờ, bất kỳ chủ đề khác nghe cho sự kiện của bạn (ReceivedCommandEvent) sẽ nhận được sự kiện này, và có thể lấy lệnh từ payload sự kiện.

Bây giờ, câu hỏi là, tại sao bạn muốn sử dụng cơ sở dữ liệu để truyền đạt các lệnh anyways? Bạn chỉ cần sử dụng nó để giao tiếp giữa các ứng dụng? Nếu ứng dụng khác của bạn cũng được viết bằng Java, bạn có thể xem xét sử dụng các sự kiện được phân phối, cho phép một ứng dụng java gửi các sự kiện tới các ứng dụng java đang chạy trong các JVM khác trên các máy khác trong mạng. Bạn có thể muốn xem JED (http://code.google.com/p/jed-java-event-distribution), thực hiện chính xác điều đó.

Tôi hy vọng điều này sẽ giúp, Bob

2

Tất cả thư viện sự kiện đó đều gửi các sự kiện đến người nghe. Ngoài ra bạn cần một cái gì đó để thực sự TẠO các sự kiện. Trong trường hợp này, bạn sẽ cần mã để đọc bảng điều khiển và tạo sự kiện, bạn sẽ cần một thứ khác để "lắng nghe" DB và tạo các sự kiện từ đó (giả sử bạn có các sự kiện DB không đồng bộ mà bạn đang tìm kiếm). , chẳng hạn như thay đổi bảng hoặc hàng).

Mã đó vẫn cần được viết.

Và trừ khi khung đó cung cấp cho bạn các lớp tiện ích như vậy, bạn sẽ phải tự viết cho mình và các lớp đó có thể sẽ giống như bạn mô tả.

Nhưng tất cả các lớp đó đều nằm ở rìa của hệ thống, điều khiển dữ liệu. Phần còn lại của mã của bạn có thể hoàn toàn dựa trên sự kiện.

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