源码地址: https://download.csdn.net/download/weixin_40461281/10321780
上一篇文章讲了RabbitMQ的安装
接下来介绍一下具体的应用
使用java + rabbitMQ实现聊天功能的demo , 非常有助于理解和上手rabbitMQ , 该demo仅限于用来学习rabbitMQ , 实际工作中实现聊天功能不推荐使用rabbitMQ
首先创建一个maven项目,然后在pom.xml文件中导入RabbitMQ的jar包
地址如下:
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.0</version>
</dependency>
</dependencies>
工作模式采用-工作队列 接下来具体讲解一下代码实现
首先创建一个类A 并创建连接工厂和创建一个新的连接
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置RabbitMQ地址
factory.setHost("localhost");//连接地址
factory.setUsername("guest");//用户名
factory.setPassword("guest");//密码
factory.setPort(5672);//端口号
//创建一个新的连接
final Connection connection = factory.newConnection();
然后创建线程T1用来发送消息:
//发送消息线程
Thread t1 = new Thread(new Runnable() {
public void run() {
//创建一个频道
Channel channel = null;
try {
channel = connection.createChannel();
//声明要关注的频道
channel.exchangeDeclare("logs", "fanout");
//channel.queueDeclare(QUEUE_NAME, false, false, false, null);
} catch (Exception e) {
e.printStackTrace();
}
while(true) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入消息");
String message = scan.nextLine();
//发送消息到队列中
try {
channel.basicPublish("logs", QUEUE_NAME, null, message.getBytes());
//channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("B发送消息:" + message);
}
}
});
创建T2用来监听接收消息:
//接收消息线程
Thread t2 = new Thread(new Runnable() {
public void run() {
Channel channel = null;
try {
channel = connection.createChannel();
//声明要关注的频道
channel.exchangeDeclare("logs", "fanout");
//channel.queueDeclare(QUEUE_NAME,false,false,false,null);
channel.queueBind(QUEUE_NAME, "logs", "");
//创建消费者 ---- 得到消息后会自动触发
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(
String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body
) throws IOException {
//body为消息体
String message = new String(body, "UTF-8");
System.out.println("B接收消息:" + message);
}
};
//消息消费完成确认
channel.basicConsume(QUEUE_NAME, true, consumer);
} catch (Exception e) {
e.printStackTrace();
}
}
});
最后别忘了启动两个线程:
t1.start();
t2.start();
然后我们在创建一个一模一样的类B
public class B {
private final static String QUEUE_NAME = "test";
public static void main(String[] args) throws Exception{
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置RabbitMQ地址
factory.setHost("localhost");//连接地址
factory.setUsername("guest");//用户名
factory.setPassword("guest");//密码
factory.setPort(5672);//端口号
//创建一个新的连接
final Connection connection = factory.newConnection();
//发送消息线程
Thread t1 = new Thread(new Runnable() {
public void run() {
//创建一个频道
Channel channel = null;
try {
channel = connection.createChannel();
//声明要关注的频道
channel.exchangeDeclare("logs", "fanout");
//channel.queueDeclare(QUEUE_NAME, false, false, false, null);
} catch (Exception e) {
e.printStackTrace();
}
while(true) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入消息");
String message = scan.nextLine();
//发送消息到队列中
try {
channel.basicPublish("logs", QUEUE_NAME, null, message.getBytes());
//channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("B发送消息:" + message);
}
}
});
//接收消息线程
Thread t2 = new Thread(new Runnable() {
public void run() {
Channel channel = null;
try {
channel = connection.createChannel();
//声明要关注的频道
channel.exchangeDeclare("logs", "fanout");
//channel.queueDeclare(QUEUE_NAME,false,false,false,null);
channel.queueBind(QUEUE_NAME, "logs", "");
//创建消费者 ---- 得到消息后会自动触发
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(
String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body
) throws IOException {
//body为消息体
String message = new String(body, "UTF-8");
System.out.println("B接收消息:" + message);
}
};
//消息消费完成确认
channel.basicConsume(QUEUE_NAME, true, consumer);
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}
然后分别运行两个类:
最后由于本文的demo需要持续监听 , 所以未做关闭连接
如果大家在实际中使用一定记得要关闭连接,不然小心你的内存
}finally {
try {
if (channel != null) {
channel.close();
}
if (connection != null) {
connection.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
好了 , 这样一个简单的一对一聊天功能就完成了
我们也可以用 -- 发布订阅模式 实现多人在线聊天 , 在这里我就不演示了,有兴趣的小伙伴可以自己做一下
好了,本篇文章就到这了