Message queue - rabbitmq learning

The difference between message queue and rpc is that message queue does not return data, rpc can, but because message queue does not need to return data, it is very convenient to use message queue when you do not want the speed of the sender to be controlled by the receiver and do not need to return data.

Enter the text:

Since rabbitmq is written based on erlang language, erlang needs to be installed. Enter the erlang official website: http://www.erlang.org/downloads to download. The installation method is very simple, all the way is ok by default.

Then install rabbitmq, the official website address: http://www.rabbitmq.com/install-windows.html .

Download as needed.

One point to pay special attention to when installing rabbitmq is: Be sure to change the installation address of rabbitmq, because its default installation address is C:\Program Files, but the pit point is that rabbitmq itself does not parse paths with spaces. Just do it.

After installation, open cmd, cd to the sbin folder in the installation path and enter the command: rabbitmq-plugins enable rabbitmq_management to install the plugin, so that you can access localhost:15672 on the page to access rabbitmq.

If you can access it, it means your installation is successful, then how to use it in the code.

The following packages need to be added to the pom file:

<dependency>
			<groupId>com.rabbitmq</groupId>
			<artifactId>amqp-client</artifactId>
			<version>4.1.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.amqp</groupId>
			<artifactId>spring-rabbit</artifactId>
			<version>1.7.5.RELEASE</version>
		</dependency>

The configuration related to rabbitmq needs to be added to applicationContext.xml:

<!--配置connection-factory,指定连接rabbit server参数这里有个坑,rabbitmq的15672是管理界面的访问端口,远程访问端口是5672 -->
	<rabbit:connection-factory id="connectionFactory" host="127.0.0.1" port="5672" username="pan" password="123456" />


	<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
	<rabbit:admin connection-factory="connectionFactory" />


	<!--定义queue -->
	<!-- durable 是否持久化 exclusive 仅创建者可以使用的私有队列,断开后自动删除 auto-delete 当所有消费端连接断开后,是否自动删除队列 -->
	<rabbit:queue name="queueTest" durable="true" auto-delete="false" exclusive="false" />


	<!-- 交换机定义 -->
	<!-- 交换机:一个交换机可以绑定多个队列,一个队列也可以绑定到多个交换机上。 如果没有队列绑定到交换机上,则发送到该交换机上的信息则会丢失。 
		direct模式:消息与一个特定的路由器完全匹配,才会转发 topic模式:按模式匹配 -->
	<rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false">
		<rabbit:bindings>
			<rabbit:binding queue="queueTest" key="queueTestKey"></rabbit:binding>
		</rabbit:bindings>
	</rabbit:direct-exchange>


	<!--定义rabbit template用于数据的接收和发送 -->
	<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="exchangeTest" />

	<!-- 消息接收者 -->
	<bean id="messageReceiver" class="org.pan.rabbitmq.rabbitmq.MessageConsumer"></bean>

	<!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
	<rabbit:listener-container connection-factory="connectionFactory">
		<!-- queues 监听队列,多个用逗号分隔 ref 监听器 -->
		<rabbit:listener queues="queueTest" ref="messageReceiver" />
	</rabbit:listener-container>

The following content needs to be added to the header of the above configuration file:

    xmlns:rabbit="http://www.springframework.org/schema/rabbit"
	
    http://www.springframework.org/schema/rabbit
    http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd

There are two ports to pay attention to here: 15672 is the port for the page to access rabbitmq, and if the code wants to connect to rabbitmq remotely, it is port 5672.

The connection username and password rabbitmq has a default: guest, guest. You can create a user through the 15672 page. As for the method, there are many tutorials on the Internet. Interested friends can find it by themselves.

Then the producer code:

/**
 * @description
 * @auth panmingshuai
 * @time 2018年3月24日下午10:21:18
 * 
 */

@Service
public class MessageProducer {
	private Logger logger = LoggerFactory.getLogger(MessageProducer.class);

	@Resource(name = "amqpTemplate")
	private AmqpTemplate amqpTemplate;

	public void sendMessage(Object message) throws IOException {
		logger.info("to send message:{}", message);
		amqpTemplate.convertAndSend("queueTestKey", message);
	}
}

Consumer code:

/**
 * @description
 * @auth panmingshuai
 * @time 2018年3月24日下午10:23:38
 * 
 */

public class MessageConsumer implements MessageListener {
	private Logger logger = LoggerFactory.getLogger(MessageConsumer.class);

	@Override
	public void onMessage(Message message) {
		logger.info("consumer receive message------->:{}", (User)SerializationUtils.deserialize(message.getBody()));
	}
	
	
}

Because the information on the Internet is all string transmission, I got a wear object. User code is as follows:

/**
 *@description 
 *@auth panmingshuai
 *@time 2018年3月29日下午11:27:30
 * 
 */

public class User implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer age;
	private String name;
	
	public User() {
	}
	public User(Integer age, String name) {
		this.age = age;
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "User [age=" + age + ", name=" + name + "]";
	}
	
}

Finally, the Controller that sends the message

/**
 *@description 
 *@auth panmingshuai
 *@time 2018年3月24日下午10:26:21
 * 
 */
@Controller
@RequestMapping("/rabbit")
public class RabbitController {
	
	@Autowired
	private MessageProducer producer;
	
	@RequestMapping("/msg")
	@ResponseBody
	public String getMsg() throws IOException{
		int a = 100;  
        while (a > 0) {  
        	producer.sendMessage(new User(a, "pan"+a--));  
        	
            try {  
                //让子弹飞一会儿 
                Thread.sleep(1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }
        }
        return "发送完毕";
	}
}

After running, the log effect is as follows:

2018-03-30 00:44:22,913 [qtp1651855867-17] INFO  [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=100, name=pan100]
2018-03-30 00:44:22,931 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO  [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=100, name=pan100]
2018-03-30 00:44:23,925 [qtp1651855867-17] INFO  [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=99, name=pan99]
2018-03-30 00:44:23,933 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO  [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=99, name=pan99]
2018-03-30 00:44:24,926 [qtp1651855867-17] INFO  [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=98, name=pan98]
2018-03-30 00:44:24,931 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO  [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=98, name=pan98]
2018-03-30 00:44:25,926 [qtp1651855867-17] INFO  [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=97, name=pan97]
2018-03-30 00:44:25,929 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO  [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=97, name=pan97]
2018-03-30 00:44:26,927 [qtp1651855867-17] INFO  [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=96, name=pan96]
2018-03-30 00:44:26,929 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO  [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=96, name=pan96]
2018-03-30 00:44:27,927 [qtp1651855867-17] INFO  [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=95, name=pan95]
2018-03-30 00:44:27,929 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO  [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=95, name=pan95]
2018-03-30 00:44:28,927 [qtp1651855867-17] INFO  [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=94, name=pan94]
2018-03-30 00:44:28,931 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO  [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=94, name=pan94]
2018-03-30 00:44:29,928 [qtp1651855867-17] INFO  [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=93, name=pan93]
2018-03-30 00:44:29,932 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO  [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=93, name=pan93]

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325475207&siteId=291194637