मैं दो अनुप्रयोगों के बीच संचार करने के लिए जेएम/वायुमंडल ढांचे का उपयोग कर रहा हूं।जावा क्लास के लिए एक संदेश बॉडी लेखक ... और एमआईएम मीडिया प्रकार टेक्स्ट/एचटीएमएल
@XmlRootElement
public class A implements Serializable{
public A(){}
/* some private properties */
}
दूसरी तरफ एक से अधिक उपभोक्ताओं विषय पर सुनने और आईडी के आधार पर अलग सदस्यता बनाने के कर रहे हैं पर: आवेदनों की एक एक विषय के लिए एक संदेश निर्माता, निम्न प्रकार के कस्टम वस्तुओं भेज रहे हैं।
@GET
@Produces({MediaType.APPLICATION_JSON})
public SuspendResponse<A> subscribe() {
return new SuspendResponse.SuspendResponseBuilder<A>()
.broadcaster(topic)
.outputComments(true)
.addListener(new EventsLogger()).build();
}
@Override
public void incomingBroadcast() {
try {
String id = getID();
if (id.startsWith("/*")) {
id = "atmosphere";
}
logger.info("Looking up Connection Factory {}", FACTORY_NAME);
Context ctx = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup(FACTORY_NAME);
logger.info("Looking up topic: {}", TOPIC_NAME);
Topic topic = (Topic) ctx.lookup(TOPIC_NAME);
connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
logger.info("Create consumer for : {}", id);
String selector = String.format("BroadcasterId = '%s'", id);
consumer = session.createConsumer(topic, selector);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message msg) {
try {
ObjectMessage om = (ObjectMessage) msg;
A a = (A) om.getObject();
if (a!= null && bc != null) {
broadcastReceivedMessage(a);
}
logger.info("Broadcasted message: {} ", a);
} catch (JMSException ex) {
logger.warn("Failed to broadcast message", ex);
}
}
});
publisher = session.createProducer(topic);
connection.start();
logger.info("JMS created for topic {}, with filter {}", TOPIC_NAME, selector);
} catch (Throwable ex) {
throw new IllegalStateException("Unable to initialize MyBroadcaster", ex);
}
}
क्या मैं देखा कि संदेशों JMS विषय पर सही ढंग से आ रहे है, लेकिन मैं निम्न अपवाद प्राप्त करते हैं:
SEVERE: A message body writer for Java class A, and Java type class A, and MIME
media type text/html was not found
SEVERE: The registered message body writers compatible with the MIME media type are:
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
com.sun.jersey.json.impl.provider.entity.JSONWithPaddingProvider
com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy
com.sun.jersey.moxy.MoxyMessageBodyWorker
com.sun.jersey.moxy.MoxyListMessageBodyWorker
मैं Netbeans 7.0.1 का उपयोग कर रहा, glassfish 3.1.1, माहौल 0.8.1, जर्सी 1.11। मैंने वेब की खोज की किसी भी संभावित समाधान की कोशिश की लेकिन कुछ भी मदद नहीं की।
पर निम्नलिखित निर्भरता जोड़कर बस इसे ठीक कर सकते हैं। यह काम नहीं करता है। मैं सब्सक्राइब करने से पहले संदेशबॉडीवाइटर को सीधे लागू करता हूं और मैं विधियों को ओवरराइड करता हूं, लेकिन उन्हें कभी भी नहीं बुलाया जाता है। – mejas
क्या आपने अपना संदेशबॉडीवाइटर एप्लिकेशन (javax.ws.rs.core.Aplication) पर पंजीकृत किया है? जबकि जर्सी शुरू हो रही है, Application.getClasses() विधि कक्षाओं और प्रदाताओं (जैसे संदेशबॉडी राइटर्स) का एक सेट देता है इस सेट में वापस किया जाना चाहिए। – anilsinaci