Hej, napisalam 2 watki przy uzyciu active mq (przyznam ze jest to moje pierwsze spotkanie z JMS). Jeden mi wysyla testowa wiadomosc, a drugi ja czyta. Problem jest taki, ze wiadomosci sa czytane kilkakrotnie. tzn np wysle sobie wiadomosc "test1". Uruchomie watek do czytania - watek ten laczy sie, probuje czytac, usypia sie na 15sek itd. Jakoze (jak wspomnialam) jest to moje pierwsze spotkanie z JMS prawdopodobnie albo nie rozumiem do konca zasady dzialania albo zeby uniknac ponownego przeczytania tej samej wiadomosci powinnam cos sprawdzac. albo po prostu mam blad w kodzie:

   public void run() {

      while (state) {

         receiveMessages();

         try {
            Thread.sleep(sleepTime);
         } catch (InterruptedException inex) {
            inex.printStackTrace();
         }
      }
   }

   public void onMessage(Message message) {

      if (message instanceof TextMessage) {
         TextMessage textMessage = (TextMessage) message;
         System.out.println("Received message:\n" + textMessage);
      }
   }

   public synchronized void onException(JMSException jmsex) {
      System.out.println("JMSException");
      System.err.println(jmsex);
   }

   protected void receiveMessages() {
      System.out.println("Connecting to URL " + url);
      ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

      try {
         connection = connectionFactory.createConnection();
         connection.setExceptionListener(this);
         connection.start();

         /* create the session */
         session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);
         destination = session.createQueue(subject);

         replyProducer = session.createProducer(destination);
         replyProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
         
         consumer = session.createConsumer(destination);
         consumer.setMessageListener(this);

         if(transacted){
            session.commit();
         }

      }catch(RejectedExecutionException rejex){
         System.out.println(rejex);
      }
      catch (JMSException jmsex) {
         System.out.println(jmsex);

      } catch (UnsupportedOperationException unex) {
         unex.printStackTrace();

      } finally {
         if (consumer != null) {
            try {
               consumer.close();
            } catch (JMSException jmsex) {
               jmsex.printStackTrace();
            }
         }
         if (session != null) {
            try {
               session.close();
            } catch (JMSException jmsex) {
               System.err.println(jmsex);
               jmsex.printStackTrace();
            }
         }
         if (connection != null) {
            try {
               connection.close();
            } catch (JMSException jmsex) {
               System.err.println(jmsex);
               jmsex.printStackTrace();
            }
         }
      }

no i przykladowy wynik dzialania tego watku:

Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Received message:
ActiveMQTextMessage {commandId = 6, responseRequired = false, messageId = ID:ppm-55786-1276257991972-0:0:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:ppm-55786-1276257991972-0:0:1:1, destination = queue://ABC0, transactionId = TX:ID:ppm-55786-1276257991972-0:0:1, expiration = 0, timestamp = 1276257992758, arrival = 0, brokerInTime = 1276257992760, brokerOutTime = 1276258333378, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 16, size = 0, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, text = First ActiveMQ message}
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Received message:
ActiveMQTextMessage {commandId = 6, responseRequired = false, messageId = ID:ppm-55786-1276257991972-0:0:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:ppm-55786-1276257991972-0:0:1:1, destination = queue://ABC0, transactionId = TX:ID:ppm-55786-1276257991972-0:0:1, expiration = 0, timestamp = 1276257992758, arrival = 0, brokerInTime = 1276257992760, brokerOutTime = 1276258353773, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 18, size = 0, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, text = First ActiveMQ message}
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616
Connecting to URL failover://tcp://localhost:61616
- Successfully connected to tcp://localhost:61616

Dziwi mnie to, ze dopiero za 9 razem odczytal wiadomosc ktora na niego czeka (wpierw wyslalam wiadomosc, dopiero potem uruchomilam watek do czytania). Potem ja odczytal, zasnal, sprawdzil, zasnal, sprawdzil-i znow odczytal te sama wiadomosc. a potem juz usypial sie i sprawdzal ale nie odczytywal jej(tzn przez kilka minut sprawdzalam ok 5)

Czemu to tak jest? chce zzeby dana wiadomosc przeczytal raz. i w miare szybko, a nie tak jak to mialo miejsce na poczatku-dopiero po 9tym razie. zauwazylam tez, ze zniknela mi ta wiadomosc po jakims czasie (podgladam sobie na http://localhost:8161/admin/queues.jsp tam wszystko ladnie widac). tzn w kolejkach ona jest, ale jak wejde w szczegoly to juz nie ma tam wiadomosci zadnej. czy one gina po paru minutach? czy moze gina po przeczytaniu? jesli tak-dlaczego moj watek odczytal ja dwa razy?

bede wdzieczna za wszelkie podpowiedzi.
pzdr,
misty