文档章节

利用activemq实现jms的开发(实战篇)

CheneyLee
 CheneyLee
发布于 2016/05/31 18:25
字数 1143
阅读 954
收藏 11

讲完了理论,接下来是实战部分,还希望大牛们能够指出不足之处

要使用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,这是登录以后的页面:

image

至此,我们的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开发,更多的内容要自己去官网看文档咯~

© 著作权归作者所有

CheneyLee
粉丝 2
博文 6
码字总数 6025
作品 0
大连
程序员
私信 提问
ActiveMQ 消息服务(一)

1、百度百科对ActiveMQ的解释: ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的...

Andy市民
2015/11/06
0
0
一步一步Spring整合JMS

1.1 JMS简介 JMS的全称是Java Message Service,即Java消息服务。它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的业务需求中的话...

摆渡者
2015/08/31
0
0
ActiveMQ 5.11.1 发布,开源消息总线

ActiveMQ 5.11.1 发布了,该版本主要是修复 5.11.0 中的 bug,包括 AMQ-5564 潜在内存泄漏问题。下载地址和改进详情请看发行说明。 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线...

chaun
2015/03/27
3.6K
4
JMS配置说明-----activeMQ-5.6

1 简介 activeMQ是一个完全支持JMS1.1 和J2EE规范的JMS Provider实现; 尽管规范出台已经是很久的事情了,但JMS在当今的J2EE应用中仍然扮演着特殊的地位; 特性列表 多种语言和协议编写客户端...

次渠龙哥
2018/06/26
0
0
ActiveMQ 5.10.0 发布,JMS 消息服务器

ActiveMQ 5.10.0 发布,此版本修复了超过 200 个问题,引入了大量的改进,特别是 MQTT 和 AMQP 支持方面的。更新内容如下: Java 8 支持 Apache Shiro 安全插件 - http://activemq.apache.o...

chaun
2014/08/05
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

使用druid连接池的超时回收机制排查连接泄露问题

在工程中使用了druid连接池,运行一段时间后系统出现异常: Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is......

xiaomin0322
21分钟前
5
0
一.Android省电开发之性能优化

电量优化 Android应用开发中的网络、定位、传感器等都是比较耗电的特性,我们应该正确使用API来有效降低应用的耗电量。 1.BroadcastReceiver: 在代码实现中需要尽量避免无用操作代码的执行,...

天王盖地虎626
28分钟前
2
0
大数据安全 Ranger

简介 Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、YARN、Hive、HBase等进行细粒度的数据访问控制。通过Ranger统一的管理控制台界面,管理...

ericSM
31分钟前
4
0
一个媲美淘宝大秒杀系统的高性能架构设计思路

小编有话说:本文为纯干货技术文章,建议先转发、收藏再观看。 导论 曾经被问过好多次怎样实现秒杀系统的问题。昨天又在技术交流群被问到了。因此这里把我设想的实现秒杀系统的架构设计分享出...

老道士
31分钟前
6
0
[ESXi 6.5] 设置ESXi宿主机开机自动启动虚拟机

在百度上面找了一圈都是讲ESXi6.0之前的版本,在VMware vSphere Client上开启。 1、选择host主机——>右侧选择“配置”页签——>选择“虚拟机启动/关机” 2、点击右侧“属性”——>勾选“允许...

大道无形
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部