点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
大家好,
我需要将Salesforce Bulk API与SOAP适配器集成。
当前使用的PI版本是PI 7.4 Single Stack。
我确实浏览了博客:
https://blogs .sap.com/2014/07/14/sap-pi-salesforce-bulk-api /-基于ccBPM
对于NW BPM创建,我经历了:
请让我知道如何在NW BPM中创建工作,添加工作和关闭工作?
在没有NW BPM的情况下能否实现BULK API?
谢谢
赛
您好,
使用SOAP不支持批量API。您可以选择支持BULK API的Advantco SFDC适配器,甚至可以根据请求中的记录数在BULK和SOAP API之间进行切换 有效负载。
您也可以使用Kate的REST适配器进行连接。.但是Advantco是无缝集成中更好的解决方案。
BULK API是基于异步的数据传输。
除中间件外,任何基于Java的App/客户端都可以使用BULK API将数据传输到SFDC。
感谢
Sugata Bagchi Majumder
嗨,Sugata,
抱歉抱歉。
由于许可成本和其他限制,客户不希望使用Advantco SFDC适配器。
客户希望使用SAP PI作为中间件将数据作为BULK API传输到SFDC。 场景是IDOC到SFDC。
根据博客: https://blogs.sap.com/2014/07/14/sap-pi-salesforce-bulk-api /
提到可以使用SOAP适配器实现批量API。
截至目前,有效负载中的记录数为1000,将来可能会增加。
如果您提供在NW BPM中创建作业,添加作业和关闭作业的过程,将会很有帮助?
谢谢
Sai
大家好,
很抱歉延迟,
由于我们未安装SFDC适配器和REST适配器,并且PI系统中未安装BPM:7.4(AEX)
因为其中涉及许可成本,还需要考虑时间表。 我们还可以向客户建议其他哪些替代方法。
我正在考虑两种实现BULK API的方法:
让我看看哪种方法更可行,维护更少
1)使用Java映射实现此目标?
-以下是销售人员文档中给出的BULK API的示例代码
2)我们可以使用ABAP代理吗?
a)调用出站代理调用以创建会话-响应(服务器URL和会话ID)在代理中捕获
b)调用代理(传递服务器URL和会话ID)以创建作业-销售人员的响应(工作ID)被捕获在代理中
c)调用用于创建批处理作业的代理(服务器url,SessionId和JobID)以及需要传递给SF的实际数据。
d)调用代理(服务器url,SessionId和JobID)以关闭作业。
批量API的代码:我想这对其他人也有帮助
import java.io 。*; 导入java.util。*; 导入com.sforce.async。*; 导入com.sforce.soap.partner.PartnerConnection; 导入com.sforce.ws.ConnectionException; 导入com.sforce.ws.ConnectorConfig;
设置main()方法此代码为类设置main()方法。 它调用runSample()方法,该方法包含样本的处理逻辑。 我们将在后续部分中查看runSample()中调用的方法。
主要方法:
公共静态void main(String [] args)抛出AsyncApiException,ConnectionException,IOException {BulkExample example = new BulkExample(); //用您的凭据和测试文件名替换下面的参数//第一个参数表示我们正在加载帐户记录example.runSample(" Account"," myUser @ myOrg .com "," myPassword"," mySampleData.csv"); }
/** *创建Bulk API作业并上传CSV文件的批次。 */public void runSample(String sobjectType,String userName,String password,String sampleFileName)引发AsyncApiException,ConnectionException,IOException {BulkConnection connection = getBulkConnection(userName,password); JobInfo job = createJob(sobjectType,connection); 列出batchInfoList = createBatchesFromCSVFile(connection,job,sampleFileName); closeJob(connection,job.getId()); awaitCompletion(connection,job,batchInfoList); checkResults(connection,job,batchInfoList); }
登录并配置BulkConnection:
以下代码使用伙伴连接(PartnerConnection)登录,然后重用会话以创建Bulk API连接(BulkConnection)。
/** *创建用于调用Bulk API操作的BulkConnection。 */private BulkConnection getBulkConnection(String userName,String password)抛出ConnectionException,AsyncApiException {ConnectorConfig partnerConfig = new ConnectorConfig(); partnerConfig.setUsername(userName); partnerConfig.setPassword(password); partnerConfig.setAuthEndpoint(" https://login.salesforce.com/services /Soap/u/40.0 "); //创建连接会自动处理登录,并将会话//存储在partnerConfig中。new PartnerConnection(partnerConfig); //实例化PartnerConnection时,将隐式执行//登录,如果成功,将//有效会话存储在ConnectorConfig实例中。 //使用此键初始化BulkConnection:ConnectorConfig config = new ConnectorConfig(); config.setSessionId(partnerConfig.getSessionId()); //直到/Soap/部分,Bulk API服务的终结点与常规SOAP uri的终结点相同。 从这里开始是'/async/versionNumber'字符串soapEndpoint = partnerConfig.getServiceEndpoint(); 字符串apiVersion =" 40.0"; 字符串restEndpoint = soapEndpoint.substring(0,soapEndpoint.indexOf(" Soap/"))+" async/" + apiVersion; config.setRestEndpoint(restEndpoint); //仅在调试时才为false。 config.setCompression(true); //将其设置为true以查看标准输出上的HTTP请求和响应config.setTraceMessage(false); BulkConnection连接=新的BulkConnection(config); 返回连接; }此BulkConnection实例是使用Bulk API的基础。 该实例可以在应用程序的剩余寿命中重复使用。
创建工作:
创建连接后,创建一个作业。 数据始终在作业的上下文中进行处理。 作业指定有关正在处理的数据的详细信息:正在执行的操作(插入,更新,向上插入或删除)以及对象类型。 以下代码在Account对象上创建一个新的插入作业。
/** *使用Bulk API创建新作业。 * * @param sobjectType *正在加载的对象类型,例如"帐户" * @param连接*用于创建新作业的BulkConnection。 * @return新作业的JobInfo。 * @throws AsyncApiException */私有JobInfo createJob(String sobjectType,BulkConnection connection)抛出AsyncApiException {JobInfo job = new JobInfo(); job.setObject(sobjectType); job.setOperation(OperationEnum.insert); job.setContentType(ContentType.CSV); job = connection.createJob(job); System.out.println(job); 回职 }
创建作业后,它处于"打开"状态。 在这种状态下,可以将新批次添加到作业中。 关闭工作后,将无法再添加批处理。
将批次添加到作业:
在一系列批处理请求中处理数据。 每个请求都是一个HTTP POST,在主体中包含XML格式的数据集。 您的客户端应用程序确定每天要使用多少批来处理整个数据集。
每个批次的处理都有开销。 批次大小应足够大以最大程度地减少开销处理成本,并且应足够小以易于处理和转移。 1,000和10,000条记录之间的批处理大小被认为是合理的。
以下代码将CSV文件拆分为较小的批处理文件,并将其上传到Salesforce。
/** *使用CSV文件创建和上传批次。 *将文件分成适当大小的批处理文件。 * * @param连接*用于创建批次的连接* @param jobInfo *与新批次关联的作业* @param csvFileName *批次数据的源文件*/
私有列表createBatchesFromCSVFile(BulkConnection连接,JobInfo jobInfo,字符串csvFileName)引发IOException,AsyncApiException {List batchInfos = new ArrayList(); BufferedReader rdr = new BufferedReader(new InputStreamReader(new FileInputStream(csvFileName))); //读取CSV标头行byte [] headerBytes =(rdr.readLine()+" \ n")。getBytes(" UTF-8"); int headerBytesLength = headerBytes.length; 文件tmpFile = File.createTempFile(" bulkAPIInsert"," .csv");
//将CSV文件分为多个批次尝试
{FileOutputStream tmpOut =新的FileOutputStream(tmpFile); int maxBytesPerBatch = 10000000;
//每批1千万个字节int maxRowsPerBatch = 10000;
//每批1万行int currentBytes = 0;
int currentLines = 0; 字符串nextLine; while(((nextLine = rdr.readLine())!= null){byte [] bytes =(nextLine +" \ n")。getBytes(" UTF-8"); //如果达到以下条件,则创建新的批次:(currentBytes + bytes.length> maxBytesPerBatch || currentLines> maxRowsPerBatch){createBatch(tmpOut,tmpFile,batchInfos,connection,jobInfo); currentBytes = 0; currentLines = 0; }如果(currentBytes == 0){tmpOut = new FileOutputStream(tmpFile); tmpOut.write(headerBytes); currentBytes = headerBytesLength; currentLines = 1; } tmpOut.write(bytes); currentBytes + = bytes.length; currentLines ++; }//处理完所有行////如果(currentLines> 1){createBatch(tmpOut,tmpFile,batchInfos,connection,jobInfo); }}最后{tmpFile.delete(); } return batchInfos; }
/** *通过上传文件内容创建批处理。 *这将关闭输出流。 * * @param tmpOut *用于写入单个批次的CSV数据的输出流。 * @param tmpFile *与上述流关联的文件。 * @param batchInfos *新创建的批次的批次信息已添加到此列表中。 * @param连接* BulkConnection用于创建新批处理。 * @param jobInfo *与新批次关联的JobInfo。 */
私有void createBatch(FileOutputStream tmpOut,文件tmpFile,列表batchInfos,BulkConnection连接,JobInfo jobInfo)引发IOException,AsyncApiException {tmpOut.flush(); tmpOut.close(); FileInputStream tmpInputStream =新的FileInputStream(tmpFile); 尝试{BatchInfo batchInfo = connection.createBatchFromStream(jobInfo,tmpInputStream); System.out.println(batchInfo); batchInfos.add(batchInfo); }最后{tmpInputStream.close(); }}
关闭工作
将所有批次添加到作业后,关闭作业。 完成这项工作可确保完成所有批次的处理。
私有无效closeJob(BulkConnection连接,字符串jobId)引发AsyncApiException {JobInfo job = new JobInfo(); job.setId(jobId); job.setState(JobStateEnum.Closed); connection.updateJob(job);
谢谢
Sai
大家好,
需要您的帮助。 我的场景是使用带oauth2.0的REST适配器的SAP PO 7.5到Sales-force。
我能够使用REST适配器通过oauth2.0(包括PATCH方法)将数据从SAP PO 7.5发送到Sales-force。
但是如何使用REST适配器进行批量API传输? 请指导我实现批量API数据传输。
预先感谢您的帮助。
最好的问候
Karunakar A
一周热门 更多>