Các lớp trong thư viện JRE có hỗ trợ các lần đọc và / hoặc không đồng bộ có thể quan sát được từ các cụm bên ngoài / không JRE không?


12

Làm cách nào tôi có thể triển khai thư viện đa nền tảng của mình (ví dụ trên JRE) để vận hành theo cách an toàn luồng trên các tham chiếu đối tượng, để giao diện người dùng gốc trên các nền tảng khác có thể quan sát đối tượng và tận dụng các mẫu có thể quan sát được?

Một chút nền tảng - có một khái niệm về ràng buộc dữ liệu được sử dụng trong hầu hết các khung công tác mặt trước. Trong C # và Java, điều này có liên quan đến đặc điểm có thể quan sát được, cung cấp cho một lớp khả năng thực hiện các sự kiện khi có thay đổi, trong đó nhiều điều khiển hoặc "người quan sát" có thể đăng ký. Bằng cách này, các nhà quan sát không phải tiếp tục bỏ phiếu / đọc tài nguyên, so sánh các bản cập nhật.

Tôi muốn làm việc trên một công cụ phân tích thực hiện thay đổi danh sách dữ liệu theo thời gian. Thật tuyệt khi có thể có mặt trước có thể quan sát các danh sách này trong khi phân tích đang chạy. Dường như với tôi, điều này đòi hỏi front-end có thể chuyển một đối tượng đến công cụ phân tích, được viết trong một thư viện hy vọng là đa nền tảng và có thể thực hiện đọc an toàn luồng cho đối tượng đó. Hoặc nếu không, có thư viện đáp ứng các hợp đồng quan sát.

Cách xử lý này trong các công cụ CLI kiểu Unix cũ là sử dụng stdin / stdout / stderr và cập nhật bài đăng động cơ theo định kỳ. Điều này đòi hỏi chi phí tiêu chuẩn và phân tích văn bản mà tôi muốn tránh, nếu có thể.


2
Nói chung, tốt nhất là làm cho câu hỏi cốt lõi hẹp hơn một chút so với "Có thể X không?", Vì câu trả lời đúng cho câu đó hầu như luôn luôn là "Có, nếu bạn cố gắng hết sức." Có vẻ như bạn thực sự muốn hỏi "Làm thế nào tôi có thể làm X mà không cần đến stdin / stdout?" Trong trường hợp nào, tại sao không chỉ đơn giản là sử dụng một thư viện liên kết tĩnh hoặc động? Bạn có cần thư viện này là một chương trình riêng biệt với UI vì một số lý do không?
Ixrec

Cảm ơn, Ixrec. Bạn có nghĩ rằng tôi đã diễn đạt nó theo cách bạn đề xuất trong tiêu đề của tôi? Lý do tôi muốn thư viện có thể di động và giao diện người dùng gốc là vì tôi nghĩ các khung UI gốc thường hoạt động tốt hơn (cảnh báo ý kiến!), Nhưng tôi không muốn viết logic của công cụ hai lần .
Brandon Arnold

Tại sao thư viện liên kết tĩnh hoặc động có thể di động được? Re: Tiêu đề, đó là một ví dụ trong sách giáo khoa của một câu hỏi "quá rộng"; Tôi đã không tập trung vào điều đó bởi vì dường như có những câu hỏi cụ thể hơn trong phần còn lại của câu hỏi của bạn.
Ixrec

@Ixrec Nó có thể. Câu hỏi giả định rằng đó là một thư viện, bao gồm những khả năng đó. Tôi chỉ muốn đảm bảo rằng bất kỳ ứng dụng nào sử dụng thư viện này sẽ có thể quan sát các tham chiếu đến các đối tượng được truyền đến nó không đồng bộ, trong khi chúng đang được vận hành.
Brandon Arnold

1
@Ixrec Tôi đã cập nhật tiêu đề để bớt rộng hơn
Brandon Arnold

Câu trả lời:


1

Bạn có thể tạo một lớp tích hợp trên mô hình thư viện của mình bằng cách sử dụng (ví dụ) khung tích hợp lạc đà apache. Thành phần Netty có thể phù hợp với nhu cầu của bạn. Với một mẫu có thể quan sát, tầng tích hợp của bạn sẽ chuyển đổi các thay đổi đã nhận của mô hình của bạn và thông báo cho các thuê bao phía trước. Một cách tương tự khác để diễn giải yêu cầu của bạn là suy nghĩ về kiến ​​trúc hướng sự kiện khi mô hình của bạn thay đổi, người nghe quan sát trong tầng tích hợp của bạn sẽ xuất bản một thông báo trong Chủ đề JMS để các nhà đăng ký được kết nối ở mặt trước sẽ nhận được chúng.


0

Tôi đã viết một câu trả lời hoàn toàn khác, đề nghị nhà xuất bản của bạn viết các bản cập nhật cho hàng đợi hoặc đường ống - nhưng sau đó tôi đọc lại câu hỏi.

Nếu tôi hiểu đúng câu hỏi chung của bạn là bạn muốn viết một thư viện để chạy trong JRE, trong đó một giao diện người dùng gốc có thể truy vấn trạng thái của các đối tượng Java theo cách an toàn luồng.

Điều này cực kỳ rộng vì có hàng trăm cách mà một giao diện người dùng có thể tương tác với mã thư viện đang chạy trong JRE - JNI, EJB RPC, giao diện HTTP kiểu RPC, phản hồi yêu cầu qua hàng đợi tin nhắn, v.v.

Dù bạn chọn loại nào, tại một số điểm trong chuỗi, phải có một lệnh gọi phương thức Java và đó là nơi bạn có thể kiểm soát an toàn luồng. Ở đó, bạn có toàn bộ kho công cụ an toàn luồng theo ý của bạn. Bạn có thể đồng bộ hóa, bạn có thể trả lại các bản sao phòng thủ, làm việc với dữ liệu được lưu trong bộ nhớ cache, v.v.

Tuy nhiên, hãy xem xét liệu đây có phải là mô hình bạn muốn làm theo. Có thể sạch hơn khi chuyển sang mô hình "đừng hỏi tôi, tôi sẽ nói với bạn", trong đó thư viện của bạn đẩy các bản cập nhật lên mặt trước chứa đủ thông tin mà nó không cần phải truy vấn các đối tượng.


Nhận xét thêm - bạn đã xem xét sử dụng Redis (hoặc tương tự) làm trung gian giữa mặt trước và mặt sau của bạn chưa?
mỏng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.