Gearman使用示例

最近的一个旧项目重构过程中,使用到了gearman这个开源项目,简单来讲,这是一个类似MQ的异步系统,一边派发任务,一边处理任务(有类似MQ中的消息发送方与接收方),目前支持java,php等多种语言,缺点是存在单点问题(server的HA官方没有提供方案,需要二次开发)。

官网地址:http://www.gearman.org

下面是java语言的示例:

注:gearman的java客户端实例有好几个版本,不同的版本之间相差巨大,建议使用官方推荐的最新版,地址为https://github.com/gearman/java-service

一、spring配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5
 6     <bean id="gearmanImpl" class="org.gearman.impl.GearmanImpl"></bean>
 7
 8     <bean id="gearmanServer" class="org.gearman.impl.server.remote.GearmanServerRemote">
 9         <constructor-arg index="0" ref="gearmanImpl"/>
10         <constructor-arg index="1">
11             <bean class="java.net.InetSocketAddress">
12                 <constructor-arg index="0" value="localhost"/>
13                 <constructor-arg index="1" value="4730"/>
14             </bean>
15         </constructor-arg>
16     </bean>
17
18     <bean id="gearmanClient" class="org.gearman.impl.client.ClientImpl">
19         <constructor-arg index="0" ref="gearmanImpl"/>
20     </bean>
21
22     <bean id="gearmanWorker" class="org.gearman.impl.worker.GearmanWorkerImpl">
23         <constructor-arg index="0" ref="gearmanImpl"/>
24     </bean>
25
26
27 </beans>

二、任务发送方(也称Client)

import org.gearman.GearmanJobEvent;
import org.gearman.GearmanJobReturn;
import org.gearman.GearmanServer;
import org.gearman.impl.client.ClientImpl;
import org.gearman.impl.server.remote.GearmanServerRemote;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.UnsupportedEncodingException;

/**
 * Created by 菩提树下的杨过 on 6/12/16.
 */
public class DemoClient {

    public static void main(String[] args) throws InterruptedException, UnsupportedEncodingException {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring-gearman-test.xml");
        GearmanServer gearmanServer = ctx.getBean(GearmanServerRemote.class);
        ClientImpl client = ctx.getBean(ClientImpl.class);
        client.addServer(gearmanServer);
        client.submitBackgroundJob("demoTask", "jimmy1".getBytes());//asynchronous commit

        GearmanJobReturn jobReturn = client.submitJob("demoTask", "jimmy2".getBytes());//synchronous commit

        while (!jobReturn.isEOF()) {
            //next job event
            GearmanJobEvent event = jobReturn.poll();
            switch (event.getEventType()) {
                case GEARMAN_JOB_SUCCESS:     //job execute success
                    System.out.println(new String(event.getData(), "utf-8"));
                    break;
                case GEARMAN_SUBMIT_FAIL:     //job submit fail
                case GEARMAN_JOB_FAIL:        //job execute fail
                    System.err.println(event.getEventType() + ": "
                            + new String(event.getData(), "utf-8"));
                default:
            }
        }
        client.shutdown();

    }

}

  

三、任务处理方(也称Worker)

import org.gearman.GearmanFunction;
import org.gearman.GearmanFunctionCallback;
import org.gearman.GearmanServer;
import org.gearman.GearmanWorker;
import org.gearman.impl.server.remote.GearmanServerRemote;
import org.gearman.impl.worker.GearmanWorkerImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DemoWorker implements GearmanFunction {

    public static void main(String[] args) throws InterruptedException {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring-gearman-test.xml");
        GearmanServer gearmanServer = ctx.getBean(GearmanServerRemote.class);
        GearmanWorker worker = ctx.getBean(GearmanWorkerImpl.class);
        worker.addFunction("demoTask", new DemoWorker());
        worker.addServer(gearmanServer);
    }

    @Override
    public byte[] work(String function, byte[] data, GearmanFunctionCallback callback) throws Exception {
        if (data != null) {
            String param = new String(data);
            System.out.println("demoWorker => param :" + param);
            return ("return value:" + param).getBytes("utf-8");
        } else {
            return "not receive data!".getBytes("utf-8");
        }
    }
}

  

时间: 2024-12-21 01:05:42

Gearman使用示例的相关文章

分布式计算之异步计算(Gearman示例)

1.异步计算 分布式计算听起来有点高大上,如果说异步计算,估计了解的人多了.我们在日常的工作和生活中,一般都能遇到或者用到异步计算. 比如年底要做很多的报表,领导把需要的报表安排下来,我和我的团队去做统计.为了不耽误领导的时间,不需要领导站在我们屁股后面亲自督战.对领导来说,这个就是一个简单的异步计算模型了. 我们的团队在统计的时候,数据量很多,系统要运行很久,我们也没必要一直看进度条转圈圈,可以去做一下别的工作,或者吃点零食,这个也是异步计算. 负责统计的系统,也没有必要一直转圈圈,把任务在后

用Gearman分发PHP应用程序的工作负载

文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/518 尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面.如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应.实际上,将一个计算密集型的或专门化的功能放在一个或多个独立的专用服务器上运行,效果会更好. 常用的缩略词 API:应用程序编程接口 HTTP:超文本传输协议 LAMP:Linux.Apa

并发利器 Gearman (一) 尝试

PHP 没有提供直接的并发功能.要实现并发,必须: function asyn_send(){ $fp = fsockopen('localhost', 80, &$errno, &$errstr, 5); if(!$fp){ echo "$errstr ($errno)/n"; } fputs($fp, "GET /sync.php?param=1&param2=2&a=c/r/n"); fclose($fp); } 要不然, PH

用 Gearman 分发 PHP 应用程序的工作负载

尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面.如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应.实际上,将一个计算密集型的或专门化的功能放在一个或多个独立的专用服务器上运行,效果会更好. PHP 的 Gearman 库能把工作分发给一组机器.Gearman 会对作业进行排队并少量分派作业,而将那些复杂的任务分发给为此任务预留的机器.这个库对 Perl.Ruby.C.Python 及 PHP 开发

gearman(异步计算)学习

Gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调 用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本.PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档. 2Gearman架构中的三个角色 client:请求的发起者,工作任务的需求方(可以是C.PHP.Java.Perl.Mysql ud

gearman知识文章

一篇文章: Gearman介绍.调研.测试与原理分析 gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本.PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档. gearman架构中的三个角色 client:请求的发起者,工作任务的需求方(可以

分布式的任务分发框架-Gearman

官方文档:http://gearman.org/getting-started/ 安装方法和示例都有,可以详细看一下. Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成.Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面. Gearman可以做什么 异步处

php异步任务处理: gearman

Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡 准备软件包 gearmand-1.1.12.tar.gz gearman-1.1.1.tgz  php扩展 安装支持组件 yum -y install boost-devel* gperf* libevent-devel* libuuid-devel* ./configure make make install ldconfig 安装gearman tar xf gearma

Gearman介绍、原理分析、实践改进

gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本.PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档. gearman架构中的三个角色 client:请求的发起者,工作任务的需求方(可以是C.PHP.Java.Perl.Mysql udf等