下载安装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

github源码地址

JMS学习二(简单的ActiveMQ实例)的更多相关文章

  1. grpc使用记录(二)简单同步服务实例

    目录 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 server.cpp 代码 编译 4.编写客户端代码 client.cpp代码 5.简单测试一下 已经折腾 ...

  2. JMS学习(三)ActiveMQ Message Persistence(转)

    1,JMS规范支持两种类型的消息传递:persistent and non-persistent.ActiveMQ在支持这两种类型的传递方式时,还支持消息的恢复.中间状态的消息(message are ...

  3. JMS学习(三)ActiveMQ Message Persistence

    1,JMS规范支持两种类型的消息传递:persistent and non-persistent.ActiveMQ在支持这两种类型的传递方式时,还支持消息的恢复.中间状态的消息(message are ...

  4. grpc使用记录(三)简单异步服务实例

    目录 grpc使用记录(三)简单异步服务实例 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 async_service.cpp async_service2. ...

  5. 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例

    第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...

  6. JMS【三】--ActiveMQ简单的HelloWorld实例

    第一篇博文JMS[一]--JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文JMS[二 ...

  7. JMS【二】--ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文JMS[一]--JMS基本概念,我们介绍了消息通信的规范JMS,我 ...

  8. 【转】深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例

    这篇博文,我们使用ActiveMQ为大家实现一种点对点的消息模型.如果你对点对点模型的认识较浅,可以看一下第一篇博文的介绍. JMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单,下 ...

  9. 【转】深入浅出JMS(二)--ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 这篇博文介绍一款开源的JMS具体实现——ActiveMQ.ActiveMQ ...

随机推荐

  1. Spring boot 整合 shiro 出现 org.apache.shiro.UnavailableSecurityManagerException: 错误

    最开始参考的是这个 文档 但是并没有解决我的问题,因为他的配置和我的是一样(差不多)的 https://www.cnblogs.com/ginponson/p/6217057.html 然后看到此篇博 ...

  2. Java 读取application.properties配置文件中配置

    实际开发中若需要读取配置文件application.properties中的配置,代码如下.例:读取配置文件中name属性配置值: 代码如下: import org.springframework.c ...

  3. 洛谷 P2647 最大收益 题解

    题面 对于“n个物品选任意个”我们就可以想到一种递推方法,即设f[i][j]表示前i个物品选j个的最大收益 我们发现正着转移并不好转移,我们可以倒着转移,使选择的当前第i号物品为第一个物品,这样的话我 ...

  4. C++学习——在C文件中调用C++文件中的函数

    1.CPP文件中的内容 #include "mytest.h" #include <iostream> using namespace std; int add(con ...

  5. Almost Increasing Array CodeForces - 946G (dp)

    大意: 定义几乎递增序列为删除不超过一个数后序列严格递增. 给定序列, 求最少改变多少个数能变为几乎递增序列. 跟hdu5256类似,

  6. limux密钥对配置登陆主机

    1. Linux主机免密码使用密钥登陆 这里假设主机A(192.168.0.113)用来远程连接主机B(192.168.0.186) 在主机A上执行如下命令来生成配对密钥:ssh-keygen -t ...

  7. [.net core] 12.环境变量

    异常给开发人员提供了很大好的排错功能. 但是其背后的技术细节很复杂,会损耗性能,也会使.net core web app更容易被反派攻击. 于是我们要学会使用环境变量, 通过环境变量,控制一些逻辑 当 ...

  8. eclipse控制台输出太多被顶掉问题

    控制台空白处右键 属性

  9. 通过web.xml监听器启动main方法

    web.xml中添加要启动的类 <listener> <listener-class>server.NettyServer</listener-class> < ...

  10. 自动内存管理机制之java内存区域与内存溢出异常

    一.运行时数据区域 java虚拟机所管理的内存会包括下面的几个部分: 1.程序计数器:是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器.一般情况下,字节码解释器工作的时候就是通过改变 ...