mq消息队列

时间:2022-03-13 09:25:22
rabbitmq学习9:使用spring-amqp发送消息及同步接收消息

    通过对spring-amqp看重要类的认识,下面来通过spring-amqp的发送消息及同步接收消息是如何实现的。有兴趣的朋友 可以去spring-amqp官网下载例子。

    先来看看HelloWorldConfiguration类

Java代码  收藏代码
package org.springframework.amqp.helloworld; import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.config.AbstractRabbitConfiguration;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.connection.SingleConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class HelloWorldConfiguration extends AbstractRabbitConfiguration { protected final String helloWorldQueueName = "hello.world.queue"; @Bean
public ConnectionFactory connectionFactory() {
SingleConnectionFactory connectionFactory = new SingleConnectionFactory(
"localhost");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
return connectionFactory;
} @Override
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
// The routing key is set to the name of the queue by the broker for the
// default exchange.
template.setRoutingKey(this.helloWorldQueueName);
// // Where we will synchronously receive messages from
template.setQueue(this.helloWorldQueueName);
return template;
} @Bean
public Queue helloWorldQueue() {
return new Queue(this.helloWorldQueueName);
}
}
此类定义了ConnectionFactory 、RabbitTemplate 、Queue 发送消息的程序如下: Java代码 收藏代码
package org.springframework.amqp.helloworld; import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Producer { public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
AmqpTemplate amqpTemplate = context.getBean(AmqpTemplate.class);
amqpTemplate.convertAndSend("Hello World");
System.out.println("Sent: Hello World");
} }
同步接收消息如下: Java代码 收藏代码
package org.springframework.amqp.helloworld; import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Consumer { public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
AmqpTemplate amqpTemplate = context.getBean(AmqpTemplate.class);
System.out.println("Received: " + amqpTemplate.receiveAndConvert());
} } 这个例子是Exchange类型为DirectExchange. routingkey的名称默认为Queue的名称。 对于 HelloWorldConfiguration类的配置,也可以通过SPRING XML文件来配置。例如 rabbitConfiguration.xml Java代码 收藏代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 创建connectionFactory -->
<bean id="connectionFactory"
class="org.springframework.amqp.rabbit.connection.SingleConnectionFactory">
<constructor-arg value="localhost" />
<property name="username" value="guest" />
<property name="password" value="guest" />
</bean>
<bean id="rabbitAdmin"
class="org.springframework.amqp.rabbit.core.RabbitAdmin">
<constructor-arg ref="connectionFactory" />
</bean>
<bean id="rabbitTemplate"
class="org.springframework.amqp.rabbit.core.RabbitTemplate">
<constructor-arg ref="connectionFactory"></constructor-arg>
<property name="queue" value="hello.world.queue"></property>
<property name="routingKey" value="hello.world.queue"></property>
</bean> <!-- 声明Queue并设定Queue的名称 -->
<bean id="helloWorldQueue"
class="org.springframework.amqp.core.Queue">
<constructor-arg value="hello.world.queue"></constructor-arg>
</bean> </beans>