下载activemq :http://activemq.apache.org/components/classic/download/
windows点击activemq.bat一闪而过,使用命令 activemq-admin.bat start 启动
浏览器访问:http://localhost:8161
项目中使用 tcp://127.0.0.1:61616 是61616端口不是8161端口
生产者:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @PackageName com.example.demo
* @ClassName SendTest
* @Description
* @date 2019/9/12 9:47
*/
public class SendTest {
//定义ActivMQ的连接地址
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
//定义发送消息的队列名称
private static final String QUEUE_NAME = "activemq";
public static void main(String[] args) throws JMSException {
//创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//打开连接
connection.start();
//创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建队列目标 p2p
// Destination destination = session.createQueue(QUEUE_NAME);
// 发布/订阅
Destination destination = session.createTopic(QUEUE_NAME);
//创建一个生产者
javax.jms.MessageProducer producer = session.createProducer(destination);
//创建模拟100个消息
for (int i = 1 ; i <= 100 ; i++){
TextMessage message = session.createTextMessage("我发送message:" + i);
//发送消息
producer.send(message);
//在本地打印消息
System.out.println("我现在发的消息是:" + message.getText());
}
//关闭连接
connection.close();
}
}
消费者:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @PackageName com.example.demo
* @ClassName ResponseTest
* @Description
* @date 2019/9/12 9:47
*/
public class ResponseTest {
//定义ActivMQ的连接地址
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
//定义发送消息的队列名称
private static final String QUEUE_NAME = "activemq";
public static void main(String[] args) throws JMSException {
//创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//打开连接
connection.start();
//创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建队列目标 p2p
// Destination destination = session.createQueue(QUEUE_NAME);
// 发布/订阅
Destination destination = session.createTopic(QUEUE_NAME);
//创建消费者
javax.jms.MessageConsumer consumer = session.createConsumer(destination);
//创建消费的监听
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("获取消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
总结:2种模式,一种是点对点模式,使用queue队列,消息不能共享。一种是发布/订阅模式,消息可以共享。
场景:粉丝关注公众号,公众号发送消息,粉丝接受到消息之后再发送消息给公众号,告知公众号已接收到消息。此为模拟场景,不是真实场景。其他场景自行研究
公众号发送消息,粉丝接受到消息:使用发布/订阅模式,生产者只管发送消息,至于消费者到底有没有接收消息,生产者根本不关心。
粉丝接受到消息之后再发送消息给公众号,告知公众号已接收到消息:使用点对点的模式,生产者只需要发送消息给单一消费者即可。