我想测试我的jms监听器是否工作正常 当发送5条消息时(例如)我添加了一个计时器 “Threat.sleep(5000)”并且在5秒后我想将旧的messageID与新的messageID进行比较,这意味着我想知道是否收听了消息,如果ID改变意味着他们被成功地听了
这是我的OnMessage代码......但它对我不起作用:((
public class Consumer implements MessageListener{
public Consumer() {
}
//@Override
public void onMessage(Message message) {
try {
TextMessage tm = (TextMessage) message;
int i;
TextMessage tm2 =tm;
for(i=0;i<1;i++)
{
try {
Thread.sleep(5000);
if (!tm.getJMSMessageID().equals(tm2.getJMSMessageID()))
{
System.out.println("\t----Listener not working----");
}
else {
System.out.println("Message reçu:");
System.out.println("\tTemps: " + System.currentTimeMillis() + " ms");
System.out.println("\tMessage ID: " + tm.getJMSMessageID());
System.out.println("\tCorrel. ID: " + tm.getJMSCorrelationID());
System.out.println("\tConsumed message: " + tm.getText());
System.out.println("\t----Listener working----");
}
//fin else
}
catch (InterruptedException ex) {
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
catch (JMSException jex) {
System.out.println("Exception: " + jex);
}
}
}
答案 0 :(得分:1)
因此,您正在检查JMS消息ID以确保没有两条消息具有相同的ID?这可能有点过头了,因为如果你的听众正在接收消息,它就会起作用!......然而,你的方法有一些问题....
TextMessage tm = (TextMessage) message;
...
TextMessage tm2 =tm;
Thread.sleep(5000);
if (!tm.getJMSMessageID().equals(tm2.getJMSMessageID()))
以上if()
将始终为假,因为您正在比较相同的消息;另外,sleep()
语句也没用。
如果您想比较消息ID以确保它们始终是唯一的,但是如果代理无法传递消息,则将重新传递相同的消息并且ID将是相同的,但无论如何,您可以使用此替代你的代码..
private static ConcurrentHashMap<String,String> mesgIdMap =
new ConcurrentHashMap<String, String>();
public Consumer() {
}
//@Override
public void onMessage(Message message) {
try {
TextMessage tm = (TextMessage) message;
if( mesgIdMap.contains( tm.getJMSMessageID()))
System.out.println("\tProcessing JMS message with same ID again!");
//add the message id to the map
mesgIdMap.put( tm.getJMSMessageID(),tm.getJMSMessageID());
//print statements here...