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

[img]http://dl.iteye.com/upload/attachment/574040/5ffdeb18-fc79-3f6d-9233-138cd4969adf.jpg[/img]

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

[img]http://dl.iteye.com/upload/attachment/574001/604f2d21-bdf2-322d-8924-4b4e41dc76df.jpg[/img]

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");        }    }}

运行结果

1Driver = 003O0000005q8u6IAACar Manufacturer = AudiCar Model = Audi A6VID1 = VID1Vehicle_Name = MyCarDTCs = p2000--Test DTCs

end

User status successfully create.

2Driver = 003O0000005q8u6IAACar Manufacturer = AudiCar Model = Audi A8VID1 = 0000Vehicle_Name = Kevin's CarDTCs = P9999--test DTCs

Driver = 003O0000005q8u6IAACar Manufacturer = AudiCar Model = Audi A6VID1 = VID1Vehicle_Name = MyCarDTCs = p2000--Test DTCs

end

-----------
Kevin.xie
http://xieyanhua.iteye.com/admin/blogs/1207269

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

  1. java服务端集成极光消息推送--详细开发步骤

    1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...

  2. java channel midi_为Java程序中添加播放MIDI音乐功能

    下载本文示例代码 Java在多媒体处理方面的确优势不大,但是我们在程序中有些时候又需要一些音乐做为点缀,如果播放的音乐是wav等波形音频文件,又挺大,所以背景音乐最好就是MIDI了,可是网上很多播放M ...

  3. Java ArrayList中retainAll()方法具有什么功能呢?

    转自: Java ArrayList中retainAll()方法具有什么功能呢? 下文笔者讲述java中ArrayList方法的功能简介说明,如下所示: retainAll()方法的功能:用于保留 a ...

  4. wps启用编辑按钮在哪里_电脑WPS文字编辑中即点即输功能的启动步骤

    即点即输是Microsoft Office 中WORD的一项功能,是指鼠标指针指向需要编辑的文字位置,单击鼠标即可进行文字输入.那么,WPS文字编辑软件中"即点即输"功能怎么启用呢 ...

  5. java Swing中JTextField自动补全功能例子

    涉及到两个Java类 主类:AutoCompleteComponet.java 数据类:AutoCompleteComponet.java 效果图如下: 代码如下: 主类:AutoCompleteCo ...

  6. KeelKit 中集成了代码统计功能

    2019独角兽企业重金招聘Python工程师标准>>> 简介: 该功能支持C#  VB.Net  F# IronPython的代码统计(后两者需要您安装相应安装包,不安装不影响Kee ...

  7. 使用JAVA实现看吉日/黄道吉日/看日子功能的开发方法

    看吉日/黄道吉日/看日子是一种古老的占卜方法,它通过根据不同的日期和时间来预测吉凶祸福.在现代社会中,很多人仍然相信这种方法,并将其应用于生活中. 为了实现看吉日/黄道吉日/看日子的功能,我们可以使用 ...

  8. java 项目中遇到的问题 和解决方案_Java开发遇到的问题及解决方案

    一.java.lang.OutOfMemoryError 问题:myeclipse 内存不足,又显示内存溢出等问题怎么回事?(java.lang.OutOfMemoryError: PermGen s ...

  9. Java 8中的5个功能将改变您的编码方式

    Java 8在JVM和语言级别都包含了一些非常令人兴奋的功能. 虽然最初为该发行版设想的某些功能已扩大范围或已推出到第9版,但实际上有数十个新功能. 许多新添加的内容在编译器,JVM或帮助系统级别都进 ...

最新文章

  1. Atitit 常见每日流程日程日常工作.docx v4
  2. Hibernate的数据查找,添加!
  3. Python基本语法_函数_参数的多类型传值
  4. jquery easy ui 1.3.4 数据表格(DataGrid)(8)
  5. timerpickerview使用_详解iOS App中UIPickerView滚动选择栏的添加方法
  6. 动态加载JS脚本【转】
  7. 商务计算机的购置方案,电子采购方案的实施.ppt
  8. 免责协议怎么写_员工辞职时,HR得让他这样写离职申请!
  9. centos linux 使用无线网卡,CentOS环境下安装无线网卡
  10. 解决无线路由器无法进行账号认证上网的问题
  11. 深入浅出SSM框架流程以及原理
  12. win10怎么快捷锁定计算机,win10锁屏快捷键如何设置_让你win10电脑一键秒锁屏的方法...
  13. Windows10笔记本 闲置一段时间后黑屏无法唤醒,风扇全速运转的解决日志
  14. sql server 公共表表达式【CTE 】、临时表、变量表
  15. iOS系统字体如何使用
  16. 72、【backtrader期货策略】十大经典策略-Aberration策略(布林带策略)(2021-10-29更新)
  17. mybatis-plus模板
  18. 参会人员如何快速入场?高科技来帮忙
  19. git cherry-pick 将另一个分支的某个提交拉取到当前分支(也叫做遴选),在命令窗口和sourcetree中的使用
  20. 粉笔计算机基础知识,1根粉笔讲:“计算机编程”

热门文章

  1. 转-果壳网python工程师招聘启事
  2. 企业为什么要申请高新技术企业认定
  3. 解决 npm install 时出现的.git can‘t be found (see https://git.io/Jc3F9)的问题 run `npm fund` for details问题解决
  4. 我分析了 6.5W 字的歌词,看到了这样的周杰伦
  5. python数据分析项目实战—————链家北京租房数据统计分析
  6. shell几个基础问题(基础进阶)
  7. java点赞_java实现点赞功能示例
  8. 揭开“QUIC”的神秘面纱
  9. Python爬虫实践(入门篇)——抓取《天使降临到我身边》图片
  10. ACM数论专题3——素数(质数)