maven的dependency用着 隱形的依賴傳遞性,若是隻是用到 JMS這部分功能 引用一下Maven座標便可
html
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${project.dependency.spring.core}</version> </dependency>
依賴傳遞關係,可見SpringJMS 會隱形的導入其餘的依賴包
java
Spring-config.xml 支持 Spring-jms的命名空間,使用namespace 能夠簡化spring的配置
spring
<?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:jms="http://www.springframework.org/schema/jms" 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.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd"> <!-- bean definitions here --> </beans>
使用 Spring JMS 最基本的須要構建2個類, 一個是JMS Template 一個是JMS 客戶端apache
JMS Template: 是Spring 自身提供,只需向Spring 容器內 註冊這個類便可服務器
JMS 客戶端 : 這個是須要本身編寫的, 會使用到JMS Template類,若是須要 spring 託管 也須要向容器內 註冊
session
使用@Service 註解將 類註冊到spring 容器中, 使用Autowire註解 自動裝填 JMS Template。maven
定義 JmsTemplate的setter方法 主要是爲了解耦,脫離spring 容器的時候 須要自行set 一個 JMS template 實例
tcp
@Service("JMSDemo") public class JMSDemo{ private JmsTemplate jmsTemplate; @Autowired public void setJmsTempalte(JmsTemplate jmsTemplate){ this.jmsTemplate = jmsTemplate; } public void send(final String argQueueName, final String argObject) throws JMSException { jmsTemplate.send(argQueueName, new MessageCreator() { public Message createMessage(Session session) throws JMSException { return session.createObjectMessage(argObject); } }); } public Message consumee(String queueName) throws JMSException { Message message = jmsTemplate.receive(queueName); return message; } }
spring的配置文件中 首先須要 componet-scan 去掃描package 將帶有@component @Service 等註解的類 註冊到spring的容器中。
測試
<!-- =============================================== --> <!-- component Scanning --> <!-- =============================================== --> <context:component-scan base-package="com.*"/>
其次須要須要定義 Jms template Beanui
Jms Template 須要額外配置 connectionFactory 和defaultDestination 屬性 messageConverter 是可選項,後面後續的系列會提到。
這裏使用了 spring的 cacheConnectionFactory去池化connection。
最終 咱們須要向spring 提供 2個實現類 分別是 connectionFacotry和defaultDestination
<!-- =============================================== --> <!-- JMS Template --> <!-- =============================================== --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="cachingConnectionFactory"/> <property name="defaultDestination" ref="jmsDestination"/> <property name="messageConverter"> <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/> </property> </bean> <!-- Pooled Spring connection factory --> <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="jmsConnectionFactory" /> </bean>
若是須要到 JNID 裏面去尋找 JMS 供應, 使用 jee:jndi-lookup 去尋找便可
前提是 須要加上 jee 的name space
xmlns:jee=" xsi:schemaLocation=" http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"
<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="amqConnectionFactory" /> <jee:jndi-lookup id="jmsDestination" jndi-name="amqDestination" />
若是須要到 本身定義實現類 須要額外定義 connectFactory 的實際類(各供應商可能各不相同),這裏以ActiveMQ爲例
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <!-- brokerURL, You may have different IP or port --> <property name="brokerURL" value="tcp://localhost:61616" /> </bean> <bean id="defaultDestination" class="org.apache.activemq.command.ActiveMQQueue"> <!--<property name="compositeDestinations" value="testQueue"/>--> <constructor-arg index="0" value="testQueue" /> </bean>
簡單測試 發送消息到隊列
準備工做須要 引入依賴包 ActiveMq ,Spring-test 和 開啓 JMS服務器 。
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${project.dependency.apache.activemq}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${project.dependency.spring.core}</version> <scope>test</scope> </dependency>
public static void main(String[] arg){ ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // creates an JNDI Context and combine resources SimpleNamingContextBuilder builder = null; try { builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder(); } catch (NamingException e) { e.printStackTrace(); } builder.bind("amqConnectionFactory", connectionFactory); builder.bind("amqDestination", new ActiveMQQueue("testQueue") ); // Initialize Spring Context ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); JMSDemo jmsDemo = context.getBean(JMSDemo.class); try { jmsDemo.send("testQueue","Test"); } catch (JMSException e) { e.printStackTrace(); } }