`
jamie.wang
  • 浏览: 348796 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring 异步事件

阅读更多

Spring提供了事件机制,实现了观察者模式,可以让事件发布者和事件监听者解耦,事件发布者可以发布时间而不需要知道谁会监听,如果实现了异步事件还不会影响主流业务逻辑。

 

Spring的事件机制,最常用在系统状态监测,系统日志等不影响主线业务的逻辑处理。

 

例子:

 

登录事件

 

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.springframework.context.ApplicationEvent;

public class LoginEvent  extends ApplicationEvent {
    private static final long serialVersionUID = 7574015506926006629L;

    private final Map<String, Object> params = new HashMap<String, Object>();

    public LoginEvent(Object source) {
        super(source);
    }

    public void addParam(String key, Object value) {
        this.params.put(key, value);
    }

    public Map<String, Object> getParams() {
        return Collections.unmodifiableMap(params);
    }
}

 

 

登录处理类,例如将登录人数加1

 

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class LoginCounterHandler implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent arg0) {
        if (arg0 instanceof LoginEvent) {
            // TODO refresh login count
            System.out.println("a user login to system");
        }
    }
}
 

 

发布事件

 

LoginEvent event = new LoginEvent(this);
event.addParam("name", "foo");
ApplicationContextProvider.getApplicationContext().publishEvent(event);
 

 

为了实现异步事件处理,这里需要重新实现SimpleApplicationEventMulticaster

 

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.core.task.TaskExecutor;

public class AsyncApplicationEventMulticaster extends SimpleApplicationEventMulticaster {
	private TaskExecutor taskExecutor = new TaskExecutor() {
		ExecutorService exeserv = Executors.newCachedThreadPool();
		public void execute(Runnable task) {
			exeserv.execute(task);
		}
	};

	protected TaskExecutor getTaskExecutor() {
		return this.taskExecutor;
	}
}
 

另外为了容易获取applicationContext,加了一个ApplicationContextProvider

 

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ApplicationContextProvider implements ApplicationContextAware {
	private static ApplicationContext ctx = null;

	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		ctx = applicationContext;
	}

	public static ApplicationContext getApplicationContext() {
		return ctx;
	}
}

 

bean配置

 

    <bean name="applicationEventMulticaster" class="org.jamie.domo.spring.context.AsyncApplicationEventMulticaster" ></bean>
    <bean id="applicationContextProvider" class="org.jamie.domo.spring.context.ApplicationContextProvider"></bean>
    <bean name="loginCounterHandler" class="org.jamie.domo.spring.context.LoginCounterHandler"></bean>
 

总结:真是要感谢Spring提供了很多现成的模式让我们的系统更加的松耦合,给我们带来了很多便利。

 

分享到:
评论

相关推荐

    spring异步调用的例子

    首先,我们需要了解Spring异步调用的基础概念。在Spring中,你可以通过`@Async`注解标记一个方法为异步执行。这个注解来自`org.springframework.scheduling.annotation`包,它会将该方法委托给Spring的异步任务执行...

    使用Spring事件机制实现异步的方法

    使用Spring事件机制实现异步的方法 Spring框架提供了一种事件机制,允许开发者将代码解耦合,实现松散耦合的设计理念。这里将详细介绍如何使用Spring事件机制实现异步的方法。 事件机制的实现主要包括三个部分:...

    spring 异步编程样例

    spring 异步编程样例

    Spring MVC异步模式

    在Spring MVC框架中,异步模式允许我们处理耗时的操作,如大数据处理、长时间的网络请求等,而不阻塞主线程。这种方式提高了系统的响应速度,改善了用户体验。本篇文章将深入探讨Spring MVC中的异步处理机制,以及...

    spring3.0异步

    在Spring 3.0版本之后,引入了对异步处理的支持,这极大地提高了应用程序的性能和响应速度。本文将深入探讨Spring 3.0及后续版本中的异步方法,特别是结合Spring MVC、Spring和MyBatis框架的异步示例。 ### 1. 异步...

    Spring异步工具类

    Spring异步工具类

    spring线程池(同步、异步).docx

    一、Spring异步线程池类图 Spring提供了一系列的`TaskExecutor`实现,它们根据不同的需求和场景有不同的特性和行为。这些实现包括但不限于: 1. `SimpleAsyncTaskExecutor`:每次请求都会启动新的线程,不进行线程...

    Spring 异步多线程动态任务处理的使用心得

    在现代应用中,高效地处理并发任务是至关重要的,Spring为此提供了异步任务处理的功能,可以显著提升系统的响应速度和性能。本文将深入探讨在Spring中如何利用多线程和动态任务来实现异步处理,并分享一些实践心得。...

    Spring3.2异步处理http请求

    Spring提供了支持异步方法的日志记录,并通过`@Transactional`注解实现事务管理,但需要注意的是,事务管理默认只对同步方法有效,对于异步方法,需要额外配置。 ### 7. `@Async`的限制与注意事项 - 异步方法不能...

    tomcat spring jms 异步消息传递入门实例

    本教程将带你逐步了解如何利用Tomcat、Spring和JMS(Java Message Service)构建一个简单的异步消息传递入门实例。 首先,让我们来理解一下核心组件: 1. **Tomcat**:这是一个流行的开源Java Servlet容器,用于...

    基于Spring打造简单高效通用的异步任务处理系统

    在构建一个基于Spring的简单高效通用异步任务处理系统时,我们的主要目标是实现轻量级、简单、高效、通用、高扩展性和高可靠性的解决方案。在这个系统中,我们将利用Spring框架的功能,如Job调度和线程池封装,以及...

    spring mvc ajax异步文件的上传和普通文件上传

    在Spring MVC框架中,文件上传是一项常见的功能,无论是普通的文件上传还是通过Ajax实现的异步文件上传,都为用户提供了更好的交互体验。本篇将详细讲解这两种方式的实现原理及步骤。 首先,让我们来理解一下普通...

    spring的Applicationcontext对事件的监听,实现类似MQ的效果

    在Spring框架中,`ApplicationContext`不仅是一个容器,用于管理Bean的生命周期和依赖注入,它还提供了事件发布和监听的功能。这个特性使得Spring应用能够实现组件间的异步通信,类似于消息队列(MQ)的工作模式。...

    Springboot启用async异步调用

    在Spring Boot中,启用`async`异步调用是一项关键功能,它允许应用程序在处理请求时启动一个后台任务,而不必等待该任务完成。这在处理耗时操作时尤其有用,如大数据计算、发送电子邮件或文件上传等。下面将详细阐述...

    最全的Spring MVC注解例子,异步请求,错误处理

    在这个“最全的Spring MVC注解例子”中,我们将深入探讨Spring MVC的核心注解,以及如何实现异步请求处理和错误管理。 1. **Spring MVC核心注解** - `@Controller`:标记一个类为处理HTTP请求的控制器。这是Spring...

    Spring事件管理

    在Spring框架中,事件管理是一种强大的机制,它允许在应用程序组件之间传递消息,而无需这些组件之间有直接的依赖关系。这种松耦合的方式提高了代码的可维护性和可测试性。接下来,我们将深入探讨Spring事件管理的...

    spring在@Bean注解中initMethod调用方法异步

    总的来说,这个压缩包中的代码片段展示了如何在Spring中利用`@Bean`注解和`initMethod`属性实现异步bean初始化,结合Sofaboot框架,提升应用程序的启动效率和并发性能。通过这些类的设计和交互,我们可以看到Spring...

    Spring Boot 异步请求和异步调用.docx

    Spring Boot 异步请求和异步调用

Global site tag (gtag.js) - Google Analytics