按照个人理解,整个消息队列的使用过程,大致分为三个模块:
消息生产者:发送消息至消息中间件
// 队列名称
final String QUEUE_NAME = "rabbitMQ_test";
/**
* connection是socket连接的抽象,并且为我们管理协议版本协商(protocol version negotiation),认证(authentication )等等事情。
*/
ConnectionFactory factory = new ConnectionFactory();
// 主机IP
factory.setHost("127.0.0.1");
// 端口号,默认5672
factory.setPort(5672);
// 用户名
factory.setUsername("user");
// 密码
factory.setPassword("password");
// 设置虚拟主机(相当于数据库中的库)
factory.setVirtualHost("虚拟主机111");
Connection connection = factory.newConnection();
Channel channe = connection.createChannel();
/**
* 创建一个channel,绝大部分API方法需要通过调用它来完成,
* 发送之前,我们必须声明消息要发往哪个队列,然后我们可以向队列发一条消息
*/
channe.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "虫洞空间研发团队测试消息发送带事务...";
try {
// 开启事务
channe.txSelect();
// 往队列中发出一条消息,使用rabbitmq默认交换机
channe.basicPublish("", QUEUE_NAME, null, message.getBytes());
//int a=1/0;
System.out.println("发送消息【" + message + "】");
// 提交事务
channe.txCommit();
} catch (Exception e) {
e.printStackTrace();
System.err.println("发送消息出现异常");
// 事务回滚
if(channe != null){
channe.txRollback();
}
} finally {
channe.close();
connection.close();
}
整个消息生产过程大致分为四步
1.获取链接
根据主机IP,端口,虚拟主机,以及用户名和密码获取对应的链接
2.根据链接创建通道
3.声明队列
4.消息生产
消息中间件:消息存储和转发的中转站
消息消费者:从消息中间件获取消息进行消费
// 队列名称
final String QUEUE_NAME = "rabbitMQ_test";
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("user");
factory.setPassword("password");
factory.setVirtualHost("虚拟主机111");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println("启动中间件");
Consumer consumer = new DefaultConsumer(channel) {
@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 + "】");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);