activemq安装与配置_ActiveMQ(消息队列)从入门到了解

一、 ActiveMQ 简介

1 什么是 ActiveMQ

ActiveMQ 是 Apache 出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个 完全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现,尽管 JMS 规范出台已经是很久 的事情了,但是 JMS 在当今的 J2EE 应用中间仍然扮演着特殊的地位。

2 什么是消息

“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串; 也可以更复杂,可能包含嵌入对象。

3 什么是队列

v2-681c81579682515dca62033b563f0ff3_b.jpg

4 什么是消息队列

“消息队列”是在消息的传输过程中保存消息的容器。

5 常用消息服务应用

5.1 ActiveMQ

ActiveMQ 是 Apache 出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完 全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现。

5.2 RabbitMQ

RabbitMQ 是一个在 AMQP 基础上完成的,可复用的企业消息系统。他遵循 Mozilla Public License 开源协议。开发语言为 Erlang。

5.3 RocketMQ

由阿里巴巴定义开发的一套消息队列应用服务。

四、 ActiveMQ 安装

1 下载资源

ActiveMQ 官网: ActiveMQ

v2-28867533c0af5dd7134f4ba7da146bf8_b.jpg

1.1 版本说明

ActiveMQ5.10.x 以上版本必须使用 JDK1.8 才能正常使用。 ActiveMQ5.9.x 及以下版本使用 JDK1.7 即可正常使用。

2 上传至 Linux 服务器

3 解压安装文件

tar -zxf apache-activemq-5.9.0-bin.tar.gz

v2-38b950e42780830e0a50e8a23e383f46_b.png

4 检查权限

ls -al apache-activemq-5.9.0/bin 如果权限不足,则无法执行,需要修改文件权限: chmod 755 activemq

5 复制应用至本地目录

cp -r apache-activemq-5.9.0 /usr/local/activemq

v2-85068f6e705c908f5169d25c9ee68d8c_b.jpg

6 启动 ActiveMQ

/usr/local/activemq/bin/activemq start

7 测试 ActiveMQ

7.1 检查进程

ps aux | grep activemq 见到下述内容即代表启动成功

v2-42b66e799475247e2892e1adb28c47f8_b.jpg

7.2 管理界面

使用浏览器访问 ActiveMQ 管理应用, 地址如下: http://ip:8161/admin/

用户名: admin 密码: admin

ActiveMQ 使用的是 jetty 提供 HTTP 服务.启动稍慢,建议短暂等待再访问测试. 见到如下界面代表服务启动成功

v2-0b96007db1791db6cd295723bf14fbea_b.jpg

7.3 修改访问端口

修改 ActiveMQ 配置文件: /usr/local/activemq/conf/jetty.xml

v2-b63e4f55de59fd8c36a6805b7c622c50_b.png

配置文件修改完毕,保存并重新启动 ActiveMQ 服务。 7.4 修改用户名和密码

修改 conf/users.properties 配置文件.内容为: 用户名=密码 保存并重启 ActiveMQ 服务即可.

8 重启 ActiveMQ

/usr/local/activemq/bin/activemq restart

9 关闭 ActiveMQ

/usr/local/activemq/bin/activemq stop

10 配置文件 activemq.xml

配置文件中,配置的是 ActiveMQ 的核心配置信息. 是提供服务时使用的配置. 可以修改 启动的访问端口. 即 java 编程中访问 ActiveMQ 的访问端口. 默认端口为 61616. 使用协议是: tcp 协议. 修改端口后, 保存并重启 ActiveMQ 服务即可.

11 ActiveMQ 目录介绍

从它的目录来说,还是很简单的: * bin 存放的是脚本文件 * conf 存放的是基本配置文件 * data 存放的是日志文件 * docs 存放的是说明文档 * examples 存放的是简单的实例 * lib 存放的是 activemq 所需 jar 包 * webapps 用于存放项目的目录

五、 ActiveMQ 术语

1 Destination

目的地,JMS Provider(消息中间件)负责维护,用于对 Message 进行管理的对象。 MessageProducer 需要指定 Destination 才能发送消息,MessageReceiver 需要指定 Destination 才能接收消息。

2 Producer

消息生成者,负责发送 Message 到目的地。

3 Consumer | Receiver

消息消费者,负责从目的地中消费【处理|监听|订阅】Message。

4 Message

消息,消息封装一次通信的内容。

六、 ActiveMQ 应用

1 ActiveMQ 常用 API 简介

下述 API 都是接口类型,由定义在 javax.jms 包中. 是 JMS 标准接口定义.

1.1 ConnectionFactory

链接工厂, 用于创建链接的工厂类型.

1.2 Connection

链接. 用于建立访问 ActiveMQ 连接的类型, 由链接工厂创建.

1.3 Session

会话, 一次持久有效有状态的访问. 由链接创建.

1.4 Destination & Queue

目的地, 用于描述本次访问 ActiveMQ 的消息访问目的地. 即 ActiveMQ 服务中的具体队 列. 由会话创建. interface Queue extends Destination

1.5 MessageProducer

消息生成者, 在一次有效会话中, 用于发送消息给 ActiveMQ 服务的工具. 由会话创建.

1.6 MessageConsumer

消息消费者【消息订阅者,消息处理者】, 在一次有效会话中, 用于从 ActiveMQ 服务中 获取消息的工具. 由会话创建.

1.7 Message

消息, 通过消息生成者向 ActiveMQ 服务发送消息时使用的数据载体对象或消息消费者 从 ActiveMQ 服务中获取消息时使用的数据载体对象. 是所有消息【文本消息,对象消息等】 具体类型的顶级接口. 可以通过会话创建或通过会话从 ActiveMQ 服务中获取.

2 JMS-HelloWorld

2.1 处理文本消息

2.1.1 创建消息生产者

v2-f28a354dee4d0f79dcd899cbf1a9d7ad_b.jpg

2.1.1.2 修改 POM 文件添加 ActiveMQ 坐标

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.sxt</groupId><artifactId>mq-pproducer</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>5.9.0</version></dependency></dependencies>
</project>

2.1.1.3 编写消息的生产者

package com.sxt;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;public class HelloWorldProducer {/*** 生产消息* @param MsgTest*/public void sendHelloWorldActiveMQ(String MsgTest){//定义链接工厂ConnectionFactory connectionFactory = null;//定义链接对象Connection connection = null;//定义会话Session session = null;//定义目的地Destination destination = null;//定义消息的发送者MessageProducer producer = null;//定义消息Message message = null;try {/*** userName:访问ActiveMQ服务的用户名。用户密码。默认的为admin。用户名可以通过jetty-ream.properties文件进行修改* password:访问ActiveMQ服务的用户名。用户密码。默认的为admin。用户名可以通过jetty-ream.properties文件进行修改* brokerURL:访问ActiveMQ服务的路径地址。路径结构为:协议名://主机地址:端口号*/connectionFactory = new ActiveMQConnectionFactory("admin","admin", "tcp://192.168.44.130:61616");//创建连接对象connection  = connectionFactory.createConnection();//启动连接connection.start();/*** transacted:是否使用事务 可选值为:true|false*            true:使用事务 当设置次变量值。Session.SESSION_TRANSACTED*            false:不适用事务,设置次变量 则acknowledgeMode参数必须设置* acknowledgeMode:* Session.AUTO_ACKNOWLEDGE:自动消息确认机制* Session.CLIENT_ACKNOWLEDGE:客户端确认机制* Session.DUPS_OK_ACKNOWLEDGE:有副本的客户端确认消息机制*/session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建目的地,目的地即队列的名称。消息的消费者需要通过该名称访问对应的队列destination = session.createQueue("Helloworld-destination");//创建消息的生产者producer = session.createProducer(destination);//创建消费者对象message = session.createTextMessage(MsgTest);//发送消息producer.send(message);} catch (JMSException e) {e.printStackTrace();}finally{if(producer != null){try {producer.close();} catch (JMSException e) {e.printStackTrace();}}if(session != null){try {session.close();} catch (JMSException e) {e.printStackTrace();}}if(connection != null ){try {connection.close();} catch (JMSException e) {e.printStackTrace();}}}}}

2.1.2 创建消息消费者

2.1.2.1 创建工程

v2-a8ee90055555ab0716159348982ba49b_b.jpg

2.1.2.2 修改 POM 文件添加 ActiveMQ 坐标

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.sxt</groupId><artifactId>mq-consumer</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>5.9.0</version></dependency></dependencies></project>

2.1.2.3 编写消息的消费者

package com.sxt;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class HelloWorldConsumer {/*** 消费消息*/public void readHelloWorldActiveMQ(){//定义链接工厂ConnectionFactory connectionFactory = null;//定义链接对象Connection  connection = null;//定义会话Session session = null;//目的地Destination destination = null;//定义消息的消费者MessageConsumer consumer = null;//定义消息Message  message = null;try {/*** userName:访问ActiveMQ服务的用户名。用户密码。默认的为admin。用户名可以通过jetty-ream.properties文件进行修改* password:访问ActiveMQ服务的用户名。用户密码。默认的为admin。用户名可以通过jetty-ream.properties文件进行修改* brokerURL:访问ActiveMQ服务的路径地址。路径结构为:协议名://主机地址:端口号*/connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.44.130:61616");//创建连接对象connection = connectionFactory.createConnection();//启动连接connection.start();/*** transacted:是否使用事务 可选值为:true|false*            true:使用事务 当设置次变量值。Session.SESSION_TRANSACTED*            false:不适用事务,设置次变量 则acknowledgeMode参数必须设置* acknowledgeMode:* Session.AUTO_ACKNOWLEDGE:自动消息确认机制* Session.CLIENT_ACKNOWLEDGE:客户端确认机制* Session.DUPS_OK_ACKNOWLEDGE:有副本的客户端确认消息机制*/session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建目的地,目的地名称即队列的名称。消息的消费者需要通过此名称访问对应的队列destination = session.createQueue("Helloworld-destination");//创建消息的消费者consumer = session.createConsumer(destination);//接收消息message  = consumer.receive();//处理消息String msg =  ((TextMessage)message).getText();System.out.println("从ActiveMQ服务中获得的消息"+msg);} catch (JMSException e) {e.printStackTrace();}finally{// 回收消息发送者资源if(consumer != null){try {consumer.close();} catch (JMSException e) {e.printStackTrace();}}if(session != null){try {session.close();} catch (JMSException e) {e.printStackTrace();}}		if(connection != null ){try {connection.close();} catch (JMSException e) {e.printStackTrace();}}				}}
}

2.1.3 测试

2.1.3.1 Producer

package com.sxt;public class Test {public static void main(String[] args) {System.out.println("消息发送方...");
//		HelloWorldProducer hwp = new HelloWorldProducer();
//		hwp.sendHelloWorldActiveMQ("HelloWorld!");/* Users user = new Users();user.setUserid(3);		 user.setUserName("多对的");user.setPassWord("46464");HelloWorldProducer2 producer = new HelloWorldProducer2();producer.sendHelloWorldActiveMQ(user);}*/HelloWorldProducer3 producer = new HelloWorldProducer3();producer.sendHelloWorldActiveMQ("Helloworlddsdfsdfdsf");}
}

2.1.3.2 Consumer

package com.sxt;public class Test {public static void main(String[] args) {System.out.println("消息接收方...");
//		HelloWorldConsumer  hc = new  HelloWorldConsumer();
//		hc.readHelloWorldActiveMQ();
//	   HelloWorldConsumer2  consumer = new 	HelloWorldConsumer2();
//	   consumer.readHelloWorldActiveMQ();HelloWorldConsumer3 consumer = new HelloWorldConsumer3();consumer.readHelloWorldActiveMQ();}
}

2.2 处理对象消息

2.2.1 定义消息对象

package com.sxt;import java.io.Serializable;public class Users implements Serializable{private static final long serialVersionUID = -1305446877847351356L;private int userid;private String userName;private String passWord;public int getUserid() {return userid;}public void setUserid(int userid) {this.userid = userid;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}	
}

2.2.2 创建生产者

大同小异,需要在上面的基础上修改

v2-9e638adcbd74080e30de42936fd15353_b.jpg

2.2.3 定义消息消费者

v2-64122191166c91d7adf22f0d4bce44de_b.jpg

v2-e834b55bd64114c87223c22ee04a009a_b.jpg

3 JMS - 实现队列服务监听

队列服务监听使用的观察者设计模式

3.1 创建消息生产者

仅只修改队列名称

v2-5b229e96e93e9b73c9478a828ef12385_b.jpg

3.2 消息消费者

v2-f79087af96c6b4ad58feb1b84a8c1ca3_b.jpg

并取消资源关闭

v2-e59aa3b6a65fa28c3f4111e826ff0e7d_b.png

保持开启状态

4 Topic 模型

4.1 Publish/Subscribe 处理模式(Topic)

消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消 息。 和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。 当生产者发布消息,不管是否有消费者。都不会保存消息 一定要先有消息的消费者,后有消息的生产者。

v2-ad91976a2c34573c6677dca69a1fc88b_b.jpg

4.2 创建生产者

v2-eea69f22ba8df7cbc1a6d26df0463911_b.jpg

原来的生产者为:

v2-81b0ea55aed09a34873930a6e4961e0a_b.jpg

4.3 创建消费者

v2-f85c2529a468616a29233354b77be579_b.jpg
package com.bjsxt;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class HelloWorldConsumerTopic1 implements Runnable{/*** 消费消息*/public void readHelloWorldActiveMQ() {// 定义链接工厂ConnectionFactory connectionFactory = null;// 定义链接对象Connection connection = null;// 定义会话Session session = null;// 目的地Destination destination = null;// 定义消息的发送者MessageConsumer consumer = null;// 定义消息Message message = null;try {/*** userName:访问ActiveMQ服务的用户名。用户密码。默认的为admin。用户名可以通过jetty-ream.* properties文件进行修改* password:访问ActiveMQ服务的用户名。用户密码。默认的为admin。用户名可以通过jetty-ream.* properties文件进行修改 brokerURL:访问ActiveMQ服务的路径地址。路径结构为:协议名://主机地址:端口号*/connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.70.151:61616");// 创建连接对象connection = connectionFactory.createConnection();// 启动连接connection.start();/*** transacted:是否使用事务 可选值为:true|false true:使用事务* 当设置次变量值。Session.SESSION_TRANSACTED false:不适用事务,设置次变量* 则acknowledgeMode参数必须设置 acknowledgeMode:* Session.AUTO_ACKNOWLEDGE:自动消息确认机制* Session.CLIENT_ACKNOWLEDGE:客户端确认机制* Session.DUPS_OK_ACKNOWLEDGE:有副本的客户端确认消息机制*/session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 创建目的地,目的地名称即队列的名称。消息的消费者需要通过此名称访问对应的队列destination = session.createTopic("test-topic");// 创建消息的消费者consumer = session.createConsumer(destination);consumer.setMessageListener(new MessageListener() {//ActiveMQ 回调的方法。通过该方法将消息传递到 consumer@Overridepublic void onMessage(Message message) {//处理消息String msg=null;try {msg = ((TextMessage)message).getText();} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("从ActiveMQ服务中获取的文本信息 ---topic1 "+msg);}});		} catch (Exception e) {e.printStackTrace();} }@Overridepublic void run() {this.readHelloWorldActiveMQ();}
}

Spring-activemq-consumer

v2-ca52298a2b3584751075ef7c17ef8795_b.jpg

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.sxt</groupId><artifactId>parent</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.sxt</groupId><artifactId>spring-activemq-consumer</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!-- activemq客户端 --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId></dependency><!-- spring框架对JMS标准的支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId></dependency><!-- ActiveMQ和spring整合的插件 --><dependency><groupId>org.apache.xbean</groupId><artifactId>xbean-spring</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency></dependencies>
</project>

myMessageListener:

package com.sxt.listener;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.sxt.pojo.Users;
import com.sxt.service.UserService;/*** 消息服务监听器* @author Administrator**/
@Component(value="myListener")
public class MyMessageListener implements MessageListener{@Autowiredprivate UserService userService;@Overridepublic void onMessage(Message message) {//处理消息ObjectMessage objectMessage = (ObjectMessage) message;Users user = null;try {user = (Users)objectMessage.getObject();} catch (JMSException e) {e.printStackTrace();}this.userService.showUser(user);}}

applicationContext-jms.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:jms="http://www.springframework.org/schema/jms" xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/jmshttp://www.springframework.org/schema/jms/spring-jms.xsdhttp://activemq.apache.org/schema/corehttp://activemq.apache.org/schema/core/activemq-core.xsd"><!-- 需要创建一个连接工厂,连接ActiveMQ. ActiveMQConnectionFactory. 需要依赖ActiveMQ提供的amq标签 --><!-- amq:connectionFactory 是bean标签的子标签, 会在spring容器中创建一个bean对象.可以为对象命名. 类似: <bean id="" class="ActiveMQConnectionFactory"></bean>--><amq:connectionFactory brokerURL="tcp://192.168.44.130:61616"userName="admin" password="admin" id="amqConnectionFactory"/><!-- spring管理JMS相关代码的时候,必须依赖jms标签库. spring-jms提供的标签库. --><!-- 定义Spring-JMS中的连接工厂对象CachingConnectionFactory - spring框架提供的连接工厂对象. 不能真正的访问MOM容器.类似一个工厂的代理对象. 需要提供一个真实工厂,实现MOM容器的连接访问.--><bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"><property name="targetConnectionFactory" ref="amqConnectionFactory"></property><property name="sessionCacheSize" value="3"></property></bean><!-- 注册监听器 --><!-- 开始注册监听. 需要的参数有:acknowledge - 消息确认机制container-type - 容器类型 default|simplesimple:SimpleMessageListenerContainer最简单的消息监听器容器,只能处理固定数量的JMS会话,且不支持事务。default:DefaultMessageListenerContainer是一个用于异步消息监听器容器 ,且支持事务         destination-type - 目的地类型. 使用队列作为目的地.connection-factory - 连接工厂, spring-jms使用的连接工厂,必须是spring自主创建的不能使用三方工具创建的工程. 如: ActiveMQConnectionFactory.--><jms:listener-container acknowledge="auto" container-type="default"destination-type="queue" connection-factory="connectionFactory" ><!-- 在监听器容器中注册某监听器对象.destination - 设置目的地命名ref - 指定监听器对象--><jms:listener destination="test-spring" ref="myListener"/></jms:listener-container></beans>

spring-activemq-producer(生产者)

v2-d782b0aa51818a73bccd76ebdd524956_b.jpg

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.sxt</groupId><artifactId>parent</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.sxt</groupId><artifactId>spring-activemq-producer</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><dependencies><!-- ActiveMQ客户端完整jar包依赖 --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId></dependency><!-- ActiveMQ和Spring整合配置文件标签处理jar包依赖 --><dependency><groupId>org.apache.xbean</groupId><artifactId>xbean-spring</artifactId></dependency><!-- Spring-JMS插件相关jar包依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId></dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-pool</artifactId></dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-jms-pool</artifactId></dependency><!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><!-- 日志处理 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></dependency><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><!-- JSP相关 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><scope>provided</scope></dependency></dependencies><build><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><path>/</path><port>8080</port></configuration></plugin></plugins></build>
</project>

userServiceImpl:

package com.sxt.service.impl;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;import com.sxt.pojo.Users;
import com.sxt.service.UserService;@Service
public class UserServiceImpl implements UserService{@Autowiredprivate JmsTemplate jmsTemplate;@Overridepublic void addUser(final Users user) {//发送消息this.jmsTemplate.send(new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {ObjectMessage message = session.createObjectMessage(user);return message;}});}
}

applicationContext-jms.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:jms="http://www.springframework.org/schema/jms"xmlns:context="http://www.springframework.org/schema/context"xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/jmshttp://www.springframework.org/schema/jms/spring-jms.xsdhttp://activemq.apache.org/schema/corehttp://activemq.apache.org/schema/core/activemq-core.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 需要创建一个连接工厂,连接ActiveMQ. ActiveMQConnectionFactory. 需要依赖ActiveMQ提供的amq标签 --><!-- amq:connectionFactory 是bean标签的子标签, 会在spring容器中创建一个bean对象. 可以为对象命名. 类似: <bean id="" class="ActiveMQConnectionFactory"></bean> --><amq:connectionFactory brokerURL="tcp://192.168.44.130:61616"userName="admin" password="admin" id="amqConnectionFactory" /><!-- 配置池化的ConnectionFactory。 为连接ActiveMQ的connectionFactory提供连接池 --><bean id="pooledConnectionFactoryBean" class="org.apache.activemq.pool.PooledConnectionFactoryBean"><property name="connectionFactory" ref="amqConnectionFactory"></property><property name="maxConnections" value="10"></property></bean><!-- spring管理JMS相关代码的时候,必须依赖jms标签库. spring-jms提供的标签库. --><!-- 定义Spring-JMS中的连接工厂对象 CachingConnectionFactory - spring框架提供的连接工厂对象. 不能真正的访问MOM容器. 类似一个工厂的代理对象. 需要提供一个真实工厂,实现MOM容器的连接访问. --><!-- 配置有缓存的ConnectionFactory,session的缓存大小可定制。 --><bean id="connectionFactory"class="org.springframework.jms.connection.CachingConnectionFactory"><property name="targetConnectionFactory" ref="amqConnectionFactory"></property><property name="sessionCacheSize" value="3"></property></bean><!-- JmsTemplate配置 --><bean id="template" class="org.springframework.jms.core.JmsTemplate"><!-- 给定连接工厂, 必须是spring创建的连接工厂. --><property name="connectionFactory" ref="connectionFactory"></property><!-- 可选 - 默认目的地命名 --><property name="defaultDestinationName" value="test-spring"></property></bean>
</beans>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智联招聘简历如何导出html,如何将拉勾网(智联招聘)的预览简历导出来

最近在整理简历的时候发现拉勾网/智联招聘上面的预览简历是那么简洁漂亮&#xff0c;可是当我想把他导到本地&#xff0c;发pdf文件给企业时却只能是word&#xff0c;那么的难看&#xff0c;摸索了一会儿找到了一种比较好的方法可以得到预览的简历。1.另存为html文件在这里插入…

Java反编译器的剖析

简单地说&#xff0c;反编译器尝试将源代码转换为目标代码。 但是有很多有趣的复杂性-Java源代码是结构化的&#xff1b; 字节码当然不是。 而且&#xff0c;转换不是一对一的&#xff1a;两个不同的Java程序可能会产生相同的字节码。 我们需要应用启发式方法&#xff0c;以合理…

wps单机无网络版_单平台销量破百万,这个国产单机系列要出网游,还要上主机...

他们想做"国际顶级的单机游戏开发商"。文/彭子诚作为一款国产单机游戏&#xff0c;《古剑奇谭三》在去年年底上市后&#xff0c;至今在 Steam 上依然保持着 83% 的好评率。大量的玩家对于游戏内容给出了认可&#xff0c;“用心”这个词是最高频出现的词语。Wegame 官…

JavaFX 8的弹出式编辑器

在过去的几个月中&#xff0c;我很高兴与JavaFX 8一起使用&#xff0c;以便为计划和调度应用程序实现复杂的用户界面。 所需的功能之一是执行“就地”编辑的方法&#xff0c;即快速编辑用户选择对象的某些基本属性的方法。 遵循“如果您无法创新&#xff0c;就模仿”的原则&am…

flex实现水平居中和两栏布局

<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title>水平垂直的实现</title><style>.wrapper{width:25…

opencv 多线程加速_线程池给你写好了,想加速拿来用就行哈

图像拼接实现见&#xff1a;OpenCV源码系列|图像拼接1OpenCV源码系列|图像拼接2耗时在调用函数&#xff1a;Mat pano; Ptr stitcher Stitcher::create(mode); Stitcher::Status status stitcher->stitch(imgs, pano)能否将这一步放进线程池里进行加速呢&#xff1f;1. 测试…

poping 心法

音乐 01.Eamon - (How Could You) Bring Him Home02.The Pussycat Dolls - Buttons03.Most Wanted ft. Fingazz, Volture -From Juvi To The Penitentiary (Instrumental)04.Kaila Yu - Move05.Danity Kane - Show Stopper06.Slick Dogg - Bang On m07.Danity Kane - Show Stop…

html5 video修改默认样式,HTML5中将video设置为背景的方法

主要用到了video标签&#xff0c;css样式&#xff0c;原理是先将video标签利用position:fixed;使video标签脱离文档流&#xff0c;在将他的z-index设置为最低的&#xff0c;比如-9999。再插入的内容自然就覆盖在视频上面了。1.首先&#xff0c;将video插入到网页中&#xff0c;…

ES6语法的学习与实践

ES6是JavaScript语言的新一代标准&#xff0c;是ECMAScript的第六个版本&#xff0c;加入了很多新的功能和语法&#xff0c;在很多框架&#xff0c;如在使用Vue,React等框架的项目中一般都采用ES6语法来编写的&#xff0c;下面对经常用到的ES6语法做简要的介绍。 1.let,const l…

这是一次 docker 入门实践

前言 其实接触 docker 也有一段时间了&#xff0c;但是一直没有做下总结&#xff0c;现在网上关于 docker 的介绍也有很多了&#xff0c;本着好记性不如烂笔头的原则&#xff0c;还是自己再记录一波吧。 实现目标 安装 docker ce 探索 docker 基本概念及用法环境准备 Centos7 6…

html dom概念,js学习之HTML DOM的一些基础概念

经过近一个星期,总算把w3chool上的HTML DOM的实例差不多看了一遍,因为本身对其中的很多都用过,所以看起来也很快,现在就再系统的回顾下HTML DOM的一些概念和基础的东西,大部分都是从w3school上看到的什么是DOMDOM是w3c(万维网联盟)的标准DOM定义了访问HTML和XML的标准"W3C…

关于Java垃圾收集

本文讨论的是使用的最受欢迎的框架之一带来的开销–我敢打赌&#xff0c;几乎没有应用程序不使用java.util.Collections。 本文基于以下事实&#xff1a;框架为例如集合的初始大小提供了默认值。 因此&#xff0c;我们有一个假设&#xff0c;即大多数人不会费心地自行管理其收…

ansys命令流_ANSYS命令流建模3之划分单元+施加弹簧

以马蹄形隧道为例&#xff0c;本文介绍如何添加荷载等隧道如上图所示!设置线单元材料属性&#xff0c;划分单元(二衬单元)lsel,s,,,1,6 !LSEL,Type,Item,Comp,VMIN, VMAX,VINClATT,1,1,3 !给线单元付材料号、实常数、单元类型号 LATT, MAT, REAL, TYPE, ESYSMSHKEY,1 …

Linux 系统中用户切换(su user与 su - user 的区别)

1,su命令 &#xff08;su为switch user&#xff0c;即切换用户的简写&#xff09; 格式&#xff1a;su -l USERNAME&#xff08;-l为login&#xff0c;即登陆的简写&#xff0c;其中l可以省略&#xff09; 如果不指定USERNAME&#xff08;用户名&#xff09;&#xff0c;默认即…

正则表达式常用方法

RegExp对象中的方法 1&#xff0c;test()方法用于检测一个字符串是否匹配某个模式&#xff0c;如果字符串中含有匹配的文本&#xff0c;则返回 true&#xff0c;否则返回 false。 reg规定匹配以a开头的字符串&#xff0c;利用test进行测试&#xff0c;字符串str满足reg匹配规则…

python安装哪个版本好啊_windows10安装哪个版本的Python?

python2除了一些大公司历史遗留问题还在使用&#xff0c;目前中小创公司使用最多的是python3 大公司的一些新项目也开始用python3了 目前来说&#xff0c;python3.5以上的版本都可以 目前使用最多的是python3.7&#xff08;建议你安装这个&#xff09; 最新的是python3.8&#…

mongose + express 写REST API

一、准备工具 先确保电脑已经安装好nodejs 1.mongoose&#xff1b;安装非常简单: npm install mongoose --save 【mongoose封装了mongodb的方法&#xff0c;调用mongoose的api可以很轻松的对mongodb进行操作】 2.express&#xff1b;npm install express --save …

js实现html模板继承,理解JavaScript中的原型和继承

本文主要讲了原型如何在JavaScript中工作&#xff0c;以及如何通过[Prototype]所有对象共享的隐藏属性链接对象属性和方法&#xff1b;以及如何创建自定义构造函数以及原型继承如何工作以传递属性和方法值。介绍JavaScript是一种基于原型的语言&#xff0c;这意味着对象属性和方…

骁龙660是32位还是64位_高通发布骁龙 7c/8c 芯片,以后你可能会在电脑上看到它...

高通的芯片生意早已不局限于移动设备领域&#xff0c;而是进一步深入至 PC 市场。相比强调性能的 X86 芯片&#xff0c;以高通骁龙为代表的 ARM 系芯片则希望突出自己的优势&#xff0c;即更长的电池续航、无风扇设计和全天候的蜂窝网络连接。在骁龙技术峰会的第三天&#xff0…

css3之盒模型

什么是盒模型&#xff1f; css中的每个元素都是一个盒模型&#xff0c; 包括html body元素&#xff0c; 浏览器解析css的时候也会把每个元素看成一个盒子来解析。 盒模型具备的属性有&#xff1a; content 、padding 、margin、border 、background等 盒模型的分类&#xff1…