spring提供了对JMS的支持,需要添加spring支持jms的包:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.0</version>
</dependency>
applicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.ken">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="jmsFactory" class="org.apache.activemq.jms.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://192.168.25.128:61616</value>
</property>
</bean>
</property>
<property name="maxConnections" value="100"/>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory"/>
<property name="defaultDestination" ref="destination"/>
<property name="messageConverter">
<bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
</property>
</bean>
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="spring-queue"/>
</bean>
</beans>
队列生产者:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
@Service
public class QueueSender {
@Autowired
private JmsTemplate jmsTemplate;
public static void main(String[] args) throws JMSException, InterruptedException {
//jmsTemplate帮我们创建好了session,不要一步一步的去创建,又去关闭。
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
QueueSender queueSender = (QueueSender) ac.getBean("queueSender");
queueSender.jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage msg = session.createTextMessage("spring msg==");
return msg;
}
});
}
}
队列消费者:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import javax.jms.JMSException;
@Service
public class QueueReceiver {
@Autowired
private JmsTemplate jmsTemplate;
public static void main(String[] args) throws JMSException {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
QueueReceiver queueReceiver = (QueueReceiver) ac.getBean("queueReceiver");
String msg = (String) queueReceiver.jmsTemplate.receiveAndConvert();
System.out.println("msg==" + msg);
}
}
如果topic的话,首先需要修改spring的配置
先添加topic的配置,当然,需要修改jmsTemplate配置里面的defaultDestination,如果不想修改这个配置,那么直接把Destination注入程序,在程序里面选择发送的Destination也可以:
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg index="0" value="spring-topic"/>
</bean>
其他的客户端发送和接收跟队列基本一样。
topic sender
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
@Service
public class SpringTopicSender {
@Autowired
private JmsTemplate jmsTemplate;
public static void main(String[] args) throws JMSException, InterruptedException {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
SpringTopicSender springTopicSender = (SpringTopicSender) ac.getBean("springTopicSender");
springTopicSender.jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage msg = session.createTextMessage("spring topic msg==");
return msg;
}
});
}
}
topic receiver
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import javax.jms.JMSException;
@Service
public class SpringTopicReceiver {
@Autowired
private JmsTemplate jmsTemplate;
public static void main(String[] args) throws JMSException {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
SpringTopicReceiver springTopicReceiver = (SpringTopicReceiver) ac.getBean("springTopicReceiver");
String msg = (String) springTopicReceiver.jmsTemplate.receiveAndConvert();
System.out.println("msg==" + msg);
}
}
通过运行发现,这种情况下,是非持久化的模式。
如果想要在spring中配置消费者的话,就不需要再启动接收的客户端了,配置如下:
在容器启动的时候,就会加载jmsContainer,也就加载了messageListener,也就是注册了监听器。
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 txtMsg = (TextMessage) message;
try {
System.out.println("receive txt msg==" + txtMsg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
这样一来,只要运行生产者,消费者就自动了接收消息了。