Gearman框架下java+php通信

原创 2013年12月05日 11:04:46

在上一篇博客中,安装好Gearman和php客户端后,现在尝试下跨语言通信。

注:Gearman最强悍的地方就是它可以支持不同语言直接的交互,client端是一种语言,worker端可以是另外一种语言!中间的交互具体转化细节都封装在jobserver中处理。

这里演示的例子是:官网上面的字符串反转。

worker.php + client.java或

worker.java + client.php

1. 环境:JDK1.7.0_25

所需jar包:java-gearman-service-0.6.6.jar, slf4j-api-1.6.4.jar, slf4j-simple-1.6.4.jar。可以直接到网上去下载。

2.代码:

Java语言

client端代码:

package com.gearman.demo;

import org.gearman.Gearman;

import org.gearman.GearmanClient;

import org.gearman.GearmanJobEvent;
import org.gearman.GearmanJobReturn;
import org.gearman.GearmanServer;

public class EchoClient {

public static void main(String... args) throws InterruptedException {

// 创建一个Gearman实例
Gearman gearman = Gearman.createGearman();

// 创建一个Gearman client
GearmanClient client = gearman.createGearmanClient();

/*
* 创建一个jobserver

* Parameter 1: job server的IP地址 Parameter 2: job server监听的端口

* job server收到client的job,并将其分发给注册worker
*      &nbsp
* ;       *
*/
GearmanServer server = gearman.createGearmanServer(
EchoWorker.ECHO_HOST, EchoWorker.ECHO_PORT);

// 告诉客户端,提交工作时它可以连接到该服务器
client.addServer(server);
/*
* 向job server提交工作

* Parameter 1: gearman function名字 Parameter 2: 传送给job server和worker的数据

* GearmanJobReturn返回job发热结果
*/
GearmanJobReturn jobReturn = client.submitJob(
EchoWorker.ECHO_FUNCTION_NAME, ("Hello World!").getBytes());

// 遍历作业事件,直到我们打到最后文件
while (!jobReturn.isEOF()) {
// 下一个作业事件
GearmanJobEvent event = jobReturn.poll();
switch (event.getEventType()) {
case GEARMAN_JOB_SUCCESS: // job执行成功
System.out.println(new String(event.getData()));
break;
case GEARMAN_SUBMIT_FAIL: // job提交失败
case GEARMAN_JOB_FAIL: // job执行失败
System.err.println(event.getEventType() + ": "
+ new String(event.getData()));
default:
}
}
// 关闭
gearman.shutdown();
}
}

worker端代码:

package com.gearman.demo;

import org.gearman.Gearman;
import org.gearman.GearmanFunction;
import org.gearman.GearmanFunctionCallback;
import org.gearman.GearmanServer;
import org.gearman.GearmanWorker;

public class EchoWorker implements GearmanFunction {
// function name
public static final String ECHO_FUNCTION_NAME = "reverse";
// job server地址
public static final String ECHO_HOST = "10.10.115.23";
// job server监听的端口
public static final int ECHO_PORT = 4730;

public static void main(String... args) {

// 创建一个Gearman实例
Gearman gearman = Gearman.createGearman();

/*
* 创建一个jobserver

* Parameter 1: job server的IP地址 Parameter 2: job server监听的端口

* job server收到client的job,并将其分发给注册worker
*      &nbsp
* ;       *
*/
GearmanServer server = gearman.createGearmanServer(
EchoWorker.ECHO_HOST, EchoWorker.ECHO_PORT);

// 创建一个Gearman的worker
GearmanWorker worker = gearman.createGearmanWorker();
// 告诉工人如何执行工作(主要实现了GearmanFunction接口)
worker.addFunction(EchoWorker.ECHO_FUNCTION_NAME, new EchoWorker());
// worker连接服务器
worker.addServer(server);
}


@Override
public byte[] work(String function, byte[] data,
GearmanFunctionCallback callback) throws Exception {
// work方法实现了GearmanFunction接口中的work方法,本实例中进行了字符串的反写
if (data != null) {
String str = new String(data);
StringBuffer sb = new StringBuffer(str);
return sb.reverse().toString().getBytes();
} else {
return "未接收到data".getBytes();
}
}
}

*ECHO_HOST = "192.168.125.131"为安装了Gearman并开启geramand服务的主机地址
 *int ECHO_PORT = 4730默认端口为4730

出现问题:log4j:WARN Please initialize the log4j system properly.
原因是没有对log4j这个jar进行文件配置。
将log4j.properties文件放在src目录下就可以了。
例如log4j.properties文件内容如下:
log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=firestorm.log

log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.com.codefutures=DEBUG

如果不行,就放在class所在目录就OK了!


PHP语言

client端:

<?php
$client = new GearmanClient();
$client->addServer();
print $client->do("reverse","Hello World!");
print "\n";
?>

worker端:

<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse","my_reverse_function");
echo "Starting worker ...";
while($worker->work());


function my_reverse_function($job)
{
return strrev($job->workload());
}
?>


3.测试

注:这里我将php文件放在:/home/user/projects/ 文件夹下,另外,*.java的文件在eclipse中新建的工程里面。

前提确保gearman正确安装,并正在运行。可以参考我的上一篇博客。

测试1:worker.php + EchoClient.java

$php worker.php 

然后,再在eclipse中运行:EchoClient.java

eclipse console输出结果:

 INFO - [10.10.115.23:4730] : Connected
 INFO - [10.10.115.23:4730] : OUT : SUBMIT_JOB
 INFO - [10.10.115.23:4730] : IN : JOB_CREATED
 INFO - [10.10.115.23:4730] : IN : WORK_COMPLETE
!dlroW olleH
 INFO - [10.10.115.23:4730] : Disconnected

运行成功!!

测试2:EchoWorker.java + client.php

先在eclipse中运行,EchoWorker.java

然后,再在命令行下输入:php client.php

命令行下输出结果:

!dlroW olleH

运行成功!!

至此,对Gearman的初步学习完成,现在开始研究Gearman的源码!


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

分布式任务分发框架Gearman教程和PHP实现实例

1、Gearman介绍和使用场景 Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能。它的任务分布非常简单,简单得可以只需要用脚本即可完...
  • clh604
  • clh604
  • 2014-02-22 22:19
  • 13694

java-gearman-service jar

  • 2016-07-12 11:16
  • 188KB
  • 下载

CentOS 安装Gearman及其PHP扩展

一、简介 Gearman是一个分发任务的程序架构,由三部分组成: Gearman client:提供gearman client API给应用程序调用。API可以使用C,PHP,PERL,MYSQL ...

尝试用Gearman实现分布式处理(PHP)

本文需要你已对Gearman有个大致了解。 顺便再推荐两篇参考文章 http://hi.baidu.com/thinkinginlamp/blog/item/ff49972b9e7378f3e...

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

尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面。如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应。实...

Gearman分布式远程过程处理框架

官方主页: http://www.danga.com/gearman/ http://gearman.org/ Gearman简介 Gearman是 Brad Fitzpa...

PHP使用gearman扩展完成异步任务总结

PHP的gearman扩展,可以在Linux服务器上,实现PHP脚本的异步任务,甚至是分布式异步任务。在项目中一些响应慢,或者是占用时间的PHP脚本,可以用异步任务去完成,用户访问时不用等待漫长的队列...

gearman-安装php扩展

项目需要一个调度模块,对定时任务、条件触发任务(例如按照流量)进行调度。我的设计是:一个扫描器定期扫描数据库里的未开始任务,将任务逐一发给gearman,gearman分发给workers,worke...

在CentOS release 5.6上安装gearman及php扩展错误记录

之前在较新版本的CentOS上安装gearman没有发现什么问题,但这次是在公司开发服上安装gearman,由于使用CentOS release 5.6版本,较旧,导致出现很多问题,今天仅仅把错误记录...

Centos下 Gearman安装与php扩展安装

安装依赖包 yum install -y boost-devel gperf libevent-devel libuuid-devel 安装 gearmandwget https://launch...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)