ActiveMq生产者与消费者原生Api

ActiveMq原生的Api如下:

其中消费者接受消息的方式有两种:

1、同步,即:消费者主动接收消息,若消息队列中没有消息则阻塞等待

2、异步,即:当生产者将消息发送到消息队里后,消息队列会调用消费者的onMessage方法,消费者不用阻塞等待,可执行其它业务。

代码如下:

/********************************************************
 * 

Description: ActiveMq原生Api生产者

*

Project: NativeMqProducer.java

*

Date: 2019-06-06 10:00:00

*

Author: BreaKing

*

Comment :

* *********************************************************/ package com.spiderman.nativeMq; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class NativeMqProducer { //默认连接用户名 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 = 3; public static void main(String[] args) { /* 连接工厂*/ ConnectionFactory connectionFactory; /* 连接*/ Connection connection = null; /* 会话*/ Session session; /* 消息的目的地*/ Destination destination; /* 消息的生产者*/ MessageProducer messageProducer; /* 实例化连接工厂*/ connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL); try { /* 通过连接工厂获取连接*/ connection = connectionFactory.createConnection(); /* 启动连接*/ connection.start(); /* 创建session * 第一个参数表示是否使用事务,第二次参数表示是否自动确认*/ session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); /* 创建一个名为HelloWorld消息队列*/ destination = session.createQueue("HelloActiveMqQueue"); /* 创建消息生产者*/ messageProducer = session.createProducer(destination); /* 循环发送消息*/ for(int i = 0;i < SENDNUM; i++){ String msg = "发送消息"+i+" "+System.currentTimeMillis(); TextMessage textMessage = session.createTextMessage(msg); System.out.println("标准用法:"+msg); messageProducer.send(textMessage); } } catch (Exception e) { e.printStackTrace(); } finally { if (connection != null) { try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } }
/********************************************************
 * 

Description: ActiveMq原生Api同步消费者

*

Project: NativeMqConsumer.java

*

Date: 2019-06-06 10:00:00

*

Author: BreaKing

*

Comment :

* *********************************************************/ package com.spiderman.nativeMq; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class NativeMqConsumer { /*默认连接用户名*/ 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(USERNAME,PASSWORD,BROKEURL); try { /* 通过连接工厂获取连接*/ connection = connectionFactory.createConnection(); /* 启动连接*/ connection.start(); /* 创建session*/ session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); /* 创建一个名为HelloWorld消息队列*/ destination = session.createQueue("HelloActiveMqQueue"); /* 创建消息消费者*/ messageConsumer = session.createConsumer(destination); Message message; while((message = messageConsumer.receive())!=null){ System.out.println(((TextMessage)message).getText()); } } catch (JMSException e) { e.printStackTrace(); } finally { if (connection!=null) { try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } }
/********************************************************
 * 

Description: ActiveMq原生Api异步消费者

*

Project: NativeMqConsumerAsyn.java

*

Date: 2019-06-06 10:00:00

*

Author: BreaKing

*

Comment :

* *********************************************************/ package com.spiderman.nativeMq; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class NativeMqConsumerAsyn { /*默认连接用户名*/ 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(USERNAME,PASSWORD,BROKEURL); try { /* 通过连接工厂获取连接*/ connection = connectionFactory.createConnection(); /* 启动连接*/ connection.start(); /* 创建session*/ session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); /* 创建一个名为HelloWorld消息队列*/ destination = session.createQueue("HelloActiveMqQueue"); /* 创建消息消费者*/ messageConsumer = session.createConsumer(destination); /* 设置消费者监听器,监听消息*/ messageConsumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { try { System.out.println(((TextMessage)message).getText()); } catch (JMSException e) { e.printStackTrace(); } } }); } catch (JMSException e) { e.printStackTrace(); } } }

其中需要注意的是,创建Session的方法

session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

第一个参数:代表是否启用事务(即当消息发送者向消息提供者(即消息代理)发送消息时,消息发送者等待消息代理的确认,没有回应则抛出异常,消息发送程序负责处理这个错误。)

第二个参数:代表消息的确认方式

     1、AUTO_ACKNOWLEDGE:指定消息接收者在每次收到消息时自动发送确认。消息只向目标发送一次,但传输过程中可能因为错误而丢失消息。

     2、CLIENT_ACKNOWLEDGE:由消息接收者确认收到消息,通过调用消息的acknowledge()方法(会通知消息提供者收到了消息)

    3、DUPS_OK_ACKNOWLEDGE:指定消息提供者在消息接收者没有确认发送时重新发送消息(这种确认模式不在乎接收者收到重复的消息)。

 

最后,我们先启动两个消费者,最后再启动生产者发送消息,来看下测试结果:

ActiveMq生产者与消费者原生Api_第1张图片

ActiveMq生产者与消费者原生Api_第2张图片

ActiveMq生产者与消费者原生Api_第3张图片

你可能感兴趣的:(ActiveMq生产者与消费者原生Api)