将社交网络集成到 BPM,第 1 部分: 收集 Twitter 数据

来源:互联网 发布:linux http server 编辑:程序博客网 时间:2024/06/05 19:56

鉴于诸如 Twitter 和 Facebook 这类社交网络网站商业价值的增加,各类企业都希望使用简单快捷的方法将社交网络集成到他们的业务流程中。一个有效的方法就是使用 BPM 工具,它具有很强的将外部应用程序集成到业务工作流的能力。

这个两部分系列文章展示了如何使用开源 BPM 工具 Bonita 为一个公司(只是假设)构建社交媒体搜索应用程序。该应用程序包含一个可以与外部应用程序无缝集成的业务流程。它可以让用户通过关键词搜索来收集社交网站中的业务相关数据,然后点击一个按钮将其中的一些数据添加到 CRM 系统。第 1 部分描述了应用程序的用户界面和架构,然后通过配置 Bonita 获取并将 Twitter 数据显示在一个业务流程中。第 2 部分完成了应用程序与公司 CRM 系统的整合。

练习:运行 IBM 的 BPM

IBM 的 BPM 提供了端到端的流程可见性和控制,这对于企业在当今不断变化的商业环境中生存并发展是至关重要的。使用 IBM BPM in action exercise 在可视的、无需编码的环境中建模并运行业务流程。

本文应用程序的源代码可供 下载。按照本文的步骤逐步操作,操作前先下载并安装 Bonita 和 Twitter4J。(见 参考资料 获取下载链接)。我使用 version 5.4 和 Twitter4J version 2.1.12 来开发应用程序。

应用程序概述

通过 Bonita 流程配置将整个的应用程序开发成一个业务流程。一个简单的 UI 可以使用户搜索 Twitter 中的业务数据并显示满足搜索条件的信息(tweets)。用户可以从搜索结果中选一条感兴趣的 tweet 并获取发布这条消息的 Twitter 用户资料。在开源 CRM 系统 SugarCRM 中,搜索应用程序还允许用户添加这个 Twitter 用户为潜在联系人。

用户界面

搜索应用程序的 UI 由三个简单表单构成,我已经使用 Bonita 的表单设计器实现了它们。第一个表单呈现两个 UI 组件:一个 Search Keyword文本框和一个 Search 按钮,如图 1 所示:

图 1. Search Tweets 表单
Bonita 中的 Search Tweets 表单截图

Bonita 的表单设计器功能非常强大,提供了用于表单设计的图形组件并允许您链接其他表单的用户操作或配置屏幕的后台活动。例如,Bonita 允许您配置 图 1 中的 Search 按钮来连接到后台查找相关 tweet 的搜索活动

用户输入搜索词并点击 Search 按钮后,控制转移到 Bonita 的业务流程引擎。该引擎在后台工作以获取包含搜索关键词的 tweet。Bonita 显示了它在第二个 UI 表单中找到的信息,如图 2 所示:

图 2. 显示 Twitter 信息的表单
显示 twitter 信息的 Bonita UI 表单截图

用户可以选择任何一条消息并点击 View Profile 按钮。控制再一次被传递到 Bonita 的流程引擎,在后台获取发送这条 tweet 的 Twitter 用户资料数据。Twitter 用户的资料显示在第三个 UI 表单中,如图 3 所示:

图 3. 用户资料表单
显示 Twitter 用户资料的 Bonita 表单截图

用户可以点击第三个 UI 表单中的 Add to CRM 按钮将 Twitter 用户添加到 SugarCRM 中的业务联系中。Bonita 的流程引擎与 SugarCRM 的无缝连接使这成为可能。

应用程序架构

像 Bonita 这样的 BPM 工具具有集成各种应用程序的灵活性。Bonita 的灵活性来自它的流程引擎和连接器框架。我将描述应用程序的架构来说明流程引擎和连接器框架是如何与其它组件一起工作的。图 4 是这个架构的简图:

图 4. 搜索应用程序架构
图 4. 搜索应用程序架构简图

在 图 4 中可以看到搜索应用程序由几个主要组件构成:

  • 用户界面
  • 流程变量
  • Bonita 流程引擎
  • Bonita 连接器框架
  • Twitter4J
  • SugarCRM API

我已经介绍过 UI 了,接下来将讨论一下 图 4 中展示的其它文本框:

  • 流程变量:Bonita 使用流程变量来存储应用程序数据,包括应用程序级变量和局部临时变量。Bonita 提供了一个 GUI,它可以根据您应用程序的业务逻辑来配置变量,并且可以基于流程变量来评估数学及逻辑表达式。
  • Bonita 流程引擎:Bonita 的流程引擎可以协调发生在不同应用程序组件的所有活动。起初,流程引擎识别显示给应用程序用户的 UI 表单。用户输入搜索关键字后,流程引擎处理应用程序流并允许流程变量捕获用户的输入。可以说流程引擎根据整个应用程序执行过程中的业务逻辑来管理流程的生命周期。
  • Bonita 连接器框架:连接器框架是 Bonita 与外部应用程序集成的扩展机制。您可以使用框架来构建自定义连接器。在 图 4 中可以看到连接器框架文本框包含三个连接:TwitterSearchConnectorTwitterUserProfileConnector 和 SugarCRMAddContactConnector,它们都是由连接器框架构建的。每个连接完成一个特定的任务。例如,TwitterSearchConnector 作为搜索 Twitter 上有趣信息的搜索引擎。
  • Twitter4J:Twitter4J 过 Internet 连接到 Twitter Web 服务,这使得客户端应用程序(比如搜索应用程序)可以与 Twitter Web 服务进行交互。Twitter4J 是一个开源的 Java API ,这使它很容易地和 Twitter Web 服务一起工作。(见 参考资料)。 TwitterSearchConnector 将 Twitter4J 包装在 Bonita 的连接器框架内,这使 Bonita 能够与 Twitter Web 服务一起开始工作。(在本文的 执行 TwitterSearchConnector 类 部分您将了解到这是怎样完成的)。
  • SugarCRM API:我将在第 2 部分探讨这个组件。

接下来我将介绍搜索应用程序的组件如何协同工作。

组件交互序列

图 5 显示了业务用户使用搜索应用程序与 Twitter Web 服务交互时产生的事件序列:

图 5. 搜索应用程序中的事件序列
显示了在搜索应用程序中的事件序列
  1. 用户在第一个 UI 表单中输入关键字(图 1)然后点击 Search 按钮。
  2. Bonita 的流程引擎接收搜索关键字并将它存储在一个流程变量中。
  3. Bonita 的流程引擎调用 TwitterSearchConnector
  4. TwitterSearchConnector 使用 Twitter4J 将自己与 Twitter Web 服务进行验证并向它发送一个包含搜索关键字的搜索查询。
  5. Twitter Web 服务接收到搜索查询,在 Twitter 上执行实际的搜索操作,然后将相关信息返回 TwitterSearchConnector
  6. TwitterSearchConnector 接收搜索结果并将结果传递给 Bonita 的流程引擎。
  7. Bonita 的流程引擎使用搜索结果填充流程变量。之后它会识别出序列中的下一个任务并将控制传递给搜索结果表单(图 2)。
  8. 搜索结果 UI 表单从流程变量中获取结果并将信息显示给用户。

搜索序列以同样的方式继续从第二个 UI 表单(图 2)到用户资料表单(图 3)进行搜索。如果用户选择了显示在第二个表单中的一条 tweet,并点击 View Profile 按钮,流程引擎将调用 TwitterUserProfileConnector 获取发布这条 tweet 的用户资料。类似的,如果用户想要将 Twitter 用户的联系信息添加到 SugarCRM(通过点击 Add to CRM 按钮),流程引擎会调用 SugarCRM 连接器依次将联系信息添加到 CRM 系统。

从事件序列中可以看出 Bonita 的流程引擎在调节搜索应用程序所有活动的过程中起中心作用。因此,开发 Bonita 中的搜索应用程序包括告诉 Bonita 浏览引擎每一步必须做什么。在 Bonita 中这称之为配置业务流程 。本文其余部分介绍了如何开始配置搜索应用程序。

配置搜索应用程序

您将要完成的应用程序配置任务如下:

  1. 创建一个 Twitter 帐户。
  2. 使用 Twitter Web 服务注册应用程序并获得安全认证证书。
  3. 设计并配置 TwitterSearchConnector
  4. 在 Bonita 中配置应用程序的其他组件(在第 2 部分中完成)。

第一步,创建一个 Twitter 帐户,这比创建 email 帐户要简单的多。搜索应用程序将作为 Twitter Web 服务的一个客户端。为了本文需要,我创建一个名为 searchMessages 的 Twitter 帐户。如果您想自己执行配置步骤,现在登陆 https://twitter.com/signup 并创建您自己的帐户。

使用 Twitter 注册应用程序并获得安全证书

使用 Twitter Web 服务注册应用程序,您可以得到两对密钥:

  • 一个是 consumer key 和一个 consumer secret,代表客户端应用程序: 搜索应用程序将用这对密钥来访问您所创建帐户的 Twitter Web 服务。
  • 一个访问令牌和一个访问令牌 secret: 访问令牌与 secret 结合使用来签署搜索应用程序发送到 Twitter Web 服务的请求。

两对密钥背后的安全机制被称为开放式验证(OAuth)协议(见参考资料)。由于 Twitter4J 在后台处理 OAuth,所以您不必担心它是怎样工作的。TwitterSearchConnector 使用 Twitter4J 类。

使用您之前创建的帐户登录到 Twitter 网站(http://www.twitter.com)。在浏览器地址栏输入 https://dev.twitter.com/apps/new 。您将看到 Register an Application 页面,如图 6 所示:

图 6. 在 Twitter 上注册一个应用程序页面
图 6. Twitter 上注册应用程序页面的截图

对页面进行如下填写:

  1. 在标签为 Application Name 的文本框输入 Bonita search client
  2. 键入简短描述(比如在 Description 字段输入 Client that searches for data on Twitter)。
  3. 在 Application Website 字段输入应用程序的 URL。
  4. 为 Application Type 选择 Client 单选按钮。这意味着您的搜索应用程序充当一个 Web 服务客户端。
  5. 为 Default Access Type 选择 Read-only 单选按钮(因为应用程序只需搜索 Twitter 数据,不需要发送任何 Twitter 消息)。

保留 Organization 和 Callback URL 字段为空,并提交已完成的表单。您将获得 Bonita search client Settings 页面,为您提供安全凭证,如图 7 所示:

图 7. Twitter 中的 Bonita 搜索客户端设置页面
图 7. Twitter 中 Bonita 搜索客户端设置页面的截图

记下 consumer key 和 consumer secret,稍后会用到。

要获取第二对密钥(访问令牌和访问令牌 secret),点击 My Access Token 按钮,它在 图 7 中已经被标记出来了。之后访问令牌和它的密钥会显示在另一个 Twitter 页面中, 这个页面名为 Bonita 搜索客户端 Access Token 请求,如图 8 所示:

图 8. Twitter 中 Bonita 搜索客户端的 Access Token 请求页面
图 8. Twitter 中 Bonita 搜索客户端 Access Token 请求页面的截图

记下访问令牌和访问令牌 secret。

现在您已经有了两对密钥,下一步是设计并配置 TwitterSearchConnector

设计和配置 TwitterSearchConnector

在 Bonita 中实现连接主要是配置任务,包含以下步骤:

  1. 提供描述性信息。
  2. 设置连接器的输入和输出参数。
  3. 为连接器生成一个 Java 的代码模板。Bonita 使用 Eclipse 建模框架(EMF)和图形建模框架(GMF)(见 参考资料)来生成连接器模板。这个模板包含 Bonita 连接器框架需要的所有代码,可以让您专注于连接器的业务逻辑。应用程序中惟一需要编写 Java 代码的地方就是使用 Twitter4J 的时侯。

Bonita 几乎为每一个配置步骤都提供了图形化向导。

运行 Bonita。图 9 显示了欢迎页面:

图 9. Bonita 欢迎页面
图 9. Bonita 的欢迎页面

从欢迎页面的菜单中选择 Connector > New connector。(我已经将 Connector 菜单选项标记成红色的,如 图 9。)一个新的 Connector 创建向导出现了,如图 10 所示:

图 10. Connector 创建向导
图 10. Bonita Connector 创建向导的截图

从 图 10 中可以看出 Connector 创建向导被分为上部和下部。上部收集了连接器的描述信息(Connector Id、Description、Category 和显示连接器的 Java 类名称)。下部包含了两个表状的图形部件(Pages 和 Outputs),它们允许您定义输入和输出参数。

在 Connector Id 文本字段中输入 TwitterSearchConnector 和,在 Description 文本字段中输入 Search tweets。然后从 Category 列表中选择 Social。分类字段有助于 Bonita 将连接器进行分类。您可以看到 Bonita 自动使用 Connector Id 字段来填充 Class Name 字段,这就是此连接器的 Java 类名。

点击 Package 字段旁边的 Browse 按钮,为 TwitterSearchConnector 类选择您所选择的包。您还可以为连接器指定一个图标,本文中我没这么做。这样就完成了描述信息。

您提供描述信息之后,图 10 中的向导与图 11 中的非常类似:

图 11. Connector 创建向导,显示 TwitterSearchConnector 描述性信息
图 11. 显示 TwitterSearchConnector 描述性信息的 Bonita Connector 创建向导的截图

现在需要为 TwitterSearchConnector 定义输入参数。

为 TwitterSearchConnector 配置输入参数

利用 Connector 创建向导下部的 Pages 表为 TwitterSearchConnector 配置输入参数。需要注意输入参数是通过 Bonita 传输给TwitterSearchConnector 的。Connector 创建向导允许您将输入参数分组到页面中。这意味着配置业务流程时,您可以从一个页面中传递很多输入参数。当您将连接器添加到第 2 部分的搜索业务流程时,页将会显示出来。

TwitterSearchConnector 需要两对密钥(consumer key、consumer secret、访问令牌以及访问令牌 secret)和在第一个 UI 表单中输入的搜索关键词(图 1)。因此您必需为 TwitterSearchConnector 定义 5 个输入参数:4 个安全认证,当您将 TwitterSearchConnector添加到搜索业务流程时它们是固定的;还有搜索关键词,它是动态的,这意味着用户每次执行搜索都需要提供它。

点击页表右侧的 Create 按钮(在 图 11 中被标记为红色)。这样就打开了新的一页,这页包含为 TwitterSearchConnector 配置输入参数的字段,如图 12 所示:

图 12. 配置输入参数的页面
图 12. 配置输入参数的 Bonita 页面截图

从 图 12 中可以看到输入参数页面包含三个字段:Page Id、Page Title 和 Description。对于输入参数页面,只需在 Page Id 字段内输入TwitterSearchConnectorInputParametersPage,然后在 Page Title 和 Description 字段内输入 Twitter Search Connector Input Parameters Page 即可。

在这三个字段下面有一个 Widgets 表,要求您为每一个输入参数提供 4 个字段。Field 名称是参数的名字,Mandatory 是指参数是强制性的还是选择性的,Widget 指定与这个输入参数相关联的可视化组件,Data 类型字段指定与该参数相关的变量的数据类型。

现在需分别为 5 个输入参数配置 4 个字段。点击 Create 按钮(图 12 中被标记为红色)。Widgets 表中会出现一行,您可以输入consumerKey 作为字段名,Mandatory 列的 Mandatory、Widget 列的 Password 和作为 Data 类型列值的 Text。这 5 个输入参数都使用相同的值,如图 13 所示:

图 13. 配置输入参数的完整页面
图 13. 配置输入参数的完整页面截图,包括您已输入的数据

点击页面底部的 OK 按钮。Bonita 将保存输入参数的设置,返回 图 10 中的连接器创建向导。

配置输出函数

您只需定义一个输出参数,命名为 searchResults,对于 TwitterSearchConnector。点击靠近输出表的 Create 按钮(在 图 11 中被标记为蓝色)。输出表中产生新的一行。可以看出您必须为输出参数中的两列提供数据。在字段名列输入 searchResults。在 Data 类型列,从下拉列表中选择 List。现在 Connector 创建向导中包含了您为输入和输出参数提供的所有配置数据,如图 14 所示:

图 14. 包含输入输出参数配置数据的连接器创建向导
图 14. 包含输入输出参数配置数据的连接器创建向导

点击连接器创建向导中的 Finish 按钮。Bonita 立即产生 TwitterSearchConnector 类输入输出参数的所有代码并在编辑器中显示出来,如图 15 所示:

图 15. TwitterSearchConnector 类的代码模板
图 15. 显示 TwitterSearchConnector 类代码模板的截图

Bonita 将 TwitterSearchConnector 类自动生成的代码保存在 Bonita 安装目录的 X:\BOS-5.4\studio\workspace\local_default_My Extensions\src-connectors\org\bonitasoft\connectors\twitter 文件夹中。(为方便您查看,本文的源代码 download 包含了TwitterSearchConnector.java )。接下来,您将学习怎样处理这些代码。

实现 TwitterSearchConnector 类

清单 1 显示了TwitterSearchConnector 类:

清单 1. Bonita 生成的 TwitterSearchConnector 类
public class TwitterSearchConnector extends ProcessConnector {    private String consumerKey;    private String accessToken;    private String accessTokenSecret;    private String consumerSecret;    private String searchKeyword;    @Override    protected void executeConnector() throws Exception {        // TODO Auto-generated method stub    }    @Override    protected List<ConnectorError> validateValues() {        // TODO Auto-generated method stub        return null;    }    public void setConsumerKey(String consumerKey) {        this.consumerKey = consumerKey;    }    public void setAccessToken(String accessToken) {        this.accessToken = accessToken;    }    public void setSearchKeyword(String searchKeyword) {        this.searchKeyword = searchKeyword;    }    public void setAccessTokenSecret(String accessTokenSecret) {        this.accessTokenSecret = accessTokenSecret;    }    public void setConsumerSecret(String consumerSecret) {        this.consumerSecret = consumerSecret;    }    public List getSearchResults() {        // TODO Add return value for the output here        return null;    }}

如您在 清单 1 中所见,TwitterSearchConnector 扩展了 ProcessConnector 类,它是连接器框架的一部分。ProcessConnector 提供了函数来管理一个连接器的多个实例,该链接器在 Bonita 流程引擎内独立执行线程上运行。

ProcessConnector 类反过来扩展 Connector,这是连接器框架的基础类。它提供处理普通任务的功能,比如输入验证和异常处理。

如果查看 清单 1 中类级变量,您会发现 Bonita 已经声明了5 个变量,与您在 配置 TwitterSearchConnector 输入参数 小节中设置的 5 个输入参数相对应。

您还可以在 配置输出参数 小节设置一个输出变量,但是 Bonita 还没在 TwitterSearchConnector 类中声明输出变量。因此您必须手动添加第 6 个名为 searchResults 的变量来存储连接器输出,如清单 2 中黑体字所示:

清单 2. TwitterSearchConnector 类的类级变量
//Class level variables    private String consumerKey;    private String accessToken;    private String accessTokenSecret;    private String consumerSecret;    private String searchKeyword;//Manually added output variableprivate List<Tweet> searchResults;

现在,在 清单 1 中查看 setter 和 getter 方法。您可以看到 5 个输入参数分别有 setter 方法(setConsumerKey()setConsumerToken()setAccessToken()setAccessTokenSecret() 以及 setSearchString())。还要注意类只有一个名为 getSearchResults() 的 getter 方法。它对应于 searchResults 输出变量。然而,在 清单 1 中getSearchResults() 方法返回值为 null,因此,为了返回 searchResults 输出变量,而不是 null,您必须手动编辑,如清单 3 所示,:

清单 3. 手动编辑 getSearchResults() 方法
//Manually edited form of the getSearchResults()public List<Tweet> getSearchResults() {   return searchResults;}

现在在 清单 1 中查看 executeConnector() 方法。您需要使用 TwitterSearchConnector 的业务逻辑来填充这个空方法。下一小节将介绍怎样使用 Twitter4J 实现该逻辑。

实现 executeConnector() 方法

Bonita 连接器框架的executeConnector() 方法允许您实现连接器业务逻辑。每次当 TwitterSearchConnector 被调用的时候,Bonita 的流程引擎将会调用 executeConnector()方法。清单 4 显示了 executeConnector() 方法:

清单 4. executeConnector() 方法
protected void executeConnector() throws Exception {   //Step1:   Twitter twitter = new TwitterFactory().getInstance();   //Step2:   twitter.setOAuthConsumer(consumerKey, consumerSecret);   twitter.setOAuthAccessToken(new AccessToken(accessToken, accessTokenSecret));      //Step3:   twitter4j.Query query = new twitter4j.Query(searchKeyword);   twitter4j.QueryResult queryResult = null;      //Step4:   try   {      queryResult = twitter.search(query);      searchResults = queryResult.getTweets();   }   catch (TwitterException e) {      System.out.println ("Twitter follow a user exception");      e.printStackTrace();   }}

executeConnector() 方法使用 Twitter4J 来实现业务逻辑。executeConnector() 方法比较简单,包含 4 个步骤:

  1. 在一个名为 TwitterFactory 的工厂类的帮助下,创建一个 Twitter 实例。Twitter 类允许您使用很多有用的 Twitter4J 方法。
  2. 调用 setOAuthConsumer() 和 setOAuthAccessToken() 方法,它们属于 Twitter 类,随着方法调用将验证数据传递给(consumerKeyconsumerSecretaccessToken和 accessTokenSecret) 。Twitter4J 在内部处理授权。
  3. 实例化 Query 和 QueryResult 对象。 Query 对象包装搜索关键词,QueryResult 对象包装搜索结果。
  4. 调用 Twitter 类的 search() 方法,它将获取作为参数 Query 的对象。并返回包装在 QueryResult 对象内的搜索结果。然后从QueryResult 对象中提取信息,通过调用 getTweets() 方法将信息存储在 searchResults 变量中。

尝试单机 TwitterSearchConnector 类

我已将 main() 方法包含在 TwitterSearchConnector 类中,因此在无需运行 Bonita 情况下您可以在单机模式中测试此类的功能。清单 5 显示了 main() 方法:

清单 5. main() 方法,它属于 TwitterSearchConnector 类
public static void main(String args[]) {   //Step1: Instantiate   TwitterSearchConnector twitterSearchConnector =       new TwitterSearchConnector();   //Step2: Provide security information   twitterSearchConnector.setConsumerKey(args[0]);   twitterSearchConnector.setConsumerSecret(args[1]);   twitterSearchConnector.setAccessToken(args[2]);   twitterSearchConnector.setAccessTokenSecret(args[3]);   twitterSearchConnector.setSearchKeyword(args[4]);   //Step3: Search Twitter   try    {       twitterSearchConnector.executeConnector();   }catch (java.lang.Exception e){      e.printStackTrace();   }   List <Tweet> tweets = twitterSearchConnector.getSearchResults();   //Step4: Print Twitter messages   for (int i=0; i<tweets.size(); i++)   {      System.out.println ("User Name: ["+tweets.get(i).getFromUser()+"]");      System.out.println ("Message ["+tweets.get(i).getText() +"/r/n");   }}//main

main() 方法:

  1. 实例化 TwitterSearchConnector 类。
  2. 将所有安全和搜索关键词提供给 TwitterSearchConnector 类。
  3. 调用 executeConnector() 方法。
  4. 在输出控制台打印搜索结果。

您可以使用本文源代码 下载 部分中提供的 SearchTweetsCompile.bat 和 SearchTweetsRun.bat 文件作为一个单机应用程序来编译和运行TwitterSearchConnector 类。SearchTweetsRun.bat 文件中两对密钥是硬编码的。

TwitterSearchConnector 类可以同时使用 Bonita 库和 Twitter4J ,因此 Bonita 下载中的 Bonita-client-5.4.jar 和 Twitter4J 中的 twitter-core-2.1.12.jar 需要在您的类路径中。

图 16 显示了运行 SearchTweetsRun.bat 文件后产生的输出控制台:

图 16. 单机模式下输出控制台的内容
图 16. 在单机模式下运行 TwitterSearchConnector 类时显示输出控制台内容的截图

控制台显示了由搜索关键字 CRM 找出的每条 tweet 的用户名和信息内容。

第 1 部分总结

我已经讨论了搜索应用程序的架构,展示了 Bonita 的流程引擎和连接器框架是怎样互相协作将社交网络的数据集成到业务流程中的。您已经看到了怎样配置 TwitterSearchConnector 并在单机模式中测试 TwitterSearchConnector 类。在第 2 部分中,将向您展示怎样通过配置剩余的连接器来完成应用程序以捕获 Twitter 用户资料并将这些资料集成到 SugarCRM。之后应用程序将综合说明如何使用各种外部应用程序来集成运行在 Bonita 中的业务流程。

0 0
原创粉丝点击