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

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



一个简单的实例及具体代码和步骤如下:
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功能,其他功能后续会继续更新。
                                                                      Kevin.xie 相关的主题文章:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值