JMS学习二(简单的ActiveMQ实例)
下载安装ActiveMQ服务,下载地址当然可以去官网下载
http://activemq.apache.org/download-archives.html
ActiveMQ安装很简单,下载解压后到bin目录就有win32 和win64两个目录按照自己的系统进入后就有activemq.bat来启动ActiveMQ服务
一、点对点消息模型实例
使用queue作为目的之
1、消息发送端
package mqtest1; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Producer {
public static void main(String[] args) {
int i =0;
//链接工厂
ActiveMQConnectionFactory connectionFactory = null;
//链接对象
Connection connection = null;
//会话
Session session = null;
//队列(目的地、生产者发送消息的目的地)
Queue queue = null;
//消息生产者
MessageProducer producer = null;
connectionFactory = new ActiveMQConnectionFactory("admin","admin","tcp://192.168.1.120:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
//第一个参数是否开启事务 true开启 ,false不开启事务,如果开启记得手动提交
//参数二,表示的是签收模式,一般使用的有自动签收和客户端自己确认签收
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
queue = session.createQueue("test_queue");
//为队列创建消息生产者
producer = session.createProducer(queue);
//消息是否为持久性的,这个不设置也是可以的,默认是持久的
//producer.setDeliveryMode(DeliveryMode.PERSISTENT); //消息设置为持久的发送后及时服务关闭了再次开启消息也不会丢失。
//producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //发送后如果服务关闭再次开启则消息会丢失。
while (true){
//创建消息
TextMessage message = session.createTextMessage();
message.setText("测试队列消息"+i);
//发送消息到目的地
producer.send(message);
i++;
if(i>10) {
break;
}
}
session.commit();
System.out.println("呵呵消息发送结束");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//释放资源
//producer.close();
//session.close();
//connection.close();
}
}
}
2、消息消费端
package mqtest1; import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Receive {
public static void main(String[] args) {
// 链接工厂
ActiveMQConnectionFactory connectionFactory = null;
// 链接对象
Connection connection = null;
// 会话
Session session = null;
// 队列(目的地,消费者消费消息的地方)
Queue queue = null;
// 消息消费者
MessageConsumer consumer = null;
connectionFactory = new ActiveMQConnectionFactory("admin", "admin",
"tcp://192.168.1.120:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
// 创建session是的true 和false
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queue = session.createQueue("test_queue"); // 队列(目的地,消费者消费消息的地方)
consumer = session.createConsumer(queue); // 消息消费者
// Message message = consumer.receive(); //同步方式接收
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
String value = textMessage.getText();
System.out.println("value: " + value);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
点对点模型Destination作为目的地
1、消息发送端
package mq; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; public class TestMQ {
public static void main(String[] args) {
int i =0;
//链接工厂
ConnectionFactory connectionFactory = null;
// 链接对象
Connection connection = null;
// 会话对象
Session session = null;
// 目的地
Destination destination = null;
// 消息生产者
MessageProducer producer = null;
connectionFactory = new ActiveMQConnectionFactory("admin","admin","tcp://192.168.1.120:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
//第一个参数是否开启事务 true开启 ,false不开启事务,如果开启记得手动提交
//参数二,表示的是签收模式,一般使用的有自动签收和客户端自己确认签收
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("test-queue");
//为目的地创建消息生产者
producer = session.createProducer(destination);
//消息是否为持久性的,这个不设置也是可以的,默认是持久的
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
while(true) {
TestBean tbean = new TestBean();
tbean.setAge(25);
tbean.setName("hellojava" +i);
producer.send(session.createObjectMessage(tbean));
i++;
if( i>10) {
break;
}
}
System.out.println("呵呵消息已发送");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
producer.close();
session.close();
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2、消息消费端
package mq; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; public class AcceptMq {
public static void main(String[] args) {
ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection = null;
// Session: 一个发送或接收消息的线程
Session session = null;
// Destination :消息的目的地;消息发送给谁.
Destination destination = null;
// 消费者,消息接收者
//MessageConsumer consumer = null;
connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.1.120:61616");
try {
//通过工厂创建链接
connection = connectionFactory.createConnection();
//启动链接
connection.start();
//创建会话
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//消息目的地
destination = session.createQueue("test-queue");
//消息消费者
MessageConsumer consumer = session.createConsumer(destination);
//同步方式接受信息,如果还没有获取到则会阻塞直到接收到信息
/*Message messages = consumer.receive();
TestBean value =(TestBean)((ObjectMessage)messages).getObject();
String name = value.getName();*/
consumer.setMessageListener(new MessageListener(){
@Override
public void onMessage(Message message){
try {
TestBean tbean =(TestBean)((ObjectMessage)message).getObject();
System.out.println("tbean: "+tbean);
if(null != message) {
System.out.println("收到信息1: "+tbean.getName());
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、bean 类
package mq; import java.io.Serializable; public class TestBean implements Serializable{
private int age;
private String name;
public TestBean() {};
public TestBean(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二、发布/订阅消息模型实例
1、消息发布端
package mq; import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
public class PSMQ {
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("admin","admin","tcp://192.168.1.101:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建话题
Topic topic = session.createTopic("myTopic.messages");
//为话题创建消息生产者
MessageProducer producer = session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
while(true) {
TextMessage message = session.createTextMessage();
message.setText("message_" + System.currentTimeMillis());
producer.send(message);
System.out.println("Sent message: " + message.getText());
}
}
}
2、消息订阅端
package mq;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.MessageListener;
import org.apache.activemq.ActiveMQConnectionFactory;
public class PSAccept {
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("admin","admin","tcp://192.168.1.101:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建话题
Topic topic = session.createTopic("myTopic.messages");
//为话题创建消费者
MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
try {
System.out.println("Received message: " + tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
点对点消息模型和发布/订阅消息模型两种方式其实不同的就是使用队列、还是使用话题创建目的地不同其他的都一样。
connectionFactory = new ActiveMQConnectionFactory("admin","admin","tcp://192.168.1.120:61616");
其中第一个admin是用户名第二个是密码而第三个参数就是协议+ip+port(端口),这几个参数两个客户端都是一样的不然消费端就获取不到了……
在消息消费者中我们接收消息有两种方式即同步接收和异步接收,同步接受就是使用receive()方法来接受而异步就是设置一个监听对象。
说到密码我们顺便来看看ActiveMQ访问密码的设置
三、ActiveMQ访问密码设置
在ActiveMQ的conf目录的activemq.xml中添加账号密码
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="whd" password="123" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
activemq.xml中添加位置:
ok这样我们对这个ActiveMQ设置了一个用户名密码,所以在创建链接的时候要修改admin这个默认的用户名密码为修改后的用户名密码。
connectionFactory = new ActiveMQConnectionFactory("whd", "123","tcp://192.168.0.104:61616");
这样我们就能正常的向服务器发送消息而消费端也能从服务商消费消息了……
差点忘了,还有一个ActiveMQ管理页面地址:http://127.0.0.1:8161/admin/ 访问这个地址登陆管理页面,默认用户名密码都是admin
JMS学习二(简单的ActiveMQ实例)的更多相关文章
- grpc使用记录(二)简单同步服务实例
目录 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 server.cpp 代码 编译 4.编写客户端代码 client.cpp代码 5.简单测试一下 已经折腾 ...
- JMS学习(三)ActiveMQ Message Persistence(转)
1,JMS规范支持两种类型的消息传递:persistent and non-persistent.ActiveMQ在支持这两种类型的传递方式时,还支持消息的恢复.中间状态的消息(message are ...
- JMS学习(三)ActiveMQ Message Persistence
1,JMS规范支持两种类型的消息传递:persistent and non-persistent.ActiveMQ在支持这两种类型的传递方式时,还支持消息的恢复.中间状态的消息(message are ...
- grpc使用记录(三)简单异步服务实例
目录 grpc使用记录(三)简单异步服务实例 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 async_service.cpp async_service2. ...
- 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...
- JMS【三】--ActiveMQ简单的HelloWorld实例
第一篇博文JMS[一]--JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文JMS[二 ...
- JMS【二】--ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文JMS[一]--JMS基本概念,我们介绍了消息通信的规范JMS,我 ...
- 【转】深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
这篇博文,我们使用ActiveMQ为大家实现一种点对点的消息模型.如果你对点对点模型的认识较浅,可以看一下第一篇博文的介绍. JMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单,下 ...
- 【转】深入浅出JMS(二)--ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 这篇博文介绍一款开源的JMS具体实现——ActiveMQ.ActiveMQ ...
随机推荐
- [转帖]Ubuntu 18.04 server安装图形界面及realvnc远程桌面连接
Ubuntu 18.04 server安装图形界面及realvnc远程桌面连接 https://blog.csdn.net/networken/article/details/88938304 转帖 ...
- Anaconda折腾记(1)
Anaconda折腾记 谨此记录小白的我在Anaconda里面的摸爬滚打 更换更新源 可以不使用命令,直接进入C盘,进入user文件夹,进入当前的用户文件夹下,记得显示隐藏文件. 找到.condarc ...
- mysql(中)
mysql(中) 一.数据库配置 1.登录mysql 2.在mysql安装目录下:创建my.ini(my.cnf) 3.设置配置信息并保存 ''' [mysqld] character-set-ser ...
- 实用且堪称神器的Chrome插件推荐(转)
出处: http://tengj.top/2018/02/17/ggcj/ 前言 相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户的偏爱,但流畅只是一方面, Chrome 最大 ...
- 087、日志管理之 Docker logs (2019-05-09)
参考https://www.cnblogs.com/CloudMan6/p/7749304.html 高效的监控和日志管理对保持生产系统只需稳定的运行以及排查问题至关重要. 在微服务架构中,由 ...
- div悬浮在屏幕的中间及点击按钮关闭弹出框
#fd { position: fixed; z-index: 999; width: 109px; height: 323px; top: 71%; right: 1%; margin: -50px ...
- 更新 | 2019年9月计算机二级office模拟题库
随着2019年上半年计算机二级考试的完美落幕,紧接着的便是9月份的考试了. 到目前为止,下半年9月份计算机二级考试报名开通时间在6月前后,现在也基本结束. 2019年9月(56次)全国计算机等级考试( ...
- Centos7安装Python3的方法[转]
Centos7安装Python3的方法 由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. [root@VM_105_217_ ...
- Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion' has value '1.8', but '1.7'
第一种方法:安装1.8之前安装了1.7,将1.7卸载就好了. 第二种方法:删掉Windows\System32下的java.exe, javaw.exe 就行了,但是安装的1.8的jdk会回到1.7的 ...
- 了解ffmpeg生态
我以前整理的ffmpeg相关资料: 了解ffmpeg要读的资料 https://blog.csdn.net/yyhustim/article/details/9078941 ffmpeg和ffserv ...