2012-10-02 31 views
8

Tôi có nhiều dịch vụ có thể trả về kết quả trong số hàng ngàn lớp học.
Vì mỗi dịch vụ CXF chứa bối cảnh JAXB riêng gần như giống nhau, nó gây ra một sự lãng phí bộ nhớ rất lớn.
Có cách nào để tự tạo bối cảnh JAXB và chia sẻ nó giữa các dịch vụ không?Sử dụng lại bối cảnh CXF jaxb giữa nhiều dịch vụ

+0

Câu hỏi thú vị, nhưng tôi không biết câu trả lời. –

+1

Điều này là dành cho jaxrs, nhưng có thể nó sẽ làm việc cho jaxws quá: http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –

Trả lời

3

Một cách tốt để giải quyết nó bằng cách thêm những điều sau đây để cấu hình mùa xuân:

<bean class="org.apache.cxf.jaxb.JAXBDataBinding" > 
    <constructor-arg index="0" value="#{GlobalContextBean.context}"/> 
</bean> 

Trường hợp giá trị chỉ là một tham chiếu đến một bean mà giữ toàn cầu (đơn) JAXBContext và có phương pháp sau đây :

public javax.xml.bind.JAXBContext getContext() {...} 

Bạn có thể xem chi tiết hơn (bao gồm cả guru CXF Daniel Kulp đầu vào) trong các chủ đề sau:
Reuse-JAXB-context-in-jaxws

Sau khi thử nghiệm, tôi phát hiện ra rằng việc thiết lập JAXBDataBinding hiện tại là một cá thể chung cho nhiều dịch vụ sẽ không hoạt động vì có một câu lệnh if trong phương thức khởi tạo của nó trả về một khi ngữ cảnh được thiết lập bởi dịch vụ đầu tiên.
Đó là lý do tại sao tôi đã kết thúc bằng cách mở rộng lớp học và thu thập tất cả các lớp dịch vụ theo yêu cầu và mô hình. Sau khi tất cả các khởi tạo dịch vụ kết thúc, tôi tạo một bối cảnh chung với tất cả các lớp bắt buộc và trả về tất cả các dịch vụ.
Bạn có thể sử dụng lớp sau.
Sau khi tất cả các dịch vụ web của bạn được khởi tạo, hãy gọi phương thức compileGlobalJAXBContext để tạo ngữ cảnh chung. Bạn có thể thêm các lớp khác mà ứng dụng cần và init bị bỏ qua.
Đừng quên định cấu hình các dịch vụ để làm việc với bean này.

public class GlobalJAXBDataBinding extends JAXBDataBinding 
{ 
private Set<Class<?>> globalContextClasses; 
private boolean contextBuilt = false; 

public GlobalJAXBDataBinding(Set<Class<?>> classes) { 
    globalContextClasses = new HashSet<>(classes); 
    globalContextClasses.add(CPUUID.class); 
} 

public GlobalJAXBDataBinding() { 
} 

} 

public synchronized void initialize(Service service) { 
    if (contextBuilt) 
     return; 
    super.initialize(service); 
    globalContextClasses.addAll(getContextClasses()); 
    super.setContext(null); 
} 

public void compileGlobalJAXBContext() { 
    if (contextBuilt) return; 
    setContext(JAXBContext.newInstance(globalContextClasses)); 
    contextBuilt *equals* true; 
} 

Đối với một số lý do lạ biên tập viên không cho tôi thêm dấu bằng ở dòng cuối cùng của compileGlobalJAXBContext vì vậy chỉ cần thay thế các bằng chữ với dấu hiệu có liên quan.

+0

Tôi đánh giá cao đây là một chút cũ bây giờ, nhưng bạn có phiền khi đăng lớp nếu bạn vẫn còn có nó? – DarthPablo

+0

@DarthPablo Tôi đã đính kèm lớp học –

+0

Cảm ơn bạn - điều đó rất hữu ích! – DarthPablo

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