点对点消息传送模型允许JMS客户端通过队列这个虚拟通道来同步和异步发送、接收消息。
在点对点消息传送模型中,消息生产者称为发送者,消息消费者称为接收者
消费者是基于拉取(pull)或基于轮询(polling)来从队列中请求消息,队列并不会自动地将消息推送到客户端
一个消息有且只能被一个消费者接收,即使有多个消费者同时监听了队列
点对点模型支持负载均衡,允许多个消费者监听同一个队列,并以此来分配负载
Spring Framework 为JMS提供了内置支持,Spring提供了JMS模板和消息监听容器
JMS实现采用ActiveMQ
定义消息生产者
public interface ProducerService {
/**
* P2P 点对点模式生产者发送消息.
*
* @param destination
* @param message
*/
public void sendMessage(Destination destination, String message);
}
@Component("producerService")
public class ProducerServiceImpl implements ProducerService {
//Spring JMS Template
@Resource(name="jmsTemplate")
private JmsTemplate jmsTemplate;
/**
* P2P 点对点模式生产者发送消息.
*
* @param destination
* @param message
*/
@Override
public void sendMessage(Destination destination, final String message) {
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
}
设置一个定时任务充当消息生产者,每隔两秒发送一条消息,消息内容为当前时间
@Component(value = "poll")
public class Poll {
// ActiveMQ生产者
@Resource(name = "producerService")
private ProducerService producerService;
// ActiveMQ 预先预约运单号队列目的地
@Resource(name = "queueDestination")
private Destination destination;
@Scheduled(cron="0/2 * * * * ?")
public void getTradeIncrement() {
producerService.sendMessage(destination, "当前时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
定义一个消费者监听队列:
public class ConsumerMessageListener implements MessageListener{
@Override