Apache ActiveMQ簡(jiǎn)介: MQ是Apache出品的一個(gè)基于JMS消息處理機(jī)制的服務(wù),可以很容易的潛入到Spring中,作為項(xiàng)目消息處理服務(wù)。
Apache ActiveMQ用途: jms有兩種消息機(jī)制一種是消息隊(duì)列,一種是消息訂閱,簡(jiǎn)單來(lái)說(shuō)就是一對(duì)一,和一對(duì)多。
一對(duì)一可以看做 一組消息對(duì)應(yīng)一個(gè) 或 多個(gè)消息獲取服務(wù),其中每一個(gè)單獨(dú)的消息體都只會(huì)被一個(gè)消息獲取服務(wù)獲取。
一對(duì)多可以看做 一組消息對(duì)應(yīng)一個(gè) 或 多個(gè)接收服務(wù),其中每一個(gè)單獨(dú)的消息體發(fā)出之后都會(huì)被所有的接收服務(wù)收到一次。
根據(jù)以上兩種模式我們可以在 發(fā)送短信的時(shí)候使用 消息隊(duì)列模式。也可以在分布式的時(shí)候使用消息隊(duì)列模式
消息訂閱模式用的不是很多但是,在分布式中也可以應(yīng)用同時(shí)可以結(jié)合WebService進(jìn)行使用。例如一個(gè)新聞需要發(fā)給多個(gè)系統(tǒng)內(nèi)的單獨(dú)服務(wù)。
只要深刻理解了他的處理機(jī)制在很多情況下都可以應(yīng)用,如果實(shí)在不喜歡這種方式也可以遵照java JMS的API用線(xiàn)程自己模擬消息隊(duì)列機(jī)制。
我個(gè)人認(rèn)為區(qū)別不是很大。更何況很多時(shí)候MQ的很多功能我們有沒(méi)有用到,用這么個(gè)大家伙就是為了圖省事。
這里備注一下:按原有設(shè)定在創(chuàng)建連接的時(shí)候MQ是不發(fā)送消息的。
下面我說(shuō)以下使用方式:
本人目前只會(huì)JAVA
需要的包為
activemq-all-5.2.0.jar
log4j-1.2.14.jar
spring-beans-2.5.5.jar
spring-context-2.5.5.jar
spring-jms-2.5.5.jar
spring-core-2.5.5.jar
這些應(yīng)該就足夠了
我做測(cè)試的時(shí)候用的包為
activemq-all-5.2.0.jar
commons-pool-1.4.jar
log4j-1.2.14.jar
spring-beans-2.5.5.jar
spring-context-2.5.5.jar
spring-core-2.5.5.jar
spring-jms-2.5.5.jar
spring-tx-2.5.5.jar
spring-web-2.5.5.jar
spring-webmvc-2.5.5.jar
xbean-spring-3.4.jar
msbase.jar
mssqlserver.jar
msutil.jar
mysql-connector-java-5.0.4-bin.jar
mysql.jar
基本配置
下載 Apache ActiveMQ 不知道的googlean
安裝服務(wù)的文件在
apache-activemq-5.5.0\bin\win32 目錄下面Linux版也一樣大同小異 運(yùn)行.sh文件就好,如果出現(xiàn)問(wèn)題請(qǐng)打開(kāi)運(yùn)行文件查看里面參數(shù)
activemq.bat直接運(yùn)行啟動(dòng)服務(wù)
InstallService.bat安裝成windos服務(wù)
UninstallService.bat卸載windos服務(wù)
安裝成功后
在運(yùn)行中 cmd
netstat -an|find “61616” 查詢(xún)端口是否已經(jīng)打開(kāi)
D:\apache-activemq-5.5.0\conf\activemq.xml 本文件為服務(wù)配置文件
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>
</transportConnectors>
這一項(xiàng)為端口設(shè)置
默認(rèn)為 “61616”
目前以windos為例
把spring和項(xiàng)目聯(lián)系起來(lái)
第一步為web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 配置Spring-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/NewFileMQ.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
先說(shuō) 一下消息隊(duì)列(也就是一對(duì)一)
NewFileMQ.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"
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-2.0.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core.xsd">
<!-- 配置JMS鏈接模版 -->
<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61618"/>
</bean>
<!-- 配置JMS模版 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="pubSubDomain" value="false" />
<property name="explicitQosEnabled" value="true" /> <!-- deliveryMode, priority, timeToLive 的開(kāi)關(guān),要生效,必須配置為true,默認(rèn)false-->
<property name="deliveryMode" value="1" /> <!-- 發(fā)送模式 DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久-->
</bean>
<!-- 發(fā)送消息的目的地(一個(gè)隊(duì)列) -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<!-- 設(shè)置消息隊(duì)列的名字 -->
<constructor-arg index="0" value="HelloJmsQueue"/>
</bean>
<bean id="sender" class="message.Sender">
<property name="jmsTemplate" ref="jmsTemplate"></property>
</bean>
<!--消息獲取類(lèi)-->
<bean id="receive" class="message.Receiver"></bean>
<!--給消息獲取類(lèi)加個(gè)監(jiān)聽(tīng)讓他能自動(dòng)獲取消息-->
<bean id="listenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="destination" ref="destination"></property>
<property name="messageListener" ref="receive"></property>
</bean>
</beans>
發(fā)送消息的類(lèi)
package message;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
public class Sender {
private JmsTemplate jmsTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void send(final String text){
System.out.println("---Send:"+text);
jmsTemplate.send(new MessageCreator(){
public Message createMessage(Session arg0) throws JMSException {
// TODO Auto-generated method stub
return arg0.createTextMessage(text);
}
});
}
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
JmsTemplate template = (JmsTemplate) ctx.getBean("jmsTemplate");
Destination destination = (Destination) ctx.getBean("destination");
for(int i=0;i<10;i++){
final String dd = i+"";
//jmsTemplate.convertAndSend(destination,"發(fā)送消息: ActiveMQ Text Message!"+dd);
template.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("發(fā)送消息: ActiveMQ Text Message!"+dd);
}
});
}
System.out.println("成功發(fā)送了一條JMS消息");
}
}
接收消息類(lèi)
package message;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;
public class Receiver implements MessageListener {
//接聽(tīng)接收
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage text = (TextMessage) message;
try {
System.out.println("Receive:第四個(gè)接收者" + text.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//手動(dòng)接收
public static void main(String[] args) throws JMSException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
JmsTemplate template = (JmsTemplate) ctx.getBean("jmsTemplate");
Destination destination = (Destination) ctx.getBean("destination");
while (true) {
TextMessage txtmsg = (TextMessage) template.receive(destination);
if (null != txtmsg)
System.out.println("收到消息內(nèi)容為: " + txtmsg.getText());
else
break;
}
}
}
發(fā)布者模式
其實(shí)兩種模式其它設(shè)置基本相同
唯一不用的就是 Spring配置文件中把一下這段替換一下就可以了
<!-- 發(fā)送消息的目的地(一個(gè)隊(duì)列) -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
<!-- 設(shè)置消息隊(duì)列的名字 -->
<constructor-arg index="0" value="HelloJmsTopic"/>
</bean>
http://hi.baidu.com/wu_chao/blog/item/1d9aa2772e663107b051b9cc.html