`

bbossgroups 组件方法异步调用

阅读更多
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
0
分享到:
评论
2 楼 yin_bp 2011-05-03  
bbossgroups 3.1已经发布。详情可以访问新闻:
http://www.iteye.com/news/21036-bbossmvc-bbossaop-bbosspesistent-bbosstaglib-bbossevent
sures 写道
期待!!!

1 楼 sures 2011-04-24  
期待!!!

相关推荐

    bbossgroups 3.1SQLExecutor组件ap使用实例

    `SQLExecutor`通过调用相应的插入方法,如`executeInsert()`,执行这个SQL语句,并传入参数列表`beans`。 注意,代码中的注释指出,这些操作都是在特定的连接池中进行的,这意味着SQLExecutor利用了数据库连接池来...

    bbossgroups 开发系列文章之一 最佳实践

    通过依赖注入,可以将数据库访问组件注入到DAO中,使得业务组件可以直接调用DAO方法进行数据操作。 业务组件管理及注入DAO组件是业务逻辑层的核心。业务组件通常包含了复杂的业务规则,它们通过依赖注入的方式获取...

    bbossgroups 3.1培训教程.ppt

    总之,bbossgroups 3.1是一个功能强大且全面的企业级开发框架,它的组件异步调用、MVC地址别名配置、SQL配置管理等功能显著提高了开发效率和系统的灵活性。随着不断的发展和更新,bbossgroups将持续为企业级应用提供...

    bbossgroups 3.0 培训教程

    本教程将围绕bbossgroups 3.0版本,深入讲解其核心概念、使用方法以及最佳实践。 首先,我们要理解bbossgroups的核心设计理念。它基于模块化架构,使得开发者可以根据项目需求选择合适的组件,避免了不必要的性能...

    Bbossgroups体系架构.ppt

    **Bbossgroups体系架构详解** Bbossgroups是一个全面的、开源的企业级应用框架,旨在简化Java开发...开发者可以根据项目的具体需求,灵活选择和组合Bbossgroups提供的各种组件和服务,构建出符合业务场景的高效系统。

    bbossgroups 3.0 发布,国内首款集

    - **远程调用**:轻松实现跨服务调用,降低系统耦合度。 - **高性能通信**:采用高效的序列化协议和传输层协议,提升通信速度。 - **服务治理**:提供服务注册、发现、负载均衡等功能,便于管理微服务架构。 #### ...

    企业级J2EE开源框架bboss

    11. **性能优化**:通过代码优化、异步处理、内存管理等方式,提升系统运行效率。 12. **文档生成**:支持API文档自动生成,方便开发者理解和使用。 BBoss框架的最新版本bbossgroups-bboss-389b83a可能包含了对...

    2013年度中国优秀开源项目列表

    12. bboss:bbossgroups是首个集成AOP、MVC、持久层、JSP标签库、分布式RPC服务和序列化组件的JavaEE企业级开发框架。 13. BeeFramework:BeeFramework是iOS平台的快速开发框架,特点包括易学易用、组件丰富,提供...

    bboss mvc 通过jsonp实现跨站跨域远程访问

    JSONP是一种规避同源策略的方法,它的工作原理是通过在HTML中动态插入`&lt;script&gt;`标签,其`src`属性指向服务端提供的URL,该URL返回的是一个JavaScript函数调用,并将数据作为参数传递。由于`&lt;script&gt;`标签不受同源...

    基于Java和Shell的bboss session framework跨域集群节点会话共享与监控设计源码

    该框架包含222个文件,包括164个Java源文件、14个XML配置文件、6个Gradle构建文件、6个JAR包文件、6个属性文件等,旨在支持跨域应用集群节点的会话共享与监控,并提供示例站点http://session.bbossgroups.com/...

    bboss-elastic-tran:bboss 数据同步工具

    弹性Tran老板数据交换模块使用文档: : Bboss是一个很好的Elasticsearch Java Rest客户端。 它运行并访问像mybatis这样的... 首先将BBoss的maven依赖项添加到pom.xml中: &lt; dependency&gt; &lt; groupId&gt;com.bbossgroups.p

    java版地图源码-bboss-elasticsearch:最好的elasticsearch高级javarest客户端api-----bbos

    java版地图源码弹性搜索Bboss Bboss 是一个很好的 elasticsearch Java rest 客户端。 它以类似于mybatis的方式操作和访问elasticsearch。 环保要求 JDK 要求:JDK 1.7+ Elasticsearch ...&gt;com.bbossgroups.p

Global site tag (gtag.js) - Google Analytics