Mam wiele usług, które mogą zwracać wyniki z tysięcy klas.
Ponieważ każda usługa CXF zawiera prywatny niemal identyczny kontekst JAXB, powoduje to ogromne marnowanie pamięci.
Czy istnieje sposób na samodzielne utworzenie kontekstu JAXB i udostępnienie go między usługami?Ponowne użycie kontekstu jaxb CXF między wieloma usługami
Odpowiedz
Jednym z możliwych sposobów rozwiązania jest to poprzez dodanie następujących konfiguracji wiosny:
<bean class="org.apache.cxf.jaxb.JAXBDataBinding" >
<constructor-arg index="0" value="#{GlobalContextBean.context}"/>
</bean>
przypadku gdy wartość jest tylko odniesienie do fasoli, która posiada globalną (single) JAXBContext i ma następującą metodę :
public javax.xml.bind.JAXBContext getContext() {...}
można zobaczyć więcej szczegółów (w tym CXF guru wejść Daniel Kulp) w wątku:
Reuse-JAXB-context-in-jaxws
Po przetestowaniu go odkryłem, że ustawienie bieżącego JAXBDataBinding jako instancji globalnej dla wielu usług nie będzie działać, ponieważ w metodzie initialize znajduje się instrukcja "if", która zwraca się, gdy kontekst został ustawiony przez pierwszą usługę.
Dlatego właśnie skończyłem, rozszerzając klasę i zbierając wszystkie wymagane klasy usług i modele. Po zakończeniu wszystkich inicjalizacji usług tworzę globalny kontekst ze wszystkimi wymaganymi klasami i zwracam je do wszystkich usług.
Możesz użyć poniższej klasy.
Po zainicjowaniu wszystkich usług WWW wywołaj metodę compileGlobalJAXBContext w celu utworzenia globalnego kontekstu. Możesz dodać tam inne klasy, których potrzebuje aplikacja, a init pominięto.
Nie zapomnij skonfigurować usług do pracy z tym komponentem bean.
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;
}
Z jakiegoś dziwnego powodu redaktor nie dodam znak równości w ostatniej linii compileGlobalJAXBContext więc po prostu zastąpić słowo równi z odpowiednim znakiem.
Doceniam to jest trochę już stary, ale czy mógłbyś opublikować zajęcia, jeśli nadal je masz? – DarthPablo
@DarthPablo Dołączyłem do klasy –
Dziękuję - to bardzo pomocne! – DarthPablo
- 1. Ponowne użycie kontekstu aplikacji wiosennych w klasach testów junit
- 2. Udostępnianie klucza AI między wieloma aplikacjami i usługami sieciowymi?
- 3. Ponowne użycie SpecFlow Scenariusze
- 4. cxf: generowanie konstruktora jaxb z argumentami
- 5. Ponowne użycie elementów HTML
- 6. Ponowne użycie instancji NSURLConnection
- 7. Ponowne użycie DataTemplate
- 8. Ponowne użycie FtpWebRequest
- 9. Ponowne użycie zapytania LINQ
- 10. Testy integracji Grails z wieloma usługami
- 11. Referencyjna integralność danych między usługami
- 12. Ponowne użycie obiektów zapytań Lucene
- 13. R data.table: ponowne użycie agregacji
- 14. Ponowne użycie opcji Kod menu
- 15. Ponowne użycie zmiennych w Pythonie
- 16. Ponowne użycie ikony aplikacji .NET
- 17. Ponowne użycie wskaźnika po `usuń`
- 18. Ponowne użycie MNIEJ style zagnieżdżone
- 19. Ponowne wykorzystanie websockets między stronami?
- 20. Użycie enable_shared_from_this z wieloma dziedziczeniami
- 21. Ponowne użycie SSL połączenia z Androidem HttpClient
- 22. użycie JSON Deserializator do kontekstu wykonania wsadowym
- 23. Jak komunikować się między usługami systemu Windows
- 24. Udostępnianie danych między działaniami i usługami
- 25. Udostępnij wyliczenie między usługami sieciowymi ASMX
- 26. Różnica między WebHooks ASP.NET a usługami sieciowymi?
- 27. Udostępnianie obiektów DTO między usługami WCF
- 28. ponowne używanie zestawów testów z wieloma implementacjami?
- 29. Ustaw klasę inicjalizacji fabryki kontekstu JAXB, która ma być używana
- 30. Najlepszy sposób na połączenie się z wieloma usługami sieciowymi?
Interesujące pytanie, ale nie znam odpowiedzi. –
To jest dla jaxrs, ale może też będzie działać dla jaxws: http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –