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

项目中,需要与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");
}
}
}



运行结果

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值