bbossgroups 组件方法异步调用

简介: bbossgroups-3.1 支持组件方法异步调用,本文介绍一下aop框架中的组件方法异步调用功能的特性,提供了对组件方法异步执行的几乎所有模式。 1.异步机制 Bbossgroup 3.1版本中新增了组件异步调用功能,大致的机制如下: 是否需要返回调用结果,默认不返回,主线程继续往前走...
bbossgroups-3.1 支持组件方法异步调用,本文介绍一下aop框架中的组件方法异步调用功能的特性,提供了对组件方法异步执行的几乎所有模式。
1.异步机制
Bbossgroup 3.1版本中新增了组件异步调用功能,大致的机制如下:
是否需要返回调用结果,默认不返回,主线程继续往前走(真正的异步)
如果需要返回则,根据timeout和callback两个参数来决定
返回结果的等待处理模式:
当timeout > 0 则等待特定的时间来来获取结果,超过指定的时间后就抛超时异常,等待超时的模式又分为两种情况:
如果指定了回调函数,不阻塞主程序,将结果交给回调函数来处理
如果没有指定回调函数则阻塞主程序,将结果交给主程序来处理
当timeout <= 0 时,则永久等待结果,直到结果返回,这种模式也分两种情况:
如果指定了回调函数 则不阻塞主程序,
如果没有指定回调函数,则阻塞主程序,直到结果返回来
2.六种异步模式
模式一 纯异步模式-不需要等待返回结果,不需要回调的异步模式,不阻塞主调程序
对应方法的Async注解使用方式为:
@Async
	public String testHelloworld(String message) {
		
		System.out.println(message);
		return "testHelloworld:"+message;
		
	}

模式二 等待超时的异步模式-不需要等待返回结果,不需要回调,但是指定了异步执行超时时间的异步模式,不阻塞主调程序
对应方法的Async注解使用方式为:
@Async(timeout=5000)
	public String testHelloworld0(String message) {
		
		System.out.println(message);
		return "testHelloworld:"+message;
		
	}

模式三 等待结果的异步模式-方法异步执行,但是调用方会一直等待执行结果,阻塞主调程序
对应方法的Async注解使用方式为:
@Async(result=Result.YES)
	public String testHelloworld3(String message) {
		
		System.out.println(message);
		return "testHelloworld3:"+message;
	}

模式四 超时等待结果的异步模式-方法异步执行,但是调用方会一直等待执行结果,直到超过指定时间,抛出TimeoutException,阻塞主调程序
对应方法的Async注解使用方式为:
	@Async(timeout=5000,result=Result.YES)
	public String testHelloworld1(String message) {
		
		System.out.println(message);
		return "testHelloworld1:"+message;
		
	}

模式五 执行结果交给回调处理函数的异步处理模式,不阻塞主调程序
对应方法的Async注解使用方式为:
@Async(result=Result.YES,callback="asyn.AsynbeanCallBackTest")
	public String testHelloworld4(String message) {
		
		System.out.println(message);
		return "testHelloworld4:"+message;
		
	}

模式六 执行结果交给回调处理函数的超时异步处理模式,不阻塞主调程序
对应方法的Async注解使用方式为:
@Async(timeout=5000,result=Result.YES,callback="asyn.AsynbeanCallBackTest")
	public String testHelloworld2(String message) {
		
		System.out.println(message);
		return "testHelloworld2:"+message;
		
	}

3.组件异步方法注解
org.frameworkset.spi.async.annotation. Async
其作用就是标识需要异步执行的方法以及设定异步执行的相关参数。
可以指定以下属性:
timeout:指定结果等待调用超时时间,默认为-1(不用超时),只有
Callback:指定异步调用结果处理回调组件名字
Result:异步调用时是否需要将结果返回给主调程序或者是交个回调函数处理结果

4 异步回调接口
package org.frameworkset.spi.async;
public interface CallBack<T> {
	public void handleResult(T result);
	public void handleError(Throwable result);
}

5 异步组件实现
/*
 *  Copyright 2008 biaoping.yin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.frameworkset.spi.asyn;

import org.frameworkset.spi.async.annotation.Async;
import org.frameworkset.spi.async.annotation.Result;

/**
 * <p>Title: AsynbeanTest.java</p> 
 * <p>Description: </p>
 * <p>bboss workgroup</p>
 * <p>Copyright (c) 2007</p>
 * @Date 2011-4-20 下午05:18:54
 * @author biaoping.yin
 * @version 1.0
 */
public class AsynbeanTest {
	@Async
	public String testHelloworld(String message) {
		
		System.out.println(message);
		return "testHelloworld:"+message;
		
	}
	
	/**
	 * 5秒超时,但是不返回结果,也不指定回调函数(这种模式没有实际意义,只是在调用的时候超过5秒
	 * 后给出超时异常)
	 * @param message
	 * @return
	 */
	@Async(timeout=5000)
	public String testHelloworld0(String message) {
		
		System.out.println(message);
		return "testHelloworld:"+message;
		
	}
	
	/**
	 * 需要返回结果,等10秒超时
	 * @param message
	 */
	@Async(timeout=5000,result=Result.YES)
	public String testHelloworld1(String message) {
		
		System.out.println(message);
		return "testHelloworld1:"+message;
		
	}
	@Async(timeout=5000,result=Result.YES,callback="asyn.AsynbeanCallBackTest")
	public String testHelloworld2(String message) {
		
		System.out.println(message);
		return "testHelloworld2:"+message;
		
	}
	
	
	@Async(result=Result.YES)
	public String testHelloworld3(String message) {
		
		System.out.println(message);
		return "testHelloworld3:"+message;
	}
	
	
	@Async(result=Result.YES,callback="asyn.AsynbeanCallBackTest")
	public String testHelloworld4(String message) {
		
		System.out.println(message);
		return "testHelloworld4:"+message;
		
	}

}


6 异步回调组件定义
/*
 *  Copyright 2008 biaoping.yin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.frameworkset.spi.asyn;

import org.frameworkset.spi.async.CallBack;

/**
 * <p>Title: AsynbeanCallBackTest.java</p> 
 * <p>Description: </p>
 * <p>bboss workgroup</p>
 * <p>Copyright (c) 2007</p>
 * @Date 2011-4-21 下午06:39:52
 * @author biaoping.yin
 * @version 1.0
 */
public class AsynbeanCallBackTest implements CallBack {

	public void handleResult(Object result) {
		System.out.println(result);
		
	}

	public void handleError(Throwable result) {
		result.printStackTrace();
		
	}

}


7 异步组件和回调组件配置
<properties>
		<!-- 
			异步调用处理服务组件
		 -->
		<property name="asyn.AsynbeanTest" 
					      class="org.frameworkset.spi.asyn.AsynbeanTest"/>
		<property name="asyn.AsynbeanCallBackTest" 
					      class="org.frameworkset.spi.asyn.AsynbeanCallBackTest"/>						
</properties>

8 异步组件测试用例
/*
 *  Copyright 2008 biaoping.yin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.frameworkset.spi.asyn;

import org.frameworkset.spi.ApplicationContext;
import org.junit.Before;
import org.junit.Test;

/**
 * <p>Title: TestRun.java</p> 
 * <p>Description: </p>
 * <p>bboss workgroup</p>
 * <p>Copyright (c) 2007</p>
 * @Date 2011-4-21 下午06:46:37
 * @author biaoping.yin
 * @version 1.0
 */
public class TestRun {
	private ApplicationContext context ;
	@Before
	public void init()
	{
		context = ApplicationContext.getApplicationContext("org/frameworkset/spi/asyn/asyn.xml");
	}
	@Test
	public void testAsync()
	{
		AsynbeanTest test = (AsynbeanTest)context.getBeanObject("asyn.AsynbeanTest");
		for(int i = 0; i < 10 ; i++)
			test.testHelloworld("Async call.");
		System.out.println("runned.");
	}
	
	
	@Test
	public void testTimeout5000WithResult()
	{
		AsynbeanTest test = (AsynbeanTest)context.getBeanObject("asyn.AsynbeanTest");
		System.out.println(test.testHelloworld1("Async call Timeout 5000ms with Result."));
		System.out.println("runned.");
	}
	
	@Test
	public void testTimeout5000NoResult()
	{
		AsynbeanTest test = (AsynbeanTest)context.getBeanObject("asyn.AsynbeanTest");
		System.out.println(test.testHelloworld0("Async call Timeout 5000ms No Result."));
		System.out.println("runned.");
	}
	
	@Test
	public void testTimeout5000WithCallBackService()
	{
		AsynbeanTest test = (AsynbeanTest)context.getBeanObject("asyn.AsynbeanTest");
		System.out.println(test.testHelloworld2("Async call Timeout 5000 With CallBackService."));
		System.out.println("runned.");
	}
	@Test
	public void testWithCallBackService()
	{
		AsynbeanTest test = (AsynbeanTest)context.getBeanObject("asyn.AsynbeanTest");
		System.out.println(test.testHelloworld4("Async call With CallBackService."));
		System.out.println("runned.");
	}
	
	@Test
	public void testResult()
	{
		AsynbeanTest test = (AsynbeanTest)context.getBeanObject("asyn.AsynbeanTest");
		System.out.println(test.testHelloworld3("call With"));
		System.out.println("runned.");
	}
	
	
	

}



目录
相关文章
|
2月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
185 0
|
7月前
|
Java Spring
SpringBoot+async异步调用接口以及几个任务同时完成和异步接口实现和调用
SpringBoot+async异步调用接口以及几个任务同时完成和异步接口实现和调用
139 0
|
7月前
|
监控 Java
【十一】springboot整合异步调用并获取返回值
【十一】springboot整合异步调用并获取返回值
150 0
|
前端开发 Java 测试技术
SpringBoot-27- @Async实现异步调用 什么是异步调用
异步调用是相对于同步调用的,同步调用是按照顺序进行执行任务,只有上一个任务执行完成下一个任务才能执行,异步调用是指在按照顺序执行任务的过程中不需要等待任务结果的出现,就可以顺序执行下一个任务。
95 0
|
安全 Java UED
SpringBoot 如何使用 @Async 注解处理异步事件
SpringBoot 如何使用 @Async 注解处理异步事件
|
JSON NoSQL 前端开发
SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件
SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件
SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件
CTK框架 - 通信 - 插件服务注册和调用
接口就是虚函数(也可以是纯虚函数),也就是最终的服务的前身。 接口对外暴露功能,比如我们给之前写的mainwindow 加一个界面类,并且对外暴露一个popWindow()的接口
140 0
|
Java 测试技术 Spring
@Async注解 -- 异步调用的万金油
@Async注解 -- 异步调用几乎是处理高并发Web应用性能问题的万金油.那么什么是“异步调用”?“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。
88 1
|
Java Spring 容器
Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析
Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析
126 0
|
Java fastjson Maven
Android组件化开发(二)--网络请求组件封装
前面一篇文章我们讲解了`maven私服`的搭建,maven私服在`组件化框架`中有一个很重要的地位就是可以将我们的`lib`库放到局域网中,供公司其他开发者使用,实现类库的分享。 下面是这个系列准备实现的一个`组件化实战项目框架`: