通过第一章已经很轻松地实现了RabbitMQ的安装和启动,第二章开始最简单的java demo学习,一层一层深入了解RabbitMQ的牛逼之处,期间肯定也会碰到很多问题,这些问题,将会收集起来,最后面去解决同时也会写相关的文章。
一、项目相关jar包导入:
新建一个maven工程,pom.xml中引入:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.5.1</version>
</dependency>
二、写一个发布者:
步骤:
客户端:
-
创建一个连接工厂,用于生成与RabbitMQ进行连接
-
根据这个连接工厂设置RabbitMQ所在的主机,账号密码和端口号等(默认情况下就不需要账号密码和端口了)
-
由连接工厂生成与RabbitMQ的连接
-
创建一条通道,然后由这个通道声明一个队列
-
给这个队列添加信息
-
添加完毕后,关闭通道。
以下是客户端的相关代码:
package rabbitmqDemo.demo1.client;
import java.io.IOException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer_demo1 {
public final static String QUEUENAME="mq.test_demo1";//队列名称
public final static String HOST="localhost"; //主机名
public final static String USERNAME="guest";
public final static String PASSWORD="guest";
public final static String EXCHANGE_NAME=""; //交换机名(以后会学,不用太在意这个)
public static void main(String[] args) {
ConnectionFactory factory=new ConnectionFactory();//创建一个连接工厂,用于生成与RabbitMQ进行连接
factory.setHost(HOST);//根据这个连接工厂设置RabbitMQ所在的主机,账号密码和端口号等(默认情况下就不需要账号密码和端口了)
factory.setUsername(USERNAME);
factory.setPassword(PASSWORD);
try {
Connection connection = factory.newConnection();// 3. 由连接工厂生成与RabbitMQ的连接
Channel newChannel = connection.createChannel();//4. 创建一条通道
newChannel.queueDeclare(QUEUENAME,false,false,true,null);//由这个通道声明一个队列
String sendMessage="你好,我是生产者!";//要发送的消息
newChannel.basicPublish(EXCHANGE_NAME, QUEUENAME, null, sendMessage.getBytes());
System.out.println("消息已发送,去消费端控制台看看");
newChannel.close();//关闭通道
connection.close();//关闭连接
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
三、写一个消费者
步骤:
-
与上面的生产者一样,一直到创建好通道为止;
-
通道创建好后,关联相关的队列
-
根据关联的队列,创建消费者对象,实现handleDelivery()方法,一直监听以至有消息时打印出消息。
相关代码:
package rabbitmqDemo.demo1.consumer;
import java.io.IOException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Consumer_demo1 {
public final static String QUEUENAME="mq.test_demo1";//队列名称
public final static String HOST="localhost"; //主机名
public final static String USERNAME="guest";
public final static String PASSWORD="guest";
public final static String EXCHANGE_NAME="";
public static void main(String[] args) {
ConnectionFactory factory=new ConnectionFactory();//创建一个连接工厂,用于生成与RabbitMQ进行连接
factory.setHost(HOST);//根据这个连接工厂设置RabbitMQ所在的主机,账号密码和端口号等(默认情况下就不需要账号密码和端口了)
factory.setUsername(USERNAME);
factory.setPassword(PASSWORD);
Connection connection;
try {
connection = factory.newConnection();
Channel newChannel = connection.createChannel();//4. 创建一条通道,通道创建好后,关联相关的队列
newChannel.queueDeclare(QUEUENAME, false, false, true, null);
Consumer consumer =new DefaultConsumer(newChannel){
//重写handleDelivery方法
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println("消费端收到消息: '" + message + "'");
//自动回复队列应答 -- RabbitMQ中的消息确认机制
newChannel.basicConsume(QUEUENAME, true, consumer);
} catch (IOException e) {
e.printStackTrace();
}
运行后得到信息:
生产者:
消费者:
四、至此,一个简单的java demo就写完了。但光写了不行,从这个小栗子中我们还是会有很多疑问,比如:
对于生产者端:
-
RabbitMQ中的通道,到底是什么意思,它和队列又有着什么关系?
-
生产者发送信息的时候,为什么使用通道这个类的方法去发送,而不是使用队列这个类去发送?
-
什么是交换机?RabbitMQ的交换机有几种?不同的交换机如何使用?
消费者端:
-
Consumer的handleDelivery方法有什么作用?
-
这个方法:new Channel.basicConsume(QUEUENAME, true, consumer);为什么运行这个方法的时候,服务器会一直监听?是不是隐藏着实现while(true)之类的代码?
-
AMQP是什么,这个类有什么作用?
带着这些问题,我们以后会慢慢去学,去弄懂!
java 程序崩溃无日志 jvm 崩溃日志设置
OutOfMemoryError异常在JVM内存区域中,除了程序计数器外,其他内存区域都有可能发生OOM异常,下面我们来一一模拟每个内存区域OOM异常的场景。先介绍几个JVM参数:-Xms:设置JVM初始堆内存的大小。
-Xmx:设置JVM最大堆内存的大小。
-Xmn: 设置年轻代的大小、
-Xss:设置每个线程对应的栈的大小。
-XX:+HeapDumpOnOutOfMemoryError:发生