• JMS 之 ActiveMQ


    ActiveMQ 开发包下载及运行环境搭建

    <<activemq-parent-5.11.1-source-release.zip>>

    <<apache-activemq-5.11.1-bin.zip>>

       

    网页地址

    主页:http://activemq.apache.org/

    目前最新版本:5.11.1

    开发包及源码下载地址:http://activemq.apache.org/activemq-5111-release.html

    ActiveMQ 服务启动地址:http://127.0.0.1:8161/admin/ 用户名/密码 admin/admin

    进入bin目录启动对应操作系统的程序

    进入后台

    http://127.0.0.1:8161/admin/

    用户名和密码都是 admin

    ActiveMQ 点对点消息实现

    直接 Receive 方式

    Session.AUTO_ACKNOWLEDGE。当客户成功的从receive方法返回的时候,或者从MessageListener.onMessage

    方法成功返回的时候,会话自动确认客户收到的消息。

    Session.CLIENT_ACKNOWLEDGE。 客户通过消息的 acknowledge 方法确认消息。需要注意的是,在这种模

    式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消 费的消息。例如,如果一

    个消息消费者消费了 10 个消息,然后确认第 5 个消息,那么所有 10 个消息都被确认。

    Session.DUPS_ACKNOWLEDGE。 该选择只是会话迟钝第确认消息的提交。如果 JMS provider 失败,那么可

    能会导致一些重复的消息。如果是重复的消息,那么 JMS provider 必须把消息头的 JMSRedelivered 字段设置

    true

       

    消息的发送者 JMSProducer

    默认发送地址:failover://tcp://localhost:61616

    public class JMSProducer {

       

    //定义配置文件

    private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名

    private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码

    private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址

    private static final int SENDNUM=10; // 发送的消息数量

       

    public static void main(String[] args) {

       

    ConnectionFactory connectionFactory; // 定义连接工厂,可以生产connection

    Connection connection = null; // 定义连接

    Session session; // 定义会话 接受或者发送消息的线程

    Destination destination; // 定义消息的目的地

    MessageProducer messageProducer; // 定义消息发送者

       

    // 实例化连接工厂

    connectionFactory=new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);

       

    try {

    //从消息工厂中获取连接

    connection=connectionFactory.createConnection(); // 通过连接工厂获取连接

    connection.start(); // 启动连接

    // 创建Session,createSession(是否使用事务连接,消息确认的方式)

    session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);

    destination=session.createQueue("FirstQueue1"); // 创建消息队列,返回一个目的地

    messageProducer=session.createProducer(destination); // 创建消息发送者,传入目的地

    //调用方法,使用消息发送者,发送消息到session

    sendMessage(session, messageProducer); // 发送消息

    //session事务提交

    session.commit();

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } finally{

    //关闭Connection

    if(connection!=null){

    try {

    connection.close();

    } catch (JMSException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    }

       

    /**

    * 发送消息

    * @param session

    * @param messageProducer

    * @throws Exception

    */

    public static void sendMessage(Session session,MessageProducer messageProducer)throws Exception{

    //JMSProducer.SENDNUM 消息生产者的数量

    for(int i=0;i<JMSProducer.SENDNUM;i++){

    //创建要发送的消息

    TextMessage message=session.createTextMessage("ActiveMQ 发送的消息"+i);

    //控制台打印

    System.out.println("发送消息:"+"ActiveMQ 发送的消息"+i);

    //使用messageProducer发送消息

    messageProducer.send(message);

    }

    }

    }

    消息的消费者 JMSConsumer(一直在监听,搜索消息)

    private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名

    private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码

    private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址

       

    public static void main(String[] args) {

    ConnectionFactory connectionFactory; // 连接工厂

    Connection connection = null; // 连接

    Session session; // 会话 接受或者发送消息的线程

    Destination destination; // 消息的目的地

    MessageConsumer messageConsumer; // 消息的消费者

       

    // 实例化连接工厂

    connectionFactory=new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD, JMSConsumer.BROKEURL);

       

    try {

    //消费不需要加事务

    connection=connectionFactory.createConnection(); // 通过连接工厂获取连接

    connection.start(); // 启动连接

    session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 创建Session

    destination=session.createQueue("FirstQueue1"); // 创建连接的消息队列

    messageConsumer=session.createConsumer(destination); // 创建消息消费者

    //获取消息

    while(true){

    //receive(100000)中为毫秒值,每100000毫秒接收一次消息

    TextMessage textMessage=(TextMessage)messageConsumer.receive(100000);

    if(textMessage!=null){

    //打印接收到的消息

    System.out.println("收到的消息:"+textMessage.getText());

    }else{

    break;

    }

    }

    } catch (JMSException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    接收消息的第二种方式,使用监听(常用的

    使用 Listener 监听方式

    创建一个Listener类

    /**

    * 消息监听

    * @author Administrator

    *

    */

    public class Listener implements MessageListener{

    @Override

    public void onMessage(Message message) {

    // TODO Auto-generated method stub

    try {

    System.out.println("收到的消息:"+((TextMessage)message).getText());

    } catch (JMSException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    每次接收到消息都会被监听到

    消息消费者 JMSConsumer

    ActiveMQ 发布-订阅消息模式实现(一对多实现)

    发布-订阅消息模式实现

    一个发布者多个订阅者

    消息发布者 JMSProducer

    消息订阅者1 JMSConsumer

    订阅者1的监听

    消息订阅者1 JMSConsumer 1(同样方法创建消息订阅者)

    订阅者2的监听

       

    运行必须先订阅再发布(只有订阅之后才可以收到消息)

    先运行订阅者12,再运行发布者

       

  • 相关阅读:
    初学Python3
    性能测试学习成长图
    k8s集群部署mysql(docker自创建镜像)
    docker 部署uwgsi+python 启动报错 Python 3 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
    jenkins 打安卓包 cpu使用过高处理操作
    docker部署mysql,nginx,php,并上传镜像到私有仓库
    Linux下PHP7.2扩展
    docker部署Eurake服务,服务节点无法注册服务
    本地Pycharm将spark程序发送到远端spark集群进行处理
    spark集群安装并集成到hadoop集群
  • 原文地址:https://www.cnblogs.com/ChengR/p/13066400.html
Copyright © 2020-2023  润新知