讲完了理论,接下来是实战部分,还希望大牛们能够指出不足之处
要使用Java消息服务,你必须要有一个JMS提供者,管理会话和队列。既有开源的提供者也有专有的提供者。
开源的提供者包括:
Apache ActiveMQ
JBoss 社区所研发的 HornetQ
Joram
Coridan的MantaRay
The OpenJMS Group的OpenJMS
而我选择的是在网上人气最高的ActiveMQ~~
关于ActiveMQ的安装和配置我这里就不做多余陈述,网上关于这个的资料很多,我们直接来启动ActiveMQ就好了~
ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用。
我们来通过浏览器访问admin:http://127.0.0.1:8161/admin/
用户名和密码默认都是admin,这是登录以后的页面:
至此,我们的activemq就已经完成了准备阶段工作,可以开始进行开发了~~
我简单说明一下我的开发环境,我是使用maven构建项目,用spring对activemq进行了集成
开发阶段:
1.首先是在pom.xml中引入对activemq的支持,代码如下
<!-- jms的activemq实现 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-web</artifactId>
<version>5.8.0</version>
</dependency><dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.13.2</version>
</dependency>这里有一点需要注意,我在引入activemq依赖的时候出的两个问题,第一个是之后如果涉及到异步接收消息,我们要注意使用servlet3.0之后的版本,另一个问题是activemq5.6是会多引入例如servlet和jsp的依赖,这个时候要注意排除和你之前的servlet,jsp排除冲突
2.在spring中配置activemq
首先,我们在根目录下新建一个jms.properties
这个是我的内容:
jms.brokerURL = tcp://localhost:61616
jms.userName = admin
jms.password = admin
jms.messageTopic =messageTopic接下来开始通过spring容器初始化配置,以下是配置文件
<!-- jms -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${jms.brokerURL}"/>
<property name="userName" value="${jms.userName}"/>
<property name="password" value="${jms.password}"/>
</bean>
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="maxConnections" value="100"></property>
</bean>
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="${jms.messageTopic}" />
</bean>
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg index="0" value="${jms.messageTopic}" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory" />
<property name="defaultDestination" ref="destination"/>
</bean>
<!-- jms的发送者 -->
<bean id="activemqMessageSender" class="com.code.cheney.ssm_Maven.jms.impl.ActivemqMessageSender">
<constructor-arg index="0" ref="jmsTemplate"/>
</bean>
<!-- jms的接收者 -->
<bean id="activemqMessageReceiver" class="com.code.cheney.ssm_Maven.jms.impl.ActivemqMessageReceiver">
<constructor-arg index="0" ref="jmsTemplate"/>
</bean>
<!-- 调用纯jms api时的异步操作 -->
<jms:listener-container container-type="default"
connection-factory="connectionFactory" acknowledge="auto" concurrency="10">
<jms:listener destination="${jms.messageTopic}" ref="messageListener"
method="onMessage" />
</jms:listener-container>
<!-- jms执行异步操作时的监听器 -->
<bean id="activemqMessageListener" class="com.code.cheney.ssm_Maven.jms.impl.ActivemqMessageListener"/>3.编写jms的发送类,接收类,监听器
package com.code.cheney.ssm_Maven.jms.impl;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;import com.code.cheney.ssm_Maven.jms.MessageSender;
/**
*
* Project: ssm_jms
* Class: ActivemqMessageSender
* Description:
* @author: Cheney
* @Date 2016年5月2日 下午12:00:09
* @version 1.0
*
*/
@Component
public class ActivemqMessageSender implements MessageSender {private JmsTemplate jmsTemplate;
public ActivemqMessageSender(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
@Override
public void sendMessage(String message) {
jmsTemplate.convertAndSend(message);
}}
package com.code.cheney.ssm_Maven.jms.impl;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;import com.code.cheney.ssm_Maven.jms.MessageReceiver;
/**
*
* Project: ssm_jms Class: ActivemqMessageReceiver Description:
*
* @author: Cheney
* @Date 2016年5月2日 下午1:42:45
* @version 1.0
*
*/
@Component
public class ActivemqMessageReceiver implements MessageReceiver {private JmsTemplate jmsTemplate;
public ActivemqMessageReceiver(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}@Override
public String receiveMessage() {
String result = (String) jmsTemplate.receiveAndConvert();
return result;
}}
package com.code.cheney.ssm_Maven.jms.impl;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;import org.springframework.stereotype.Component;
/**
*
* Project: ssm_jms
* Class: ActivemqMessageListener
* Description:
* @author: Cheney
* @Date 2016年5月2日 下午1:48:07
* @version 1.0
*
*/
@Component
public class ActivemqMessageListener implements MessageListener {
@Override
public void onMessage(Message msg) {
TextMessage textMsg = (TextMessage)msg;
try {
String message = textMsg.getText();
System.out.println(message);
} catch (JMSException e) {
e.printStackTrace();
}
}}
代码中MessageReceiver 和MessageSender这两个是我自己定义的接口其中只包括对应的接收消息和发送消息的两个方法。
接下来就是调用发送类的sendMessage方法发送消息和调用接收类的receiveMessage方法来接收消息啦~
以上就是一个最简单的利用spring集成activemq进行jms开发的例子,当然还有一个更方便的ajax方式,因为在原理上都是相同的,所以不想说太多了,简单说一下区别就是在web.xml多了以下配置<!-- JMS的ajax实现 -->
<servlet>
<servlet-name>AjaxServlet</servlet-name>
<servlet-class>org.apache.activemq.web.AjaxServlet</servlet-class>
<load-on-startup>2</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>AjaxServlet</servlet-name>
<url-pattern>/amq/*</url-pattern>
</servlet-mapping>
<!-- 启动时servlet将连接tcp://127.0.0.1:61616 -->
<context-param>
<param-name>org.apache.activemq.brokerURL</param-name>
<param-value>tcp://127.0.0.1:61616</param-value>
</context-param>
<!-- 不需要启用一个嵌入式代理 -->
<context-param>
<param-name>org.apache.activemq.embeddedBroker</param-name>
<param-value>false</param-value>
</context-param>哦对了,我在开发过程中还遇到的一个问题是忘记在web.xml设置所有的过滤器、拦截器以及servlet为异步模式,只要在每一个配置中间加一句
<async-supported>true</async-supported>
就大功告成了~~
以上就是最简单的jms开发,更多的内容要自己去官网看文档咯~