您好我有java代码,它有一个生产者和一个消费者。生产者将消息发送到队列,消费者也获取消息,但我不知道为什么消息不显示。我正在使用activeMQ,因为我没有得到消息,所以我在http:/ localhost:8161 / admin / queues.jsp中检查,并显示队列有生产者和消费者但是消息没有打印在命令提示符。请告诉我
producer.java
import javax.jms.*;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Producer {
private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static String subject = "test";
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory =
new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(subject);
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("this is a g message");
producer.send(message);
System.out.println("Sent message '" + message.getText() + "'");
System.out.println( ActiveMQConnection.DEFAULT_BROKER_URL);
connection.close();
}
}
consumer.java
import javax.jms.*;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Consumer {
private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static String subject = "test";
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory
= new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(subject);
MessageConsumer consumer = session.createConsumer(destination);
Message message = consumer.receive();
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("Received message '"
+ textMessage.getText() + "'");
}
connection.close();
}
}
答案 0 :(得分:0)
在我看来,代码应该可行。不是说明显的,但你确定你在同一系统上运行生产者和消费者吗?您要连接的默认代理URL依赖于localhost - 因此显然生产者和消费者必须位于同一系统上。您确定您的独立Java应用程序是否连接到activeMQ服务器并成功创建连接?
如果是,那么您可以 connect via jmx 并检查队列中的以下指标:
排队计数 - 显示队列中发布的消息数量 - > 确认您的制作人是否正在发布
出队计数 - 显示已消费但未被确认的消息数#> 确认您的消费者是否已消费
发货计数 - 显示消费和购买消息的数量 - > 确认您的消费者已经确认,即消费者在消费时没有抛出一些异常导致消费者无法收到消息。
如果一切正常,这些计数应该都是平等的。
答案 1 :(得分:-1)
您必须implement
MessageListener
public class Consumer implements MessageListener
你需要像这样覆盖onMessage
:
@Override
public void onMessage(Message message) {
if(message instanceof TextMessage){
//DO something
}
}
在设置此消费者时,您需要执行以下操作: -
ActiveMQConnectionFactory connectionFactory= new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
Connection jmsConnection = connectionFactory.createConnection(userName,passWord);
jmsConnection.start();
Session jmsSession = jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = jmsSession.createQueue(queuname);
//Subscribing to a Topic
MessageConsumer msgConsumer = jmsSession.createConsumer(destination);
msgConsumer.setMessageListener(this);
的修改
此代码将在到达队列后继续收听消息。
您可以在main方法中添加此块,这将起作用。
希望这会有所帮助。