2009-11-24 41 views
12

OK, tôi đang phát triển một chương trình sẽ được triển khai cho nhiều máy (Windows, Linux, AIX, z/Linux, openVMS, v.v.). Tôi muốn ứng dụng đó chứa một dịch vụ web SOAP, nhưng tôi không muốn bó tomcat hoặc chạy một dịch vụ riêng biệt cho các dịch vụ (tôi muốn chúng trong cùng một quá trình như phần còn lại của ứng dụng).Máy chủ dịch vụ SOAP đang hoạt động cho Java

Về cơ bản những gì tôi đang tìm kiếm là thứ mà tôi có thể xác định một lớp (ví dụ: WebServices). Tôi đồng ý với việc viết WSDL hoặc bất kỳ loại mô tả dịch vụ nào khác. Tôi muốn một cái gì đó như thế này:

SOAPServer server = makeMeASoapServer(); 
//do config on the server 
server.add(new WebService(...)); 
server.listen(port); 

Rõ ràng tên và thông số sẽ khác nhau.

Tôi đã xem Axis và dường như nó cung cấp điều này, nhưng tôi không biết tôi cần sử dụng những lớp nào. Tôi có điên khùng muốn loại hành vi này không? Tôi không thể tin rằng nhiều người không tìm kiếm điều này, tôi làm điều này tất cả các thời gian với các dịch vụ web nhúng trong các máy khách .NET.

+0

Tại sao bạn muốn thực hiện việc này? Lý do chính đáng cho SOAP là giao tiếp giữa các ứng dụng - tại sao bạn muốn ứng dụng của mình tự nói chuyện với chính nó thông qua SOAP? – skaffman

+1

Tôi đọc nội dung này khi tải các dịch vụ khác nhau trên máy chủ cho máy khách bên ngoài để có thể gọi. Tôi vẫn làm điều đó trong một tập tin cấu hình, mặc dù, thay vì khá như thế. –

+0

Nó rõ ràng là không nói chuyện với chính nó. Lệnh nghe sẽ làm cho nó lắng nghe trên một cổng, máy chủ sẽ chấp nhận HTTP, phân tích cú pháp XML và chuyển tiếp cuộc gọi vào phương thức đúng với các tham số và không có điều gì. Lý do tôi muốn điều này là do dịch vụ web là một phần nhỏ của ứng dụng, nhưng nó cần tương tác với phần còn lại của ứng dụng. Hơn nữa, tôi không muốn thêm 2 chương trình đang chạy khi tôi chỉ có thể thêm 1 (đặc biệt là khi họ cần giao tiếp với nhau). – tster

Trả lời

22

Dường như jdk 6.0 đã có cài đặt jax-w và một máy chủ nhỏ mà bạn có thể nhúng. tôi havn't tìm ra tất cả các mảnh nhưng đây là một sự khởi đầu:

mkdir -p helloservice/endpoint/ 

helloservice/endpoint/Hello.java:

package helloservice.endpoint; 

import javax.jws.WebService; 

@WebService() 
public class Hello { 
    private String message = new String("Hello, "); 

    public void Hello() {} 

    public String sayHello(String name) { 
    return message + name + "."; 
    } 
} 

helloservice/endpoint/Server.java:

package helloservice.endpoint; 
import javax.xml.ws.Endpoint; 

public class Server { 

    protected Server() throws Exception { 
     System.out.println("Starting Server"); 
     Object implementor = new Hello(); 
     String address = "http://localhost:9000/SoapContext/SoapPort"; 
     Endpoint.publish(address, implementor); 
    } 

    public static void main(String args[]) throws Exception { 
     new Server(); 
     System.out.println("Server ready..."); 

     Thread.sleep(5 * 60 * 1000); 
     System.out.println("Server exiting"); 
     System.exit(0); 
    } 
} 

Tạo điều:

mkdir build 
javac -d build helloservice/endpoint/*java 
$JAVA_HOME/wsgen -d build -s build -classpath . helloservice.endpoint.Hello 

Run điều:

java -cp build helloservice.endpoint.Server 

Somethings chạy trên http://localhost:9000/SoapContext/SoapPort bây giờ. Bạn có thể lấy wsdl trên http://localhost:9000/SoapContext/SoapPort?WSDL

havn't nhận xung quanh để làm cho một khách hàng chưa ..

+2

Đây là chính xác những gì tôi muốn. Cảm ơn bạn rất nhiều – tster

+0

Là một phần thưởng thêm, điều này xuất hiện trong dự án jax-ws (một phần của Glassfish) và chỉ yêu cầu Java 5. Bạn tải xuống bản phát hành tại đây: https://jax-ws.dev.java.net/ – tster

+0

Dường như bạn thậm chí không cần điều đó nếu bạn đang ở trên mặt trời jdk 6 – nos

1

Ngoài câu trả lời tuyệt vời nos, tôi tìm thấy một lớp học trong Apache trục gọi SimpleHTTPServer mà tôi khá chắc chắn thực hiện tương tự nhưng chỉ yêu cầu Java 1.5 cho những người bạn bị kẹt với 1.5

Tôi sẽ không khám phá nó vì tôi sẽ sử dụng giải pháp khác, vì vậy tôi chưa thực sự xác minh nó nghĩ là có, nhưng tôi khá chắc chắn.

+0

Ngoài ra còn có Jetty (http://www.mortbay.org/jetty/) có thể chạy trong chế độ nhúng. – skaffman

1

Hầu hết (/ tất cả?) Triển khai máy chủ Java SOAP cung cấp Servlet (phương pháp javax.xml.ws.Endpoint trong câu trả lời khác trông hơi đơn giản hơn một chút ...). Một số triển khai SOAP mà bạn có thể xem xét là: Apache CXF: cxf.apache.org, Apache Axis2: ws.apache.org/axis2/ hoặc Spring Web Servies: static.springsource.org/spring-ws/site/.

Máy chủ web Java nhúng phổ biến nhất có vẻ là Jetty, bạn có thể configure hoặc theo lập trình (sử dụng đồng bằng Java hoặc Spring bean) hoặc sử dụng định dạng XML tùy chỉnh.

0

Để giải quyết trực tiếp câu hỏi chính, một cách tiếp cận khác sẽ là sử dụng máy chủ nhúng của Jetty. Xem this link để biết chi tiết. Các liên kết từ trang aforelinked giúp bạn hiểu cả máy chủ web đơn giản (ví dụ, một trang phục vụ các trang tĩnh; mặc dù tôi hoàn toàn nhận thức được "đơn giản" là một máy chủ web wrtly vague term) và máy chủ web giúp bạn triển khai web dịch vụ.

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