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 ...
随机推荐
- sql server优化方向?
系列转自KK:https://www.cnblogs.com/double-K/ Expert 诊断优化系列------------------你的CPU高么? Expert 诊断优化系列------ ...
- css精灵图使用
1. 精灵技术的使用 CSS 精灵其实是将网页中的一些背景图像整合到一张大图中(精灵图),然而,各个网页元素通常只需要精灵图中不同位置的某个小图,要想精确定位到精灵图中的某个小图,就需要使用CSS的b ...
- ps -ef 和ps -aux的区别
在 linux 显示进程的命令是ps ,常用的是 ps -ef,今天看到了还有一个ps -aux,查询了资料,这里总结一下 那么ps -ef 和ps -aux 有什么区别呢? 其实区别不是很大,这就要 ...
- [LeetCode] 完全二叉树的节点个数
题目链接: https://leetcode-cn.com/problems/count-complete-tree-nodes 难度:中等 通过率:57.4% 题目描述: 给出一个 完全二叉树 ,求 ...
- 关于 Spring AOP (AspectJ) 你该知晓的一切 (转)
出处:关于 Spring AOP (AspectJ) 你该知晓的一切
- 模板 - 强连通分量/割点/桥 - Tarjan
int dfn[N], low[N], dfncnt, s[N], tp; int scc[N], sc; // 结点 i 所在 scc 的编号 int sz[N]; // 强连通 i 的大小 voi ...
- JAVA重写不需要@override
一,如下代码, package com.boot.enable.bootenable; import org.springframework.scheduling.annotation.Async; ...
- CF1090H Linearization
传送门 先考虑什么样的串才符合条件.\(s_i=P(x\&i)\oplus b\),其实这里的\(b\)只能使得整体是否取反,所以可以先不管.然后考虑\(x\)的每个二进制位的对\(s_0\) ...
- scrapy在settings中添加redis,可以实现断点续传
DUPEFILTER_CLASS='scrapy_redis.dupefilter.RFPDupeFilter'SCHEDULER = 'scrapy_redis.scheduler.Schedule ...
- vue项目报错1 Vue is a constructor and should be called with the `new` keyword && jquery.js?eedf:3850 Uncaught TypeError: this._init is not a function...
Vue is a constructor and should be called with the `new` keyword Uncaught TypeError: this._init is n ...