ActiveMQ的在实际项目中的简单使用

简介

本文达到的目的是会用。

安装服务器:

官网下载win版的,也可是linux版的;

启动服务器:win版的执行activemq.bat

看看是否安装成功:http://localhost:8161/

activeMQ是一个消息服务器,

2中模式:点对点、广播

点对点:消息进入队列后,只会被接收一次,接收完了就在消息队列里消失了。

广播:采用的是广播订阅的方式,所有的订阅了此主题的,当此主题有消息时,都会接收到

可靠性:

mq会将信息存储

/*

* 消息的类型(消息体):

* TextMessage

* ObjectMessage: Java中的可序列化对象

* StreamMessage: Java中的输入输出流

* BytesMessage: 字节流

* MapMessage: 名/值对的集合,名是String对象,值类型可以是Java任何基本类型

*/

/*

* 术语:

* ConnectionFactory:连接工厂,JMS 用它创建连接;

* Destination:消息的目的地;

* Session:会话,一个发送或接收消息的线程;

*/

发送消息到消息队列:

场景:程序中记录日志,异步的把日志输出等。

配置文件:

Spring-context.xml:

配置jmsConnectionFactory

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">

//value的值就是mq服务器的地址

<property name="brokerURL" value=" tcp://10.128.11.128:61616 " />

<property name="useAsyncSend" value="true" />//表示异步传送,默认是false,同步

</bean>

配置pooledJmsConnectionFactory:池

<bean id="pooledJmsConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"

destroy-method="stop">

<property name="connectionFactory" ref="jmsConnectionFactory" />

<property name="maxConnections" value="100" />

<property name="maximumActive" value="50" />

</bean>

配置jmsTemplate:模板,这是核心

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">

<property name="connectionFactory" ref="pooledJmsConnectionFactory" />

</bean>

定义发送消息的队列:

<bean id="sendGSMMessageQueue" class="org.apache.activemq.command.ActiveMQQueue">

<constructor-arg value="gsm.message.push.queue" />//队列的名字是任意写的,只要不重复

</bean>

定义生产者:将消息发送到这个队列

<bean id="notificationSender" class="com.gome.gsm.jms.NotificationSender">

<property name="jmsTemplate" ref="jmsTemplate"></property>

//将消息发送到这个队列

<property name="queue" ref="sendGSMMessageQueue"></property>

</bean>

NotificationSender.java:

就是普通的类,注入jmsTemplate和queue,并且有个send方法,并调用jmsTemplate的send方法

//这里发送的是String型的数据

public void send(final String message){

this.jmsTemplate.send(queue, new MessageCreator() {

@Override

public Message createMessage(Session session) throws JMSException {

return session.createTextMessage(message);

}

});

logger.info("-------发送消息到消息服务器通知队列成功--" + message + "-------");

}

以上,便实现了将消息发送到消息队列。

既然有了生产者,那么也应该有消费者,否则消息将一直阻塞。

从消息队列接收消息

注:这里不是在那个队列里接收的消息

------------------------------------分割线-----------------------------------------

进行消息的接收

配置receiveMessageQueue:接收消息队列(是否需要定义接收消息队列与项目需求有关,比如我就是接收我前面已经定义的消息发送队列的消息,那么这里也就没有必要定义这个队列了)

<bean id="receiveMessageQueue" class="org.apache.activemq.command.ActiveMQQueue">

<constructor-arg value="gsm.message.receiver.queue" />//要在这个消息队列接收消息

</bean>

配置消息监听器:

<bean id="notificationListener" class="com.gome.gsm.jms.NotificationListener">

//这里需要根据系统具体写,因为监听器类里面注入了这个资源

<property name="notificationService" ref="notificationService" />

</bean>

配置消息接收客户端:

<bean id="notificationConsumer"

class="org.springframework.jms.listener.DefaultMessageListenerContainer">

<property name="connectionFactory" ref="pooledJmsConnectionFactory" />

<property name="destination" ref="receiveMessageQueue" />

<property name="messageListener" ref="notificationListener" />

</bean>

其中bean 的id为notificationService的类:(项目时注解开发)

编写监听器类:(在消息队列里接收消息的)

public class NotificationListener implements MessageListener {

private static final Logger logger = LoggerFactory.getLogger(NotificationListener.class);

private NotificationService notificationService;

public NotificationService getNotificationService() {

return notificationService;

}

public void setNotificationService(NotificationService notificationService) {

this.notificationService = notificationService;

}

@Override

public void onMessage(Message message) {

try {

if(message instanceof TextMessage){

TextMessage receiveMessage = (TextMessage) message;

String jsonStr = receiveMessage.getText();

logger.info("----接收到通知消息: " + jsonStr + "--------------------");

Map map = JsonUtil.jsonStringToMap(jsonStr);

//根据接收到的消息具体做些事情即可。。。

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

注意:

因为项目中只用到了这种点对点的方式队列,所以这里只有这个。

发送的消息队列可以使可接受的消息队列是一个。具体看需求。

mq就是一个消息服务器,有生产者将消息放到队列里面,至于是谁接收消息,谁是消费者,并不清楚;

参考:http://yinbinhome.iteye.com/blog/1273228

时间: 2024-07-31 23:11:57

ActiveMQ的在实际项目中的简单使用的相关文章

Jwt在Java项目中的简单实际应用

1.什么是jwt 双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息.简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库. 2.Jwt在javaweb项目中的简单使用 第一步:引入maven依赖 <!--

Web项目中创建简单的错误处理页面

当应用程序出现错误的时候,如果没有做错误页面处理的话,会直接输出一些敏感的信息出来,有时候甚至会直接将项目所在的物理路径给显示出来,严重缺乏安全性,并且错误种类繁多,页面风格不一,导致用户体验不好,本文介绍如何在web项目中创建错误页面,从而友好的提示错误信息. 一,创建错误页面error.aspx,前台代码如下(可根据实际需要增加元素): <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&qu

Android图片缓存技术!直接用在你的项目中,简单方便高效

好久没有写博客了,最近比较繁琐,什么面试呀,找工作呀,大三的生活就快完了,准确的是大学的生活就快完了!三年了,一直在搞移动开发,感觉好快呀,不想就这样的离开学校了!咳咳咳,扯远了... 前不久搞的Android图片缓存,刚开始引入开源的框架,用着还行,但是在开发中遇到问题,就比如universal-image-loader-1.9.5.jar这个框架吧,在加载图片的时候自定义imageview无法加载,可能是存在以下问题吧,况且导入框架导致开发的项目包越来越大,基于上面的这几种情况,于是我就想自

shiro权限项目中的简单应用

SpringMVC+maven 项目需要使用shiro,所以自学了几天,仅提供给新手,请根据文档查看-该项目仅是测试项目,并不完善,只实现了需要使用的基本功能,并且只提供了使用shiro模块的代码.楼主新人第一次写,如有问题希望能提出来,由衷的感谢. 首先是pom.xml: <dependency>     <groupId>org.apache.shiro</groupId>     <artifactId>shiro-core</artifactI

Redis在SSM项目中的简单使用

一.基于SSM的Redis环境配置 前提是你的开发电脑安装和配置好了redis,如果没安装请看Window配置Redis环境和简单使用 1.1.pom文件中引入redis客户端jar包(pom.xml) <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>j

Linux中ifreq 结构体分析和使用 及其在项目中的简单应用

[基础知识说明] 结构原型: /* * Interface request structure used for socket * ioctl's.  All interface ioctl's must have parameter * definitions which begin with ifr_name.  The * remainder may be interface specific. */ struct ifreq {#define IFHWADDRLEN 6 union { 

c#设计模式(1)—— 策略模式在实际项目中的简单应用

1.策略模式应用的核心概念 策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,使他们可以相互替换,策略模式使算法在不影响客户端情况下发生变化. 一个系统需要动态地在几种算法中选择一种的情况下.那么这些算法可以包装到一个个具体的算法类里面,并为这些具体的算法类提供一个统一的接口. 2.场景描述 不同的数据库会有不同的数据访问方式及数据库脚本,采用策略模式可以很好的将数据访问类进行分离,不同的数据访问类只需实现统一的接口,具体的实现方法(不同的数据库执行脚本)在各自的数据访问类中进行

在Spring项目中使用@Scheduled注解定义简单定时任务

如题所示,有时候我们需要在Web项目中配置简单的定时任务,而且因为任务并不复杂不想使用定时调度框架(PS:Quartz.ActiveMQ .Kafka等),这时就可以考虑使用@Scheduled注解来定义简单的定时任务.其全部配置如下: (1)在Spring的配置文件中添加定时任务相关配置: xml配置的头文件中添加: xmlns:task="http://www.springframework.org/schema/task" 以及在xsi:schemaLocation中添加: ht

在OC项目中添加Swift文件并实现混合编程

对于已经工作的开发者,并不适合也没有条件从一个全新的swift项目开始,进行开发. 虽然网上关于swift和oc混合编程的教程比较多,但是大多是基于 swift项目的,所以对咱们 OCer的参考价值有一定折扣. 现在swift虽然仍然存在很多缺陷,但是鉴于苹果的强势,是时候在项目中把简单的功能交给swift了,给自己,给项目,给swift一个缓冲区,都是极好的. 说了这么多,开始上代码. 现在的背景是: 已经有一个oc项目了,我想要加入 swfit,并且实现 oc调用 swift ,swift调