代码如下:
生产者:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
/***
* 生产者
*
* @author liuzhihu
*
*/
public class Producer {
private final static String brokerURL = "tcp://localhost:61616";
public static void main(String[] args) throws JMSException {
// 1、获取工厂连接
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
// 2、 从连接工厂中获取连接
Connection connection = connectionFactory.createConnection();
// 3、从连接中创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4、选择消息类型
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("name", "yj");
mapMessage.setIntProperty("age", 25);
MapMessage mapMessage2 = session.createMapMessage();
mapMessage2.setString("name", "yy");
mapMessage2.setIntProperty("age", 23);
// 5、创建消息目的地
Destination destination = session.createQueue("testQueueI2");
// 6、创建生产者
MessageProducer producer = session.createProducer(destination);
// 7、非持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 8、发送消息
producer.send(mapMessage);
producer.send(mapMessage2);
session.close();
connection.close();
}
}
消费者:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Consume {
public static String condition = "age>=25";
public static void main(String[] args) throws JMSException {
// 1、获取工厂连接 使用默认的用户名、密码、地址
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);
// 2、 从连接工厂中获取连接 同时启动链接
Connection connection = connectionFactory.createConnection();
connection.start();
// 3、从连接中创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4、创建消息目的地
Destination destination = session.createQueue("testQueueI2");
// 5、创建消费者
MessageConsumer consumer = session.createConsumer(destination, condition);
// 6、注册
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if (message instanceof MapMessage) {
try {
System.out.println("接收消息:" + ((MapMessage) message).getString("name"));
message.acknowledge();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
}
}
注:
1.producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 这段代码,是代表着非持久化,一般情况下,学习的情况下,用的比较多,重启activemq,原本发布的消息会丢失,生产环境中,一般是开启持久化的,消息内容往往都是会保存在数据库中,当然,要是对于消息的丢失没有要求的话,可以选择不开启持久化,性能相对提高。
2. 消费者获取生产者发布的消息时,是主动去请求获取消息的过程,只是MessageListener将这个过程给封装了。
3.使用MessageListener 接收消息时,一定要用message instanceof xxx,因为往往还会存在一些其他的消息类型。