Igor Beaufils
Igor Beaufils

Reputation: 914

Receiving objects with jms java

could someone help me. Here is my problem :

I try to send an object with jms (this part works) and receive it with jms. My object is quite simple. 3 String, 3 int, and a boolean.

There are no problem of connexion or anything like this. I receive the object but it's as if I received every things one by one.

Here is my MessageListener :

 MessageListener listner = new MessageListener() {
            public void onMessage(Message message) {

                ObectToSend yo=null;

                try {
                    if (message instanceof ObjectMessage) {
                        ObjectMessage myMessage = (ObjectMessage) message;
                        System.err.println("test");
                        yo = (ObectToSend) myMessage.getObject();
                        System.err.println("test2");
                        System.err.println(yo.entite + "  " + yo.error  + "  " + yo.idGloreg  + "  " + yo.indPerso  + "  " + yo.nom  + "  " + yo.prenom  + "  " + yo.nom);
                    }
                } catch (JMSException e) {
                    System.out.println("Caught:" + e);
                    e.printStackTrace();
                }
            }
        };

And that my sending part :

 Serializable ObectTest = new ObectToSend("pro", "enc", 134, 10, true, "yayaya", 0);

        MessageProducer producer = session.createProducer(topic);
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);

        ObjectMessage message = session.createObjectMessage();

        message.setObject(ObectTest);
        connection.start();
        producer.send(message);

Finally here is what I want to send (in receiver.java and sender.java) :

 public static class ObectToSend implements Serializable{

    private static final long serialVersionUID = 1L;
    String prenom;
      String nom;
      int idGloreg;
      int indPerso; 
      boolean ok;
      String entite;
      int error;

      ObectToSend(String prenomP, String nomP, int idGloregP, int indPersoP, boolean okP, String entiteP, int errorP){
           prenom = prenomP ;
           nom= nomP;
          idGloreg = idGloregP;
           indPerso = indPersoP; 
           ok = okP;
           entite= entiteP;
           error = errorP;  
      }
    }

My console :

test
test
test
test
test
test
test

If someone could tell me what's the problem that would be great. I don't get it. My textmessage with topic/queue/sync/async are working so nicely. It comes to object and.... It seems the problem is here : yo = (ObectToSend) myMessage.getObject(); but.....

Upvotes: 3

Views: 4272

Answers (2)

lopura
lopura

Reputation: 11

You could also use a map message. Indeed, you only have strings, ints, and booleans. You actually don't need an object. MapMessage is here for you and is much much simpler.

Here is an exemple :

// create mapMessage
message = session.createMapMessage();
                // Here insert variables in properties of the message
                // This can be filtred with selector
                message.setStringProperty("entity", entity);
                message.setStringProperty("messageFrom", messageFrom);

                // Here insert variables in body of the message
                //This CAN'T be filtred (what you want I think)
                message.setString("title", title);
                message.setString("description", description);


// Get map message

MapMessage mapMessage = (MapMessage) message;
// Here get variables of your message
                    String title = mapMessage.getString("title");
                    String description = mapMessage.getString("description");

See how simple it is ?

Upvotes: 1

Igor Beaufils
Igor Beaufils

Reputation: 914

For future users of JMS I will answer my own question.

It was really hard to find any information as it's not explained in JMS documentation.

I found a lot of people asking how to do it but never had any answer. That's because it's not releated to JMS but to Java.

So here it goes :

If you want to use a same classe (object) like

ObectToSend yo = (ObectToSend) myMessage.getObject();

My first object (yo) is from the class ObectToSend.java in the package com.test.jms and my second object (myMessage.getObject() ) is from the package com.test.jms2. So I have an exception like "notfoundclass". And cannot cast objects.

The class ObectToSend.java should be in both projects. But you can't just copy paste with the same name (what I stupidly did). You need to create a jar of the class used in both projects/packages and add it to both projects.

That way you use EXACTLY the same class and not a copy of it. And your 2 objects are exactly the same.

Upvotes: 4

Related Questions