用maven项目演示,添加dependency
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>4.2.1</version> </dependency>
默认的rabbitmq用户名和密码是guest,但是这个账号有限制,默认只能通过本地网络访问,远程网络访问受限。所以添加一个用户。
lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl list_users Listing users guest [administrator] lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl add_user root root Creating user "root" lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl set_permissions -p / root ".*" ".*" ".*" Setting permissions for user "root" in vhost "/" lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl list_users Listing users guest [administrator] root [] lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl set_user_tags root administrator Setting tags for user "root" to [administrator] lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl list_users Listing users guest [administrator] root [administrator] lmy@Y480:/opt/rabbitmq/sbin$
add_user 是增加用户
set_permissions 为root用户设置所有权限
set_user_tags设置root用户为管理员角色
下面编写一个例子,首先生产者发送一条消息“hello world”至 RabbitMQ中,之后由消费者消费。
下面是生产这客户端代码。
package com.lmy.demo.rabbitmq.demo; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.MessageProperties; public class RabbitProducer { private static final String EXCHANGE_NAME="exchange_demo"; private static final String ROUTING_KEY="routingkey_demo"; private static final String QUEUE_NAME="queue_demo"; private static final String IP_ADDRESS="127.0.0.1"; private static final int PORT=5672; //rabbitMQ 服务端默认端口号为5672 public static void main(String[] args) throws Exception { ConnectionFactory factory=new ConnectionFactory(); factory.setHost(IP_ADDRESS); factory.setPort(PORT); factory.setUsername("root"); factory.setPassword("root"); Connection connection=factory.newConnection();//创建连接 Channel channel=connection.createChannel();//创建信道 //创建一个type="direct"、持久化的、非自动删除的交换器 channel.exchangeDeclare(EXCHANGE_NAME,"direct",true,false,null); //创建一个持久化、非排他的、非自动删除的队列 channel.queueDeclare(QUEUE_NAME, true, false,false,null); //将交换器与队列通过路由键绑定 channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY); //发送一条持久化的消息;hello world String message="Hello world"; channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes()); // //关闭资源 // channel.close(); // connection.close(); } }
下面是消费者客户端代码
package com.lmy.demo.rabbitmq.demo; import java.io.IOException; import java.util.concurrent.TimeUnit; import com.rabbitmq.client.Address; 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; import com.rabbitmq.client.AMQP.BasicProperties; public class RabbitConsumer { private static final String QUEUE_NAME="queue_demo"; private static final String IP_ADDRESS="127.0.0.1"; private static final int PORT=5672; public static void main(String[] args) throws Exception { Address[] addresses=new Address[]{ new Address(IP_ADDRESS,PORT) }; ConnectionFactory factory=new ConnectionFactory(); factory.setUsername("root"); factory.setPassword("root"); //这里的连接方式与生产者的demo略有不同,注意辨别区别 Connection connection=factory.newConnection(addresses);//创建连接 final Channel channel=connection.createChannel();//创建信道 channel.basicQos(64);//设置客户端最多接收未被ack的消息的个数 Consumer consumer=new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException { System.out.println("recv message:"+new String(body)); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } channel.basicAck(envelope.getDeliveryTag(),false); } }; channel.basicConsume(QUEUE_NAME,consumer); channel.basicConsume(QUEUE_NAME, false, "myConsumerTag",new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException { String routingKey=envelope.getRoutingKey(); String contentType=properties.getContentType(); } }); //等待回调函数执行完毕之后,关闭资源 TimeUnit.SECONDS.sleep(5); channel.close(); connection.close(); } }
先运行生产者客户端,再运行消费者客户端。可以看到下面的效果。
在网页管理页面可以看到。