ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。
安装就是在官网进行下载解压,进入bin目录,执行可执行文件带参数start。这里不是重点
先来看张图
看完图之后我们来初步认识一下
第一种方式,点对点的发送方与接收方
/**
* 服务器地址。
*/
private String remoteUrl = "tcp://47.93.xxx:61616";
/**
* 点到点形式发送消息,发送方<br>
* 会创建一个test-queue的Queue队列,如果对方没有接收到,那么Number Of Pending Messages待处理消息的数量就会++<br>
* 如果对方接收到了就会不变,因为对方接收到了嘛。
* @throws Exception
*/
@Test
public void 点对点发送方() throws Exception {
// 1、创建一个连接工厂对象,需要指定服务的ip及端口。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(remoteUrl);
// 2、使用工厂对象创建一个Connection对象。
Connection connection = connectionFactory.createConnection();
// 3、开启连接,调用Connection对象的start方法。
connection.start();
// 4、创建一个Session对象。
// 第一个参数:是否开启事务。如果true开启事务,第二个参数无意义。一般不开启事务false。
// 第二个参数:应答模式。自动应答或者手动应答。一般自动应答。
// 自动应答:Session.AUTO_ACKNOWLEDGE手动应答:Session.CLIENT_ACKNOWLEDGE
/**
* 这个事务不是数据库中的跟那个事务没关系,这个是activeMq中的事务,意思是说如果消息没有发出去的话就重发
* 这个事务是和数据库的分布式事务配合使用的,在同时提交多个数据库,保证多个事件都在一个事务里面完成。想想都头疼,所以一般很少有人用
* 所以一般不开启事务,如果开启事务,第二个参数无意义,自动忽略,如果false的话那么就是应答模式。
*/
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5、使用Session对象创建一个Destination对象,创建一个叫test-queue的队列信息。两种形式queue、topic,现在应该使用queue
Queue queue = session.createQueue("test-queue");
// 6、使用Session对象创建一个Producer对象。
MessageProducer producer = session.createProducer(queue);
// 7、创建一个Message对象,可以使用TextMessage。
/*
* TextMessage textMessage = new ActiveMQTextMessage();
* textMessage.setText("hello Activemq");
*/
TextMessage textMessage = session.createTextMessage("hello activemq");
// 8、发送消息
producer.send(textMessage);
// 9、关闭资源
producer.close();
session.close();
connection.close();
System.out.println("消息发送成功!");
}
看,刚才发送的消息
下面看看接收方
@Test
/**
* 点到点形式发送消息,sub(subscribe)接收方<br>
* 如果接收到了消息,那么服务器端后台管理的Number Of Pending Messages待处理消息的数量就会++
* 如果接收方一致不停止运行,那么消息发送方一旦在test-queue里面发送了消息的话,那么这边就会立马接收到消息<br>
* 那么服务器端后台管理的Number Of Pending Messages待处理消息的数量就不会变,因为接收端立马就处理了嘛。<br>
* 如果想关闭掉,那么久在这个接收方按下任意键就结束接收了。因为这里用到了system.in.rede();
* @throws Exception
*/
public void 点对点接收方() throws Exception {
// 创建一个ConnectionFactory对象连接MQ服务器
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(remoteUrl);
// 创建一个连接对象
Connection connection = connectionFactory.createConnection();
// 开启连接
connection.start();
// 使用Connection对象创建一个Session对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建一个Destination对象。queue对象,注意对列名一定要和发送方的对列名要一致!
Queue queue = session.createQueue("test-queue");
// 使用Session对象创建一个消费者对象。
MessageConsumer consumer = session.createConsumer(queue);
// 接收消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
// 打印结果
TextMessage textMessage = (TextMessage) message;
String text;
try {
text = textMessage.getText();
System.out.println("接收到消息,消息内容为:" + text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
// 等待接收消息
System.in.read();
// 关闭资源
consumer.close();
session.close();
connection.close();
}
运行后
那么再看服务器端,变成0了吧。接收成功。
第二种形式,广播与订阅
广播方
@Test
/**
* 点到点形式发送消息,sub(subscribe)接收方<br>
* 如果接收到了消息,那么服务器端后台管理的Number Of Pending Messages待处理消息的数量就会++
* 如果接收方一致不停止运行,那么消息发送方一旦在test-queue里面发送了消息的话,那么这边就会立马接收到消息<br>
* 那么服务器端后台管理的Number Of Pending Messages待处理消息的数量就不会变,因为接收端立马就处理了嘛。<br>
* 如果想关闭掉,那么久在这个接收方按下任意键就结束接收了。因为这里用到了system.in.rede();
* @throws Exception
*/
public void 点对点接收方() throws Exception {
// 创建一个ConnectionFactory对象连接MQ服务器
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(remoteUrl);
// 创建一个连接对象
Connection connection = connectionFactory.createConnection();
// 开启连接
connection.start();
// 使用Connection对象创建一个Session对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建一个Destination对象。queue对象,注意对列名一定要和发送方的对列名要一致!
Queue queue = session.createQueue("test-queue");
// 使用Session对象创建一个消费者对象。
MessageConsumer consumer = session.createConsumer(queue);
// 接收消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
// 打印结果
TextMessage textMessage = (TextMessage) message;
String text;
try {
text = textMessage.getText();
System.out.println("接收到消息,消息内容为:" + text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
// 等待接收消息
System.in.read();
// 关闭资源
consumer.close();
session.close();
connection.close();
}
订阅方
@Test
/**
* 广播与订阅方式,这里是订阅方<br>
* 想要接收到订阅到的消息那么一定要静这个方法启动。如果不启动消息就会丢失<br>
* 在这里会启动三个方法,进行订阅,一旦广播方进行了广播,那么这里的三个方法都会接收到消息。
* @throws Exception
*/
public void 订阅方() throws Exception {
// 创建一个ConnectionFactory对象连接MQ服务器
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(remoteUrl);
// 创建一个连接对象
Connection connection = connectionFactory.createConnection();
// 开启连接
connection.start();
// 使用Connection对象创建一个Session对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建一个Destination对象。topic对象
Topic topic = session.createTopic("test-topic");
// 使用Session对象创建一个消费者对象。
MessageConsumer consumer = session.createConsumer(topic);
// 接收消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
// 打印结果
TextMessage textMessage = (TextMessage) message;
String text;
try {
text = textMessage.getText();
System.out.println("接收到订阅消息,消息内容为: " + text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.out.println("topic消费者3启动。。。。");
// 等待接收消息
System.in.read();
// 关闭资源
consumer.close();
session.close();
connection.close();
}
这个方法执行三遍,然后再执行一下广播方法。三个接收就都会接收到广播的内容。
现在再来看一下服务器方的
好,就到这里了。