Spring高版本已经支持RabbitMQ,在org.springframework.amqp包里并对进行了封装,下面使用这个包实现一个简单的RabbitMQ消息发送和接收。
首先是初始化连接,并声明队列,交换机及绑定关系
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
public class InitConnection {
private CachingConnectionFactory factory;
private RabbitAdmin rabbitmgAdmin;
public InitConnection(){
//初始化连接 默认本地guset用户登录
factory = new CachingConnectionFactory("localhost");
ExecutorService executor = Executors.newFixedThreadPool(20);
factory.setExecutor(executor);
//
rabbitmgAdmin = new RabbitAdmin(factory);
//声明队列
Queue queue = new Queue(HOST_PARAMETER.QUEUE_NAME);
rabbitmgAdmin.declareQueue(queue);
//声明交换机
DirectExchange directExchange = new DirectExchange(HOST_PARAMETER.DINECT_EXCHANGE_NAME);
rabbitmgAdmin.declareExchange(directExchange);
//绑定
rabbitmgAdmin.declareBinding
(BindingBuilder.bind(queue).to(directExchange).with(""));
}
public RabbitAdmin getRabbitAdmin(){
return rabbitmgAdmin;
}
public ConnectionFactory getFactory(){
return factory;
}
}
然后是定义一个生产者,即发送消息的类
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.SimpleMessageConverter;
public class SpringAMQPSender {
public static void main(String[] args) {
//初始化
InitConnection con = new InitConnection();
//消息发送模板
RabbitTemplate rabbitTemplate = new RabbitTemplate(con.getFactory());
rabbitTemplate.setMessageConverter(new SimpleMessageConverter());
//发送消息
rabbitTemplate.convertAndSend(HOST_PARAMETER.DINECT_EXCHANGE_NAME,
"",HOST_PARAMETER.MESSAGE);
System.out.println("i send a message!");
}
}
接下来定义一个消费者,需要实现一个监听器MessageListener,重写onMessage方法,参数是接收到的消息
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
public class MessageReceiver implements MessageListener{
@Override
public void onMessage(Message message) {
try {
Thread.sleep(2000);
System.out.println(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后定义一个监听容器,开启容器后,实时监听队列,当收到消息后就会自动调用监听器MessageReceiver类的onMessage方法进行处理。
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.amqp.support.converter.SimpleMessageConverter;
public class MessageReceiverListener {
private static SimpleMessageListenerContainer container;
public static void main(String[] args){
InitConnection con = new InitConnection();
//创建消息监听器容器
container = new SimpleMessageListenerContainer(con.getFactory());
//监听适配器
MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(new MessageReceiver());
//设置监听
container.setMessageListener(messageListenerAdapter);
//设置消息格式
container.setMessageConverter(new SimpleMessageConverter());
//设置监听的队列
container.setQueueNames(HOST_PARAMETER.QUEUE_NAME);
container.setPrefetchCount(1);
container.setRabbitAdmin(con.getRabbitAdmin());
container.setAcknowledgeMode(AcknowledgeMode.AUTO);
container.setAutoDeclare(true);
//开启监听
container.start();
}
}
参数类
public class HOST_PARAMETER {
public static final String LOCAL_HOST = "localhost";
public static final Integer LOCAL_PORT = 5672;
public static final String LOCAL_USER_NAME = "guest";
public static final String LOCAL_PASSWORD = "guest";
public static final String FANOUT_EXCHANGE_NAME = "fanout_";
public static final String DINECT_EXCHANGE_NAME = "directExchange";
public static final String QUEUE_NAME = "Hello";
public static final String MESSAGE = "Hello,world!";
}
这样便实现了一个简单的收发程序。