मैं आमतौर पर ThreadLocal
क्लास पैटर्न के साथ इस तरह की समस्याओं को हल करता हूं । इस तथ्य को देखते हुए कि आपको प्रत्येक वर्ग के लिए एक अलग singleton
मार्शेलर की आवश्यकता है, आप इसे -मैप पैटर्न के साथ जोड़ सकते हैं ।
आपको 15 मिनट बचाने के लिए, काम का। यहाँ जैक्सब मार्शल और अनमरशैलर्स के लिए एक थ्रेड-सुरक्षित कारखाने के मेरे कार्यान्वयन का अनुसरण करता है।
यह आपको निम्नानुसार उदाहरणों का उपयोग करने की अनुमति देता है ...
Marshaller m = Jaxb.get(SomeClass.class).getMarshaller();
Unmarshaller um = Jaxb.get(SomeClass.class).getUnmarshaller();
और आपको जिस कोड की आवश्यकता होगी वह एक छोटी सी जैक्सब क्लास है जो इस प्रकार है:
public class Jaxb
{
// singleton pattern: one instance per class.
private static Map<Class,Jaxb> singletonMap = new HashMap<>();
private Class clazz;
// thread-local pattern: one marshaller/unmarshaller instance per thread
private ThreadLocal<Marshaller> marshallerThreadLocal = new ThreadLocal<>();
private ThreadLocal<Unmarshaller> unmarshallerThreadLocal = new ThreadLocal<>();
// The static singleton getter needs to be thread-safe too,
// so this method is marked as synchronized.
public static synchronized Jaxb get(Class clazz)
{
Jaxb jaxb = singletonMap.get(clazz);
if (jaxb == null)
{
jaxb = new Jaxb(clazz);
singletonMap.put(clazz, jaxb);
}
return jaxb;
}
// the constructor needs to be private,
// because all instances need to be created with the get method.
private Jaxb(Class clazz)
{
this.clazz = clazz;
}
/**
* Gets/Creates a marshaller (thread-safe)
* @throws JAXBException
*/
public Marshaller getMarshaller() throws JAXBException
{
Marshaller m = marshallerThreadLocal.get();
if (m == null)
{
JAXBContext jc = JAXBContext.newInstance(clazz);
m = jc.createMarshaller();
marshallerThreadLocal.set(m);
}
return m;
}
/**
* Gets/Creates an unmarshaller (thread-safe)
* @throws JAXBException
*/
public Unmarshaller getUnmarshaller() throws JAXBException
{
Unmarshaller um = unmarshallerThreadLocal.get();
if (um == null)
{
JAXBContext jc = JAXBContext.newInstance(clazz);
um = jc.createUnmarshaller();
unmarshallerThreadLocal.set(um);
}
return um;
}
}