rabbitmq java代码_RabbitMQ java 原生代码

rabbitMQ 的交换器有四种类型:direct、fanout、topic、headers

75af1ec9b070d475c902a82b1fafb3f7.png

以下是具体的代码:

direct:路由键只能全部匹配,才能进入到指定队列中。其他使用

direct生产者

importcom.rabbitmq.client.BuiltinExchangeType;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importcom.rabbitmq.client.ConnectionFactory;importjava.util.Arrays;importjava.util.List;/*** direct 生产者*/

public classDirectPro {public final static String EXCHANGE_NAME = "direct_exchange";//direct交换器名称

public final static Integer SEND_NUM = 10;//发送消息次数

public static void main(String[] args) throwsException {//创建连接工厂,连接RabbitMQ

ConnectionFactory connectionFactory = newConnectionFactory();

connectionFactory.setHost("IP");//端口号、用户名、密码可以使用默认的

connectionFactory.setUsername("用户名");

connectionFactory.setPassword("密码");

connectionFactory.setPort(5672);//创建连接

Connection connection =connectionFactory.newConnection();//创建信道

Channel channel =connection.createChannel();//在信道中设置交换器

channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);//交换器和队列绑定放到消费者进行//自定义路由键

List routeKey = Arrays.asList("key1","key2","key3");//发送消息

for (int i=0;i

String key= routeKey.get(i%routeKey.size());//发送的key

String msg = "hello rabbitmq"+i;//发送的消息//消息进行发送

channel.basicPublish(EXCHANGE_NAME,key,null,msg.getBytes());

System.out.println("send:"+key+"==="+msg);

}

channel.close();

connection.close();

}

}

direct消费者

import com.rabbitmq.client.*;importjava.io.IOException;/*** direct 消费者*/

public classDirectCon {public final static String EXCHANGE_NAME = "direct_exchange";//direct交换器名称

public final static String QUEUE_NAME = "queue_name";public static void main(String[] args) throwsException {//创建连接工厂,连接RabbitMQ

ConnectionFactory connectionFactory = newConnectionFactory();

connectionFactory.setHost("IP");//端口号、用户名、密码可以使用默认的

connectionFactory.setUsername("用户名");

connectionFactory.setPassword("密码");

connectionFactory.setPort(5672);//创建连接

Connection connection =connectionFactory.newConnection();//创建信道

Channel channel =connection.createChannel();//在信道中设置交换器

channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);//声明队列

channel.queueDeclare(QUEUE_NAME,false,false,false,null);//交换器和队列绑定

channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"key1");

System.out.println("waiting message.....");//声明消费者

final Consumer consumer = newDefaultConsumer(channel){

@Overridepublic voidhandleDelivery(String consumerTag, Envelope envelope,

AMQP.BasicProperties properties,byte[] body) throwsIOException {

String message= new String(body,"utf-8");

System.out.println("Received:"+envelope.getRoutingKey()+"========"+message);

}

};//消费者在指定的对队列上消费

channel.basicConsume(QUEUE_NAME,true,consumer);

}

}

3:执行结果:首先启动消费者,再启动发送者

生产者

8f29e114b99df29ef1faa1e32b11be2e.png

消费者

9976af224942ecd1e1c70db2b90c6751.png

fanout:消息能发送到所有队列上,跟路由键没有任何关系。

fanout生产者:重新定义一个交换器,只需将交换器设置成fanout就可以

//在信道中设置交换器

channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

fanout消费者:重新定义一个交换器和队列,将交换器设置成fanout,绑定的key可以随便写。

//在信道中设置交换器

channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

//声明队列

channel.queueDeclare(QUEUE_NAME,false,false,false,null);

//交换器和队列绑定

channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"abc");

结果

生产者都一样

消费者

4bea7ca666c80919f207ef51d688b9a2.png

topic:按照*、#的匹配规则,进入到对应的队列

topic生产者:只需将交换器设置成topic,路由键的设置必须是用点. 进行分割("key1.k","key2.k","key3.k")

topic消费者:重新定义一个交换器和队列

//交换器和队列绑定

channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"key2.*");

这样子就只能匹配key2.开头的

结果:生产者都一样

消费者

c9f1230b1fc097cda187203e556043c2.png

headers:是根据头部的消息映射到队列的。特殊的值x-match:all(全部匹配)、any(任何一个)。

生产者

//在信道中设置交换器

channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.HEADERS);//设置要发送headers值

Map heardersMap = new HashMap();

heardersMap.put("api", "login");

heardersMap.put("version", 1.0);

heardersMap.put("radom", UUID.randomUUID().toString());//设置消息的属性

AMQP.BasicProperties pro = newAMQP.BasicProperties.Builder()

.headers(heardersMap)

.build();//发送消息

for (int i=0;i

String msg= "hello rabbitmq"+i;//发送的消息//消息进行发送

channel.basicPublish(EXCHANGE_NAME,"",pro,msg.getBytes());

System.out.println("send:"+msg);

}

消费者

//在信道中设置交换器

channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.HEADERS);

Map arguments = new HashMap();

arguments.put("x-match", "any");

arguments.put("api", "login");

arguments.put("version", 1.0);

arguments.put("dataType", "json");//交换器和队列绑定

String queueName =channel.queueDeclare().getQueue();

channel.queueBind(queueName,EXCHANGE_NAME,"",arguments);

System.out.println("waiting message.....");//声明消费者

final Consumer consumer = newDefaultConsumer(channel){

@Overridepublic voidhandleDelivery(String consumerTag, Envelope envelope,

AMQP.BasicProperties properties,byte[] body) throwsIOException {

String message= new String(body,"utf-8");

System.out.println(" [HeaderRecv] Received '" +properties.getHeaders()+ "':'" + message + "'");

}

};

结果:发送者一样消费者

44205ebfba7400a07683174e7c90c2b8.png

以上就是Java对原生的RabbitMQ基本使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中获取RabbitMQ的消息有两种方式:Pull(拉取)和Push(推送)。 Pull方式是由消费者主动向RabbitMQ服务器请求获取消息。在RabbitMQ中,Pull方式并不是RabbitMQ原生方式,而是通过轮询方式模拟实现。具体步骤如下: 1. 创建RabbitMQ连接工厂,并配置连接相关参数。 2. 通过连接工厂创建连接,并获取连接通道。 3. 创建消费者,并通过通道指定消费者的队列。 4. 使用BasicConsume方法设置消费者如何处理接收到的消息。 5. 在消费者类中编写处理消息的逻辑。 代码示例: ```java ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); factory.setPort(5672); factory.setUsername("guest"); factory.setPassword("guest"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); String queueName = "your_queue_name"; channel.queueDeclare(queueName, false, false, false, null); 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("Received message: " + message); } }; channel.basicConsume(queueName, true, consumer); ``` 通过以上代码,我们创建了一个名为"your_queue_name"的队列,并在消费者中使用BasicConsume方法来设置如何处理接收到的消息。每次调用BasicConsume方法后,消费者会不断地从队列中拉取消息进行处理。 需要注意的是,Java的Pull方式实际上是模拟实现的,并不是RabbitMQ原生方式。在生产环境中,通常更推荐使用Push方式来获取RabbitMQ的消息,即让RabbitMQ服务器主动将消息推送给消费者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值