該文章基於《Spring源碼深度解析》撰寫,感謝郝佳老師的奉獻
ActiveMQ Demo
JMS作爲JavaEE的規範之一,它的實現產品ActiveMQ一直佔有極高的市場份額,下面通過一個小Demo來展示ActiveMQ的用法:
首先需要下載ActiveMQ,然後進入bin目錄,選擇32位系統或者64位系統下的activemq.bat進行運行,然後將activeMQ目錄下的lib中的jar文件導入到我們的項目中,接下來我們開始編寫發送端和接收端,該工程的架構如下
:
/*Reciver.java*/
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class Reciver {
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
Connection connection = connectionFactory.createConnection();
connection.start();
final Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("my-queue");
MessageConsumer consumer = session.createConsumer(destination);
int i = 0;
while(i < 3){
i++;
TextMessage message = (TextMessage) consumer.receive();
session.commit();
System.out.println("收到消息"+message.getText());
}
session.close();
connection.close();
}
}
/*Sender.java*/
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class Sender {
public static void main(String[] args) throws JMSException, InterruptedException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("my-queue");
MessageProducer producer = session.createProducer(destination);
for(int i = 0; i < 3; i++){
TextMessage message = session.createTextMessage("大家好這是個測試");
Thread.sleep(1000);
producer.send(message);
}
session.commit();
session.close();
connection.close();
// System.out.println("good");
}
}
先運行Sender的函數,在運行Receiver,就可以得到如下結果:
Spring整合ActiveMQ
項目架構如下:
其中各個文件的代碼如下
<!--applicationContext-ActiveMQ.xml-->
<?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-4.1.xsd">
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://localhost:61616</value>
</property>
</bean>
<bean id="jmstemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref bean="connectionFactory"/>
</property>
</bean>
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0">
<value>HelloWorldQueue</value>
</constructor-arg>
</bean>
</beans>
<!--web.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
/*HelloWorldSender.java*/
package Sender;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import javax.jms.Destination;
import java.io.File;
public class HelloWorldSender {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext-ActiveMQ.xml"});
File file = new File("/");
System.out.println(file.getAbsolutePath());
for(String str :context.getBeanDefinitionNames()){
System.out.println(str);
}
JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmstemplate");
Destination destination = (Destination) context.getBean("destination");
jmsTemplate.send(destination, session -> session.createTextMessage("大家好這是個測試"));
}
}
/*HelloWorldReciver.java*/
package Reciver;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;
public class HelloWorldReciver {
public static void main(String[] args) throws JMSException {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-ActiveMQ.xml");
JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmstemplate");
Destination destination = (Destination) context.getBean("destination");
TextMessage msg = (TextMessage)jmsTemplate.receive(destination);
System.out.println("recived msg is:"+msg.getText());
}
}
運行規則同單獨使用activeMQ相同,所以此處不再贅述。
上面方法的問題在於jmsTemplate.receive(destination);只能接受一次消息,如果未接收到消息,則會一直等到。通過消息監聽器可以更好的處理這個問題,下面爲工程的架構
下面給出關於源代碼
/*MyMessageListener.java*/
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class MyMessageListener implements MessageListener{
@Override
public void onMessage(Message message) {
TextMessage msg = (TextMessage)message;
try {
System.out.println(msg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
/*HelloWorldSender.java*/
package Sender;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import javax.jms.Destination;
import java.io.File;
public class HelloWorldSender {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext-ActiveMQ.xml"});
JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmstemplate");
Destination destination = (Destination) context.getBean("destination");
jmsTemplate.send(destination, session -> session.createTextMessage("大家好這是個測試"));
}
}
<!--applicationContext-ActiveMQ.xml-->
<?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-4.1.xsd">
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://localhost:61616</value>
</property>
</bean>
<bean id="jmstemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref bean="connectionFactory"/>
</property>
</bean>
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0">
<value>HelloWorldQueue</value>
</constructor-arg>
</bean>
<bean id="myTextListener" class="Listener.MyMessageListener"/>
<bean id="javaConsumer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="destination"/>
<property name="messageListener" ref="myTextListener"/>
</bean>
</beans>
運行上面的代碼,將會出現下面的結果