`

JAVA应用中集成SF的chatter功能及开发步骤

阅读更多
项目中,需要与SF合作,使用SF提供的Chatter功能,即将车的实时数据信息,工况,DTC等数据自动提交到SF的chatter上面,一边让群组内的所有人员共享或帮忙解决问题。所以应用获取到相关数据后,会自动将数据chatter到SF系统上。



一、partner的实现方式(enterprise方式有点不同):
一个简单的实例及具体代码和步骤如下:
1、到SF申请一个开发者账户,任何设置自己的密码和安全码(访问必须要密码和Security Token),如果没有Security Token,这点击【Reset Security Token】按钮重置一下,在查看注册邮件就会收到了。具体看附件图:



2、下载SF提供的类库插件:
到http://code.google.com/p/sfdc-wsc/downloads/list下载相应的版本文件,添加入项目中即可,我使用的18的版本(wsc-18.jar和partner-18.jar)。

3、编写chatter工具类:简单封装了登录SF平台,更新chatter信息和获取chatter信息的方法
/**
 * ChatterUtils.java V1.0 2011-10-21 下午03:47:53
 * 
 * Copyright 2011 **** Technologies. All rights reserved.
 * 
 * Modification history(By Time Reason):
 * 
 * Description:
 */

package com.***.sf.chatter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.***.utils.lang.Dates;
import com.sforce.soap.partner.Connector;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.soap.partner.QueryResult;
import com.sforce.soap.partner.SaveResult;
import com.sforce.soap.partner.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

/**
 * 
 * <pre><b>功能描述:</b>调用Chatter API的工具类
 *
 * @author :***(Kevin.xie)<br>
 *
 * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
 *
 * </pre>
 */
public class ChatterUtils {
    
    /**
     * Chatter's account
     */
    private static final String USERNAME = "***";
    
    /**
     * Chatter's password and security token
     */
    private static final String PASSWORD = "***";
    
    /**
     * Connection
     */
    private static PartnerConnection connection;
        
    /**
     * 
     * <pre><b>功能描述:</b>Sign on to SF platform
     * 
     * @author :***(Kevin.xie)
     * <b>创建日期 :</b>2011-10-21 下午03:49:33
     *
     * @throws ConnectionException
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    private static void signSfPlatform() throws ConnectionException {

        ConnectorConfig config = new ConnectorConfig();
        config.setUsername(USERNAME);
        config.setPassword(PASSWORD);
        connection = Connector.newConnection(config);
    }
    
    /**
     * 
     * <pre><b>功能描述:</b>update feed to SF's Chatter
     * 
     * @author :***(Kevin.xie)
     * <b>创建日期 :</b>2011-10-21 下午03:51:36
     *
     * @param comment feed comments
     * @return 
     * @throws ConnectionException
     * @throws IOException
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    public static String updateStatus(String comment) throws ConnectionException, IOException {

        signSfPlatform();
        
        String errorMsg = "";
        SObject user = new SObject();
        user.setType("user");
        user.setId(connection.getUserInfo().getUserId());
        user.setField("CurrentStatus", comment);
        
        SaveResult[] results = connection.update(new SObject[] {user });
        
        if (!results[0].isSuccess()) {
            
            errorMsg = "Error updating user status: " + results[0].getErrors()[0].getMessage();
            // System.out.println("Error updating user status: " + errorMsg);
        } else {
            
            // System.out.println("User status successfully updated.");
        }

        return errorMsg;
    }
    
    /**
     * 
     * <pre><b>功能描述:</b>get feed items from SF
     * 
     * @author :***(Kevin.xie)
     * <b>创建日期 :</b>2011-10-21 下午03:55:41
     *
     * @return 
     * @throws ConnectionException
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    public static List<Map<String, String>> displayNewsFeed() throws ConnectionException {

        List<Map<String, String>> feedList = null;
        
        signSfPlatform();
        
// get max records are 50;
        QueryResult queryResults = connection
                .query("SELECT Id, Type, CreatedDate, CreatedBy.name, FeedPost.body FROM NewsFeed WHERE Type = 'UserStatus' ORDER BY CreatedDate DESC, ID DESC LIMIT 50");
        
        if (queryResults.getSize() > 0) {
            
            feedList = new ArrayList<Map<String, String>>();
            
            StringBuilder sb = new StringBuilder();
            
            for (SObject s : queryResults.getRecords()) {
                
                sb.delete(0, sb.length());
                String time = s.getChild("CreatedDate").getValue().toString();
                sb.append(time.substring(0, 10) + " ");
                sb.append(time.substring(11, 13));
                sb.append(time.substring(13, 19));
                
                Map<String, String> map = new HashMap<String, String>();
                map.put(Dates.format(parseDate(sb.toString()), Dates.F_YYYY_MM_DD_HH_MM_SS), s.getChild("FeedPost")
                        .getField("Body").toString());
                
                feedList.add(map);
            }
        }
        
        return feedList;
    }
    
    /**
     * 
     * <pre><b>功能描述:</b>SalesForce服务器的时间与AMS服务器的时间相差8小时
     * 
     * @author :***(Kevin.xie)
     * <b>创建日期 :</b>2011-10-21 下午03:59:01
     *
     * @param DateStr
     * @return
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    private static Date parseDate(String DateStr) {

        StringBuilder sb = new StringBuilder();
        sb.append(DateStr.substring(0, 10) + " ");
        sb.append(DateStr.substring(11, 13));
        sb.append(DateStr.substring(13, 19));
        
        Date d = Dates.parse(sb.toString(), Dates.F_YYYY_MM_DD_HH_MM_SS);
        // 加8小时=8小时*60分*60秒*1000毫秒
        long time1 = d.getTime() + 8 * 3600L * 1000L;
        
        return Dates.parse(time1);
    }
    
}


4、将业务数据提交到SF平台:
  
....
/**
     * 
     * <b>功能描述:</b>发送到SF平台
     * 
     * @author :***(Kevin.xie) <br>
     *         <b>创建日期 :</b>2011-10-21 下午04:05:19
     * 
     * 
     * <br>
     *         <b>修改历史:</b>(修改人,修改时间,修改原因/内容)<br>
     * @throws InterruptedException
     * @throws IOException
     * @throws ConnectionException
     */
    public void sendRtWsToChatter() {

        System.out.println("\t" + new Date().toLocaleString() + " Quartz ...........");
        String vehicleID = "VID1";
        String errMsg = "";
        // 获取实时工况数据
        // 1、获取连接会话
        
        try {
            
            IoSession session = SocketUtils.getSession();
            
            // 产生当次发送请求标识,标识由客户端地址+随机数
            // 这里的标识只是一个例子,标识可以任何方法产生,只要保持在系统中的唯一性
            String flag = "127.0.0.1" + UUID.randomUUID().toString();
            // 将标识保存到当前session中
            session.setAttribute("SendRequestFlag", flag);
            
            // 2、登录服务器
            errMsg = SocketUtils.sendSignInOrder(session, vehicleID, flag);
            
            if (Strings.isEmpty(errMsg)) {
                
                // 3、发发送获取实时工况的指令
                
                errMsg = SocketUtils.sendReqRtWsDataOrder(session, vehicleID, flag, workStatusIDs);
                
                // TODO 有个里程没有做
                
                StringBuilder sb = new StringBuilder();
                // 4、获取实时工况的指令
                if (Strings.isEmpty(errMsg)) {
                    
                    RouterOrder resultOrder = (RouterOrder) WebClientHandler.results.get(flag);
                    // 获取实时数据--封装实时数据为flexGrid的结果
                    ReceiveRtWsOrderPackage rtWsPackage = (ReceiveRtWsOrderPackage) resultOrder.getOrderPackage();
                    
                    List<Object> wsValue = rtWsPackage.getWorkStatusValueList();
                    
                    // 清空原来的数据
                    sb.delete(0, sb.length());
                    
                    for (int i = 0; i < wsValue.size(); i++) {
                        
                        sb.append(rtWsPackage.getDeviceNameList().get(i));
                        sb.append(" = ");
                        sb.append(wsValue.get(i));
                        sb.append(" (" + rtWsPackage.getUnitList().get(i) + ")");
                        sb.append(", ");
                    }
                    
                    // 清除标识内容
                    WebClientHandler.results.remove(flag);
                }
                
                if (sb.length() > 2) {
                    
                    String comment = sb.toString().substring(0, sb.length() - 2);
                    // 更新到chatter
                    String msg = ChatterUtils.updateStatus(comment);
                    System.out.println("\n\t Chatter's comment is : " + comment);
                    System.out.println("\n\t The Chatter respones message is " + msg);
                }
                
                // 休眠来2s后再继续下一个操作
                Thread.sleep(2000);
            }
            
            System.out.println("\n\tThe error message [errMsg] = " + errMsg);
        } catch (Exception e) {
            
            System.out.println("\n\tThe error message [errMsg] = " + errMsg);
            System.out.println("\n\tCatch the Exception, Exception message is below:");
            e.printStackTrace();
        }
    }
....


至此,已经完成了整个开发过程,上面的代码基本上copy出去就可以使用了。

也是刚刚研究SF平台,发现在上面开发还是比较麻烦,主要是资料很少,有哪位同学也在开发SF的,可以一起探讨,目前还有好多功能要开发,现在只用到了SF的chatter功能,其他功能后续会继续更新。


二、Enterprise方式
/**
 * EnterpriseCar.java V1.0 2012-2-15 下午01:16:56
 * 
 * Copyright 2011 ****** Technologies. All rights reserved.
 * 
 * Modification history(By Time Reason):
 * 
 * Description:
 */

package com.****.sf.custom.object;

import java.io.IOException;

import com.sforce.soap.enterprise.Connector;
import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.soap.enterprise.QueryResult;
import com.sforce.soap.enterprise.SaveResult;
import com.sforce.soap.enterprise.sobject.Car__c;
import com.sforce.soap.enterprise.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

/**
 * 
 * <pre><b>功能描述:</b>Enterprise 版本操作对象(自定义)的方法。与Partner的方式有点小区别
 *
 * @author :***(Kevin.xie)<br>
 *
 * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
 *
 * </pre>
 */
public class EnterpriseCar {
    
    // private static String USERNAME = "******.com";
    // private static String PASSWORD = "******4nLzBrMJyZIjQGimh4d0";
    // private static String USERNAME = "******@gmail.com";
    // private static String PASSWORD = "******0xGwMq4nKjfEOaiu";
    private static String USERNAME = "******@37demo.com.dev";
    private static String PASSWORD = "******by9vpdNNaTqtwhltqHwJ";
    
    private static EnterpriseConnection connection;
    
    public static void main(String[] args) throws ConnectionException, IOException {

        ConnectorConfig config = new ConnectorConfig();
        config.setUsername(USERNAME);
        config.setPassword(PASSWORD);
        connection = Connector.newConnection(config);
        displayNewsFeed();
        create();
        // update();
        displayNewsFeed();
        connection.logout();
    }
    
    /**
     * 
     * <pre><b>功能描述:</b>更新
     * 
     * @author :***(Kevin.xie)
     * <b>创建日期 :</b>2012-2-15 下午03:18:52
     *
     * @throws ConnectionException
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    private static void update() throws ConnectionException {

        QueryResult queryResults = connection.query("SELECT Id FROM Car__c where VID__c = 'VID1' LIMIT 50");
        System.out.println(queryResults == null ? "null" : queryResults.getSize() + "");
        if (queryResults.getSize() > 0) {
            
            // partner 的方式
            // SObject car = queryResults.getRecords()[0];
            // SObject car = new SObject();
            // car.setId(sObject.getId());
            // car.setType("Car__c");
            // car.setField("Currently_DTC__c", "p2000--Test DTCs");
            
            // SaveResult[] results = connection.update(new SObject[] {trailer });
            
            // Enterprise 的方式
            // 不能直接更新这个从数据库查处的对象,回报错误
            SObject sObject = queryResults.getRecords()[0];
            Car__c car = new Car__c();
            car.setId(sObject.getId());
            car.setCurrently_DTC__c("p2000--Test DTCs");
            
            SaveResult[] results = connection.update(new SObject[] {car });
            
            if (!results[0].isSuccess()) {
                
                System.out.println("Error updating user status: " + results[0].getErrors()[0].getMessage());
            } else {
                
                System.out.println("User status successfully updated.");
            }
            System.out.println();
        }
    }
    
    /**
     * 
     * <pre><b>功能描述:</b>新建
     * 
     * @author :***(Kevin.xie)
     * <b>创建日期 :</b>2012-2-15 下午03:18:25
     *
     * @throws ConnectionException
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    private static void create() throws ConnectionException {

        System.out.println();
        // partner方式下,需用SObject对象,然后设置类型和属性值
        // SObject trailer = new SObject();
        // car.setType("Trailer__c");
        // car.setField("Driver__c", "003O0000005q8u6IAA");
        // car.setField("Car_Manufacturer__c", "Trailer_Name__c", "Audi");
        // car.setField("Car_Model__c", "Linkman__c", "Audi A8");
        // car.setField("VID__c", "Telphone_No__c", "0000");
        // car.setField("Vehicle_Name__c", "Email__c", "Kevin's Car");
        // car.setField("Currently_DTC__c", "WebSite__c", "P9999--test DTCs");
        
        // SaveResult[] results = connection.create(new SObject[] {car });
        
        // Eenterprise方式
        Car__c car = new Car__c();
        car.setDriver__c("003O0000005q8u6IAA");
        car.setCar_Manufacturer__c("Audi");
        car.setCar_Model__c("Audi A8");
        car.setVID__c("0000");
        car.setVehicle_Name__c("Kevin's Car");
        car.setCurrently_DTC__c("P9999--test DTCs");
        
        SaveResult[] results = connection.create(new SObject[] {car });
        
        if (!results[0].isSuccess()) {
            
            System.out.println("Error create user : " + results[0].getErrors()[0].getMessage());
        } else {
            
            System.out.println("User status successfully create.");
        }
        System.out.println();
    }
    
    /**
     * 
     * <pre><b>功能描述:</b>显示
     * 
     * @author :***(Kevin.xie)
     * <b>创建日期 :</b>2012-2-15 下午03:21:23
     *
     * @throws ConnectionException
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    private static void displayNewsFeed() throws ConnectionException {

        QueryResult queryResults = connection
                .query("SELECT Id, Car_Manufacturer__c, Car_Model__c, Chassis_Number__c, Currently_DTC__c, Driver__c, Name, VID__c, Vehicle_Name__c, Year__c  FROM Car__c LIMIT 50");
        // QueryResult queryResults = connection
        // .query("SELECT Id FROM Trailer__c where Name='T-000004' ORDER BY CreatedDate DESC, ID DESC LIMIT 50");
        System.out.println(queryResults == null ? "null" : queryResults.getSize() + "");
        if (queryResults.getSize() > 0) {
            
            for (SObject s : queryResults.getRecords()) {
                
                // partner方式
                // String id = s.getChild("Id").getValue().toString();
                // String driver = s.getChild("Driver__c").getValue().toString();
                // String carManufacturer = s.getChild("Car_Manufacture__c").getValue().toString();
                // String carModel = s.getChild("Car_Model__c").getValue().toString();
                // String VID1 = s.getChild("VID1__c").getValue().toString();
                // String Vehicle_Name = s.getChild("Vehicle_Name__c").getValue().toString();
                // String DTCs = s.getChild("Currently_DTC__c").getValue().toString();
                //                
                // System.out.println(id + ", " + driver + ", " + TrailerName + ", " + carModel +
                // ", " + VID1 + ", "
                // + Vehicle_Name + ", " + DTCs);
                
                // Enterprise方式
                Car__c car = (Car__c) s;
                StringBuilder sb = new StringBuilder();
                sb.append("Driver = " + car.getDriver__c() + "\n");
                sb.append("Car Manufacturer = " + car.getCar_Manufacturer__c() + "\n");
                sb.append("Car Model = " + car.getCar_Model__c() + "\n");
                sb.append("VID1 = " + car.getVID__c() + "\n");
                sb.append("Vehicle_Name = " + car.getVehicle_Name__c() + "\n");
                sb.append("DTCs = " + car.getCurrently_DTC__c() + "\n");
                
                System.out.println(sb.toString());
                
            }
            System.out.println("end");
        }
    }
}



运行结果
1
Driver = 003O0000005q8u6IAA
Car Manufacturer = Audi
Car Model = Audi A6
VID1 = VID1
Vehicle_Name = MyCar
DTCs = p2000--Test DTCs

end

User status successfully create.

2
Driver = 003O0000005q8u6IAA
Car Manufacturer = Audi
Car Model = Audi A8
VID1 = 0000
Vehicle_Name = Kevin's Car
DTCs = P9999--test DTCs

Driver = 003O0000005q8u6IAA
Car Manufacturer = Audi
Car Model = Audi A6
VID1 = VID1
Vehicle_Name = MyCar
DTCs = p2000--Test DTCs

end

-----------
Kevin.xie
http://xieyanhua.iteye.com/admin/blogs/1207269
  • 大小: 130.6 KB
  • 大小: 119.7 KB
  • 大小: 134.1 KB
分享到:
评论

相关推荐

    PyPI 官网下载 | django-chatter-0.2.2.tar.gz

    `django-chatter`作为Python库,属于Python在后端开发中的应用。后端开发主要负责处理服务器端逻辑,如数据存储、业务处理、API接口等,与前端(浏览器端)交互,为用户提供服务。Python因其简洁、易读的语法和丰富...

    chatter_client_testtime_0712

    本项目名为"chatter_client_testtime_0712",显然它是一个用于测试网络延迟的客户端代码,基于某个名为"chatter"的基础框架,并在原有功能上添加了时间测试功能。这个项目可能是一个C++程序,因为它提到了使用Visual...

    MSDN的CSocket例子chatter

    【标题】"MSDN的CSocket例子chatter"是一个基于微软MSDN提供的示例,用于演示如何使用MFC(Microsoft Foundation Classes)中的`CSocket`类进行网络通信。`CSocket`是MFC对Windows Sockets(Winsock)API的一个封装...

    chatter desktop 版本

    企业用chatter,用于公司内部的沟通交流。在法国很流行。需要air的支持

    Python库 | hat_chatter-0.4.1.dev20210120-cp39-none-any.whl

    Python作为一种广泛应用于后端开发的语言,其丰富的库生态系统是其一大优势,`hat_chatter`可能是这个生态中的一个组成部分。 在压缩包子文件的文件名称列表中,只有一个文件名:"hat_chatter-0.4.1.dev20210120-cp...

    Chatter:Android聊天应用

    综上所述,"Chatter:Android聊天应用"的开发涵盖了Android应用开发的多个关键领域,包括用户界面设计、数据管理、网络通信、多线程处理以及安全性等,充分展示了Java在移动开发中的强大功能。开发者在实现这样一个...

    chatter:适用于企业的 Android 应用

    在Android应用开发中,Java是常用的语言之一,因为其面向对象的特性、良好的可移植性以及强大的社区支持。开发者可能使用了Android SDK(Software Development Kit)来构建Chatter,其中包括了必要的工具、库和API,...

    [聊天留言]Orbit PHP Chatter 0.1 Beta4_orbitphpchatter_0.1b4.zip

    这个版本是Beta4,意味着它仍处于开发阶段,可能存在一些未解决的问题或功能不完善的地方,但同时也代表了开发者在不断改进和优化产品。 Orbit PHP Chatter 的核心知识点包括: 1. **PHP编程**:该软件是用PHP语言...

    LightningMessage:可以在Salesforce Lightning中使用Chatter消息的应用程序

    您曾经在Salesforce1中使用Chatter消息时遇到过麻烦吗? 一点咨询。 一条信息,邀请您共进午餐。 随时随地的一点联系。 如果您发给Chatter,时间轴将被埋在联系人(例如会议)中,而这些联系人不必作为一个整体共享...

    chatter_server_testtime_0712

    Visual Studio是一个强大的IDE(集成开发环境),支持多种编程语言,包括C++。VS2005虽然较旧,但它依然能够支持C++标准,同时提供了丰富的调试工具,使得测试和优化代码变得更加便捷。 对于网络服务器的性能优化,...

    Chatter:用Java制作的简单消息应用程序

    ikhaliq15和nt使用Java开发了此应用程序,并将其导出到可运行的jar文件中。 该软件是完全免费的,您只要愿意给我们信用,就可以以任何方式编辑源代码。 如果您有资格,请提出要求。 更新日志: 2014年3月,1.0版...

    slatter:用于从Slack到Chatter(Salesforce)集成的简单NodeJS直通服务器

    一个简单的NodeJS直通服务器,用于将松弛的出站消息发送到Chatter(Salesforce)集成。 通过利用Slack的传出网络钩子,您可以将有效负载传递给Slatter,后者将进行验证并将消息传递给Chatter。 依存关系 感谢其他...

    Salesforce应用架构分析

    这些组件提供了销售自动化、客户服务、市场营销和企业级应用开发等功能。它们基于统一的 Force.com 平台,这个平台支持多租户架构,确保了高效、安全且可扩展的服务。 2. **数据模型** Salesforce 数据模型是基于...

    chatter:Chatter是一个简单的Laravel论坛程序包

    如果要在Laravel 5.5+上安装,请跳过此步骤 DevDojo\Chatter\ChatterServiceProvider::class, 通过运行以下命令来发布供应商资产文件: ...

    article_src_sourcefiles.zip_Chatter_skype

    【标题】"article_src_sourcefiles.zip_Chatter_skype" 提供了一个增强版的 Skype 聊天机器人项目,旨在利用 ...同时,此项目也为学习和实践 C# 语言、Windows Forms 应用开发以及 Skype 机器人开发提供了很好的实例。

    Chatter:基于Parse平台的小型聊天软件(https

    在"Chatter"这款应用中,Parse被用作后端服务提供商,以支持聊天功能的核心运作。 1. **Parse平台**:Parse提供了一套完整的后台解决方案,包括数据库、服务器、API接口等,开发者可以利用其SDK快速构建应用。对于...

    FDM_1st_Chatter.rar_matlab chatter_milling_sometimekry_铣_铣削 离散

    通过理解和应用这个Matlab程序,工程师可以更准确地预测高速铣削过程中的颤振风险,调整切削参数,提高加工效率和产品质量。同时,这个算法也可以作为进一步研究颤振机理和优化控制策略的基础。

    Chatter-开源

    Delphi 5是Borland公司(现Embarcadero Technologies)推出的一款强大的Windows应用程序开发工具,它基于Object Pascal语言,集成了Visual Component Library (VCL)框架,提供了快速的编译速度和高效的执行效率。...

    mfccsocket.rar_vc6 chatter_vc6 socket_vc6.0 socket

    总的来说,MFCCSocket项目提供了一个学习和实践Socket编程和Windows下C++网络应用开发的良好实例。通过研究和理解这个项目,你可以掌握如何在VC6.0环境下编写基本的聊天应用,加深对Socket编程的理解,并且提升自己...

    Chatter:基于 Java 的局域网聊天应用程序

    喋喋不休基于 Java 的聊天应用程序。 作为网络课程的作业创建。 从复制的初始代码截屏去做修改用户界面使用布局管理器正确调整大小处理不正确的用户名向上/向下箭头循环浏览以前发送的消息(如 Pidgin) 用户名的...

Global site tag (gtag.js) - Google Analytics