先来张对比图,凑合看
1.下载安装
http://activemq.apache.org/activemq-5159-release
解压,运行
进入bin目录 ./activemq start
查看进程 ps -ef |grep activemq|grep -v grep
查看端口占用
netstat -anp|grep 61616
访问页面
http://192.168.67.209:8161/
用户名和密码都是admin
2.开发生产者和消费者(队列)
#生产者
public static void ProducerTest() throws Exception{
//1、创建工厂连接对象,需要制定ip和端口号
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.67.209:61616");
//2、使用连接工厂创建一个连接对象
Connection connection = connectionFactory.createConnection();
//3、开启连接
connection.start();
//4、使用连接对象创建会话 第一是叫事物,第二个是签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5、使用会话对象创建目标对象,包含queue和topic(一对一和一对多),目的地是队列还是主题
Queue queue = session.createQueue("test-queue");
//6、使用会话对象创建生产者对象
MessageProducer producer = session.createProducer(queue);
//7、使用会话对象创建一个消息对象
for (int i=0;i<3;i++){
TextMessage textMessage = session.createTextMessage("hello!test-queue...."+i);
//8、发送消息
producer.send(textMessage);}
//9、关闭资源
producer.close();
session.close();
connection.close();
}
#消费者(该方式会堵塞线程不推荐)
public static void ConsumerTest() throws Exception {
//1、创建工厂连接对象,需要制定ip和端口号
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.67.209:61616");
//2、使用连接工厂创建一个连接对象
Connection connection = connectionFactory.createConnection();
//3、开启连接
connection.start();
//4、使用连接对象创建会话 第一是叫事物,第二个是签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5、使用会话对象创建目标对象,包含queue和topic(一对一和一对多),目的地是队列还是主题
Queue queue = session.createQueue("test-queue");
//6、使用会话对象创建生产者对象
MessageConsumer messageConsumer = session.createConsumer(queue);
/*该方式会堵塞线程,不推荐使用
while (true) {
//可加时间参数,如不填会一直等待,指定时间内没有消息会向下执行
TextMessage textMessage = (TextMessage) messageConsumer.receive(4000);
if (null != textMessage) {
System.out.println("消费者消费消息=====" + textMessage.getText());
} else {
break;
}
}
//9、关闭资源
messageConsumer.close();
session.close();
connection.close();*/
//7、向consumer对象中设置一个messageListener 监听 对象,用来接收消息
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage textMessage = (TextMessage)message;
try {
System.out.println("消费者消费消息====="+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
//8、程序等待接收用户消息
System.in.read();
//9、关闭资源
messageConsumer.close();
session.close();
connection.close();
}
如果一个生产者对应多个消费者,默认会轮询消费
如果使用主题 将Queue queue = session.createQueue("test-queue"); 修改为Topic topic = session.createTopic("test-topic"); 即可
当使用主题是,生产者一对多每个消费者会接到全部的消息。
注:主题模式应先开启消费者,再开生产者,否,先生产的消息不会被消费。
如果使用Map存储
// 生产者部分
for (int i = 0; i < 3; i++) {
TextMessage textMessage = session.createTextMessage("hello!test-queue...." + i);
//8、发送消息
producer.send(textMessage);
MapMessage mapMessage=session.createMapMessage();
mapMessage.setString("k1","mapMessage...hello_k1");
producer.send(mapMessage);
}
//消费者部分
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage textMessage = (TextMessage)message;
try {
System.out.println("消费者消费消息====="+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
if(message instanceof MapMessage){
MapMessage mapMessage = (MapMessage)message;
try {
System.out.println("消费者消费消息====="+mapMessage.getString("k1"));
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
主题开启持久化
//生产者
public static void ProducerTest() throws Exception {
//1、创建工厂连接对象,需要制定ip和端口号
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.67.209:61616");
//2、使用连接工厂创建一个连接对象
Connection connection = connectionFactory.createConnection();
//4、使用连接对象创建会话 第一是叫事物,第二个是签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5、使用会话对象创建目标对象,包含queue和topic(一对一和一对多),目的地是队列还是主题
//Queue queue = session.createQueue("test-queue"); //队列
Topic topic = session.createTopic("test-topic2"); //主题
//6、使用会话对象创建生产者对象
// MessageProducer producer = session.createProducer(queue); //队列
MessageProducer producer = session.createProducer(topic); //主题
producer.setDeliveryMode(DeliveryMode.PERSISTENT); //开启生产者持久化
//3、开启连接 需要放在开启持久化后
connection.start();
//7、使用会话对象创建一个消息对象
for (int i = 0; i < 3; i++) {
TextMessage textMessage = session.createTextMessage("hello!test-queue...." + i);
//8、发送消息
producer.send(textMessage);
}
//9、关闭资源
producer.close();
session.close();
connection.close();
}
//消费者
public static void ConsumerTest() throws Exception {
//1、创建工厂连接对象,需要制定ip和端口号
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.67.209:61616");
//2、使用连接工厂创建一个连接对象
Connection connection = connectionFactory.createConnection();
connection.setClientID("anpx");
//4、使用连接对象创建会话 第一是叫事物,第二个是签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5、使用会话对象创建目标对象,包含queue和topic(一对一和一对多),目的地是队列还是主题
//Queue queue = session.createQueue("test-queue"); //队列
Topic topic = session.createTopic("test-topic2"); //主题
//持久化的订阅者
TopicSubscriber subscriber = session.createDurableSubscriber(topic, "remark..");
//3、开启连接
connection.start();
Message message = subscriber.receive();
while (null != message) {
TextMessage textMessage = (TextMessage) message;
System.out.println("消费者消费消息:" + textMessage.getText());
message = subscriber.receive(5000);
}
//9、关闭资源
session.close();
connection.close();
}
***事物*** (主要是在生产者)
生产者
1.Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); //修改flase 为true 2.session.commit(); //开启事务后必须commit才会提交 如果没有commit
消费者
1.Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //和生产者一样 修改flase 为true
2.
***签收*** (主要是在消费者)
无事物自动签收时,消费这无需做任何操作,无事物手动签收时需要添加一行代码
while (null != message) {
TextMessage textMessage = (TextMessage) message;
System.out.println("消费者消费消息:" + textMessage.getText());
message = subscriber.receive(5000);
message.acknowledge(); //签收
}
有事物时,事物 >> 签收,有事物时如果不commit 签收也不会消费。