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