2009-05-04 37 views
8

Tôi đã sử dụng RMI cho một dự án mà tôi hiện đang làm việc và tôi muốn liên kết từ nhiều máy chủ với một đăng ký RMI duy nhất.Sử dụng đơn RMI Registry

Tuy nhiên khi tôi cố gắng để làm như vậy tôi nhận được một lỗi nói

java.rmi.AccessException: Registry.Registry.bind không được phép; origin/192.168.0.9 là máy chủ không phải cục bộ

Tôi đã rất googling và có vẻ như RMI dừng máy chủ từ xa ràng buộc theo mặc định, những gì tôi muốn biết là có một số cách ghi đè hoặc bỏ qua điều này?

Nếu bất kỳ ai đề xuất cách vượt qua vấn đề này, họ sẽ đánh giá cao, tôi đã thử sử dụng các tệp chính sách khác nhau và ghi đè trình quản lý bảo mật nhưng dường như không có tác dụng nào.

Trả lời

0

Cám ơn everyones trả lời cho giải pháp tôi đã đưa ra cuối cùng là sử dụng các Cajo Framework này đưa ra một hệ thống rất linh hoạt để phân phối và nó cho phép tôi để xử lý registry như tôi thấy phù hợp. Nó cũng có thể hoạt động sau NAT, tường lửa và HTTP proxy, rất hữu ích.

Tôi tin rằng phương pháp proxy được đề xuất bởi rndm.buoy sẽ hoạt động trong một số trường hợp nhưng có thể gây phiền hà cho một số hệ thống.RMI dường như có một số vấn đề liên quan đến Giao diện Mạng không đúng, đặc biệt tôi gặp phải vấn đề này khi chạy trên các bản phân phối Linux dựa trên Debian.

0

Tôi có thể sai, nhưng có vẻ như ứng dụng rmiregistry thực chất là một trình bao bọc trên dịch vụ đặt tên cục bộ. Điều đó có nghĩa là không có cách nào để làm cho nó trỏ đến các đối tượng từ xa.

Những gì bạn cần là triển khai Đặt tên và được phân cụm tại đây. Cân nhắc chuyển sang giải pháp nhóm J2EE AS. Cây JNDI được chia sẻ trong cụm.

+0

Bạn đã sai. RMI Registry * là * một dịch vụ đặt tên. Nó không phải là một wrapper trên bất cứ điều gì. Nó sẽ không chấp nhận các yêu cầu bind/rebind/unbind khác với localhost. Đó không phải là điều tương tự như không thể trỏ đến các vật thể từ xa. Nó có thể. – EJP

1

Tôi có thể hiểu nhầm câu hỏi của bạn, nếu có, vui lòng cho tôi biết.

Tôi có kinh nghiệm hạn chế với Java RMI, chúng tôi đã sử dụng nó trong lớp Mẫu thiết kế với Mẫu proxy. (Sách giáo khoa: Mẫu thiết kế Headfirst)

Chúng tôi không thể đưa các dự án của chúng tôi làm việc từ bên ngoài mạng trường đại học, nhưng chúng hoạt động hoàn hảo khi kết nối trực tiếp với mạng. Theo giáo sư của chúng tôi, không thể sử dụng RMI trong việc thực hiện của chúng tôi qua internet hoặc wan. Một giải pháp mà cô đề nghị là một VPN sẽ được yêu cầu. Tôi tin rằng Vladimir là chính xác trong đó nó đã làm với nó là một dịch vụ đặt tên địa phương.

+0

Không. Nó phải làm với callbacks là không khả thi trên mạng với proxy phía máy khách và vấn đề được mô tả trong mục A.1 của Câu hỏi thường gặp về RMI. 'Dịch vụ đặt tên cục bộ' là một phần của trí tưởng tượng. – EJP

7

Có cách để vượt qua giới hạn nhưng đó là những gì nó là: một công việc xung quanh. Dù sao, cảm thấy tự do để thử nó ra. Nó làm việc cho chúng ta.

Trên máy chủ đang chạy đăng ký RMI trung tâm chạy một dịch vụ nhỏ sẽ liên kết một đối tượng từ xa chỉ với một phương thức từ xa: proxyRebind. Việc thực hiện phương pháp này chỉ đơn giản là ràng buộc đối tượng được cung cấp cho nó trong sổ đăng ký trung tâm (điều này sẽ không thất bại vì sổ đăng ký trên cùng một máy với dịch vụ này).

Tất cả các máy chủ khác chỉ đơn giản là tra cứu đối tượng từ xa này và gọi proxyRebind với các đối tượng từ xa của riêng chúng.

Điều này hoạt động vì việc tra cứu trên các đăng ký được lưu trữ từ xa được cho phép. Nỗ lực ban đầu của bạn không thành công vì không được phép liên kết các đăng ký được lưu trữ từ xa.

Hãy cho tôi biết nếu bạn cần thêm bất kỳ sự rõ ràng nào về điều này.

/RS

+0

Đó là thông minh! Âm thanh giống như thứ gì đó có thể đóng lại như một lỗ hổng bảo mật tiềm năng trong bản phát hành JRE trong tương lai. Tôi sẽ không đưa ra bất kỳ quyết định thiết kế lớn nào phụ thuộc vào kỹ thuật này. –

+0

Nếu nó đã được đóng cửa, sẽ xảy ra một thời gian dài trước đây! Tôi đã thực hiện việc triển khai này trong 10 năm qua! – user40552

+0

rndm.buoy Tôi đã cố gắng thực hiện điều này và đối tượng thực sự ràng buộc thành công tuy nhiên khi tôi cố gắng gọi một phương thức từ xa, tôi nhận được ngoại lệ 'java.rmi.ConnectException: Connection bị từ chối host: 127.0.1.1; ngoại lệ lồng nhau là: 'mặc dù đối tượng từ xa nên giải quyết cho IP 192.168.126.137 Tôi tự hỏi nếu có điều gì đó tôi thiếu, bạn có thể mở rộng đề xuất của bạn nó sẽ được đánh giá cao. –

2

2 Có cách để có được khoảng giới hạn nhưng đó là những gì: hoạt động xung quanh. Dù sao, hãy thử nó. Nó làm việc cho chúng ta.

Trên máy chủ đang chạy các trung tâm RMI registry chạy một dịch vụ nhỏ mà sẽ ràng buộc một đối tượng từ xa chỉ với một phương thức từ xa: proxyRebind. Việc triển khai thực hiện phương pháp này chỉ cần gắn đối tượng được cung cấp cho nó trong sổ đăng ký trung tâm (điều này sẽ không thành công vì sổ đăng ký nằm trên cùng một máy như dịch vụ này).

Tất cả các máy chủ khác chỉ cần tra cứu đối tượng từ xa này và gọi proxyĐăng nhập bằng các đối tượng từ xa của riêng chúng.

Điều này hoạt động vì việc tra cứu trên các đăng ký được lưu trữ trên máy chủ từ xa được cho phép. nỗ lực ban đầu của bạn không thành công vì ràng buộc trên các đăng ký được lưu trữ từ xa không được phép.

Hãy cho tôi biết nếu bạn cần thêm bất kỳ rõ ràng về điều này.

Điều này hoàn toàn phù hợp. Điều duy nhất cần lưu ý là phải luôn luôn đặt đúng. -Djava.rmi.server.hostname = "LOCAL HOST IP"

+0

Chỉ cần thiết lập 'java.rmi.server.hostname' trong máy chủ đa cấp hoặc nếu có lỗi gì đó với DNS của bạn như được mô tả trong mục [A.1 của Câu hỏi thường gặp về RMI] (http://docs.oracle) .com/javase/7/docs/technotes/guides/rmi/faq.html # tên miền). – EJP

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