什么是ActiveMQ:
Apache ActiveMQ是最流行、功能最强大的开源消息传递和集成服务器。(消息队列服务)
Apache ActiveMQ速度快、支持多语言客户端和协议。
MQ特点:
MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。
使用场景:
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
JMS
JMS是JAVA EE的标准;
这种规范(标准)指出:
消息的发送应该是异步的、非阻塞的。
这种规范能够使系统实现松耦合,提高系统的扩展性和灵活性。
JMS API
1.ConnectionFactory
创建ConnectionFactory工厂
ConnectionFactory factory =new ActiveMQConnectionFactory(user,password,“tcp://localhost:61616”);
2.Connection
创建Connection
Connection connection =factory.createConnection();
connection.start();
3.Session
Session session=connection.createSession(false,Session.acknowledge);
4.Desination
两种:主要有topic 消息(1 对多), queue 消息(1对1).
Queue queue=session.createQueue(“队列名”);
Topic topic=session.createTopic(“主题名”);
5.生产者和消费者
MessageProducer producer=session.createProducer(queue/topic);
MessageConsumer consumer=session.createConsumer(queue/topic);
6.创建Message
TextMessage、MapMessage、ObjectMessage、BytesMessage、StreamMessage
7.创建监听器
MessageListener
整合Spring
1.配置ActiveMQConnectionFactory
<bean id="mqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="userName" value="" />
<property name="password" value="" />
<property name="brokerURL" value="tcp://localhost:61616" />
<property name="useAsyncSend" value="true" />//使用异步发送
</bean>
2.池化ActiveMQConnectionFactory
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<property name="connectionFactory" ref="mqConnectionFactory" />
<property name="maxConnections" value="10" />
</bean>
3.缓冲CachingConnectionFactory
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg name="targetConnectionFactory" ref="pooledConnectionFactory" />
<property name="sessionCacheSize" value="10" />
</bean>
4.JmsTemplete
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="explicitQosEnabled" value="true">
<property name="deliveryMode" value="2" />
<property name="sessionAcknowledgeMode" value="1" />
</bean>
Spring消费者
1.配置ActiveMQConnectionFactory
<bean id="mqConnectionFactory" class="org.apche.activemq.ActiveMQConnectionFactory">
<property name="userName" value="" />
<property name="password" value="" />
<property name="brokerURL" value="tcp://localhost:61616" />
<property name="useAsyncSend" value="true" />
</bean>
- 池化ActiveMQConnectionFactory
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<property name="connectionFactory" ref="mqConnectionFactory" />
<property name="maxConnections" value="10" />
</bean>
- CachingConnectionFactory
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg name="targetConnectionFactory" ref="pooledConnectionFactory" />
<property name="sessionCacheSize" value="10" />
</bean>
4.配置监听器
监听器要实现MessageListener
public class EmailListener implements MessageListener {
@Autowired
EmailService emailService;
@Override
public void onMessage(Message message) {
if (message != null && message instanceof TextMessage) {
TextMessage msg = (TextMessage)message;
String emailMsg;
try {
emailMsg = msg.getText().toString();
System.out.println("接收到消息队列的消息:" + emailMsg);
// 将json转换为email对象
Email email = JSONObject.parseObject(emailMsg, Email.class);
System.out.println("开始发送邮件");
emailService.sendEmail(email);
System.out.println("结束发送邮件");
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
5.消息的目的地
<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg name="name" value="email" />
</bean>
6.监听器的容器
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="messageListener" ref="emailListener" />
<property name="destination" ref="queue" />
</bean>