ActiveMQ与Spring集成(四)

本文详细介绍了如何利用Spring框架整合ActiveMQ,通过配置连接工厂、声明消息目的地以及使用JmsTemplate简化消息的发送与接收。通过实例展示了发送与接收序列化消息的过程,并讨论了同步接收异步发送消息的问题及解决方案。

转载请出自出处:http://eksliang.iteye.com/blog/2242729

一、必须导入spring对JMS封装的包 

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jms</artifactId>
	<version>3.2.9.RELEASE</version>
</dependency>

<dependency>
	 <groupId>org.apache.activemq</groupId>
	 <artifactId>activemq-all</artifactId>
	 <version>5.5.0</version>
</dependency>
<!--  ActiveMQ依赖的日志包 -->
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.14</version>
</dependency>

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.5.6</version>
</dependency>

 

二、创建连接工厂

配置JMS的连接工厂,让Spring知道如何连接到ActiveMQ。ActiveMQConnectionFactory是ActiveMQ自带的连接工厂,在spring中可以使用如下方式进行配置:

<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
	<property name="brokerURL" value="tcp://localhost:61616"/>
</bean>

 

三、声明ActiveMQ消息目的地

消息目的地可以是一个队列,也可以是一个主题,这取决于应用的需求。如果便是在spring中分别创建的队列(queue)目的地与主题(topic)目的地

<!-- 队列的目的 -->
<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
	<constructor-arg value="queue.destination"/>
</bean>

<!-- 主题的目的地 -->
<bean id="topic" class="org.apache.activemq.command.ActiveMQTopic">
	<constructor-arg value="topic.Destination"/>
</bean>

 

 四、使用Spring的模板代码来简化消息的发送与接收

针对如果消除冗余和重复的JMS代码,Spring给出的解决方案是JmsTemplate.为了使用JmsTemplate,我们需要在Spring的配置文件中将他声明为一个Bean,如下所示。

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
	<property name="connectionFactory" ref="connectionFactory"/>
	<!-- 下面这两个不是必须的,因为jmsTemplate的方法可以指定目的地 -->
	<!-- <property name="defaultDestinationName" value="queue.destination"/> -->
	<property name="defaultDestination" ref="queue"></property>
</bean>
	
<!-- 装配发送消息实体 -->
<bean id="queueSendService" class="com.gosun.jms.QueueSendService">
	<property name="jmsTemplate" ref="jmsTemplate"/>
</bean>
<!-- 装配接收消息实体 -->
<bean id="queuesAcceptService" class="com.gosun.jms.QueuesAcceptService">
	<property name="jmsTemplate" ref="jmsTemplate"/>
</bean>

 

  • com.gosun.jms.domain.User代码如下:
package com.gosun.jms.domain;

import java.io.Serializable;

public class User implements Serializable{
	private static final long serialVersionUID = 13531L;
	private String userName;
	private String userPwd;
	private Float  sal;
	
	get() set().....!省略
	
	@Override
	public String toString() {
		return "User [userName=" + userName + ", userPwd=" + userPwd + ", sal="
				+ sal + "]";
	}
}
  •  com.gosun.jms.QueueSendService代码
package com.gosun.jms;

import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import com.gosun.jms.domain.User;

/**
 * 发送消息,消息的生产者
 * @author Ickes
 */
public class QueueSendService {
	
	private JmsTemplate jmsTemplate;
	
	/**
	 * 使用JmsTemplate发送序列化消息
	 * @param user
	 */
	public void send(final User user){
//		jmsTemplate.send(destination, messageCreator)//可以自己指定目的地
		jmsTemplate.send(new MessageCreator() {
			@Override
			public ObjectMessage createMessage(Session session) throws JMSException {
				ObjectMessage msg = session.createObjectMessage();
				msg.setObject(user);
				return msg;
			}
		});
	}

	public JmsTemplate getJmsTemplate() {
		return jmsTemplate;
	}

	public void setJmsTemplate(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}
}

 

  • com.gosun.jms.QueuesAcceptService代码如下
package com.gosun.jms;

import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import org.springframework.jms.core.JmsTemplate;

/**
 * 接收消息,消息的消费者
 * @author Ickes
 */
public class QueuesAcceptService {
	private JmsTemplate jmsTemplate;
	
	/**
	 * 接收消息
	 */
	public void receive(){
		ObjectMessage msg = (ObjectMessage) jmsTemplate.receive();
		try {
			System.out.println(msg.getObject());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

	public JmsTemplate getJmsTemplate() {
		return jmsTemplate;
	}

	public void setJmsTemplate(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}
}

 

测试代码如下:

public static void main(String[] args) {
		ApplicationContext context =new  ClassPathXmlApplicationContext("applicationContext-activeMQ.xml");
		//先发送消息
		QueueSendService qss = (QueueSendService) context.getBean("queueSendService");
		User user = new User();
		user.setUserName("ickes");
		user.setUserPwd("123456");
		user.setSal(12000F);
		qss.send(user);
		//接收消息
		QueuesAcceptService qas = (QueuesAcceptService) context.getBean("queuesAcceptService");
		qas.receive();

 

当调用JmsTemplate的receive()方法时,JmsTemplate会尝试从ActiveMQ中获取一个消息。如果没有可用的消息,receive()方法会一直等待,直到获得消息为止。也就是说该方法时同步的。这意味着接收者必须耐心等待消息的到来,因此receive()方法会一直被阻塞,直到有可用消息(或者消息超时),同步接收异步发送的消息,是不是感觉很怪异?怎么解决这个问题呢?

答:使用消息驱动POJO,怎么使用,在下篇博客中进行阐述。

 

 

 

 

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索局部开发之间实现平衡。文章详细解析了算法的初始化、勘探开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOAMOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值