springboot整合activeMQ案例,queue、topic两种模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cainiaobulan/article/details/80940079

一.activeMQ安装

    可以查看我的以前博客:点击打开链接  (Linux下activeMq安装与配置),windows安装更为简单,下载Windows版本的

activeMQ,解压,进入目录,如下图:


我的电脑是64位的,直接双击activemq.bat即可,32位的进入win32文件夹下双击activemq.bat即可。

二.Springboot整合activemq项目

项目目录结构如下:


pom.xml文件核心内容:

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
            <version>1.5.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

application.properties文件配置:

#服务端口,8080被另一服务占用
server.port=9090
spring.activemq.broker-url=tcp://127.0.0.1:61616
# 在考虑结束之前等待的时间
#spring.activemq.close-timeout=15s
# 默认代理URL是否应该在内存中。如果指定了显式代理,则忽略此值。
spring.activemq.in-memory=true 
# 是否在回滚回滚消息之前停止消息传递。这意味着当启用此命令时,消息顺序不会被保留。
spring.activemq.non-blocking-redelivery=false
# 等待消息发送响应的时间。设置为0等待永远。
spring.activemq.send-timeout=0
#默认情况下activemq提供的是queue模式,若要使用topic模式需要配置下面配置
spring.jms.pub-sub-domain=true
#账号
spring.activemq.user=admin
# 密码
spring.activemq.password=admin
# 是否信任所有包
#spring.activemq.packages.trust-all=
# 要信任的特定包的逗号分隔列表(当不信任所有包时)
#spring.activemq.packages.trusted=
# 当连接请求和池满时是否阻塞。设置false会抛“JMSException异常”。
#spring.activemq.pool.block-if-full=true
# 如果池仍然满,则在抛出异常前阻塞时间。
#spring.activemq.pool.block-if-full-timeout=-1ms
# 是否在启动时创建连接。可以在启动时用于加热池。
#spring.activemq.pool.create-connection-on-startup=true
# 是否用Pooledconnectionfactory代替普通的ConnectionFactory。
#spring.activemq.pool.enabled=false
# 连接过期超时。
#spring.activemq.pool.expiry-timeout=0ms
# 连接空闲超时
#spring.activemq.pool.idle-timeout=30s
# 连接池最大连接数
#spring.activemq.pool.max-connections=1
# 每个连接的有效会话的最大数目。
#spring.activemq.pool.maximum-active-session-per-connection=500
# 当有"JMSException"时尝试重新连接
#spring.activemq.pool.reconnect-on-exception=true
# 在空闲连接清除线程之间运行的时间。当为负数时,没有空闲连接驱逐线程运行。
#spring.activemq.pool.time-between-expiration-check=-1ms
# 是否只使用一个MessageProducer
#spring.activemq.pool.use-anonymous-producers=true

三.代码部分

3.1 项目启动代码

@SpringBootApplication
public class WaiqinApplication
{
	public static void main(String[] args) {
		SpringApplication.run(WaiqinApplication.class, args);
	}
}

3.2 生产者代码:

/*
 * 队列消息控制器
 */
@RestController
public class ProducerController {
	@Autowired
	private JmsMessagingTemplate jmsMessagingTemplate;

	@Autowired
	private Queue queue;

	@Autowired
	private Topic topic;

	/*
	 * 消息生产者
	 */
	@RequestMapping("/sendmsg")
	public void sendmsg(String msg) {
		// 指定消息发送的目的地及内容
		this.jmsMessagingTemplate.convertAndSend(this.queue, msg);
	}

	@RequestMapping("/send")
	public void send(String msg) {
		// 指定消息发送的目的地及内容
		System.out.println("@@@@@@@@@@@@@@" + msg);
		this.jmsMessagingTemplate.convertAndSend(this.topic, msg);
	}
}

3.3消费者代码(此处用的是queue模式)

/*
 * 客户控制器
 */
@RestController
public class ConsumerController {
	/*
	 * 监听和读取消息
	 */
	@JmsListener(destination="active.queue")
	public void readActiveQueue(String message) {
		System.out.println("接受到:" + message);
		//TODO something
	}
}

运行项目,地址栏输入:  http://localhost:9090/sendmsg?msg=yyyyyyyyyyyyyyyyyy

控制台效果:


需要注意的是:使用queue模式的时候,需要把application.properties文件中的

spring.jms.pub-sub-domain=true 注释掉。
3.4 activemq管理页面效果:

四.topic模式

    4.1.消费者代码,这里有两个消费者

@RestController
public class ConsumerTwoController
{

	/*
	 * 监听和读取消息
	 */
	@JmsListener(destination="active.topic")
	public void readActiveTopic(String message) {
		System.out.println("接受到2:" + message);
		//TODO something
	}
}
@RestController
public class ConsumerThreeController
{
	@JmsListener(destination="active.topic")
	public void readActiveTopic(String message) {
		System.out.println("接受到3:" + message);
		//TODO something
	}
}
需要注意的:记得把application.properties文件中的
spring.jms.pub-sub-domain=true 注释放开

运行项目,浏览器地址输入:http://localhost:9090/send?msg=吞吞吐吐拖拖拖  

控制台结果:



总结:开发真正需要关注的业务就在生产者和消费者的代码部分。

    

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页