`
JerryWang_SAP
  • 浏览: 1001139 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

使用SAP云平台 + JNDI访问Internet Service

阅读更多

以Internet Service http://maps.googleapis.com/maps/api/distancematrix/xml?origins=Walldorf&destinations=Berlin为例,

在浏览器里访问这个url,得到输出:从Walldorf到Berlin的距离。

 

如何让一个部署到SAP云平台的Java应用也能访问到该internet service呢?

首先在SAP云平台里创建一个destination,维护service的end point:

 

在Java代码里使用SAP云平台里创建的destination:

 

然后使用JNDI service读取destination里配置的url:

 

部署到SAP云平台之后,在Eclipse里看到preview结果:

 

SAP云平台Cockpit显示如下:

 

浏览器访问如下:

 

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">

    <!-- Main sample servlet mapped to / so that the integration test harness can detect readiness (generic for all samples) -->
    <servlet>
        <servlet-name>ConnectivityServlet</servlet-name>
        <servlet-class>com.sap.cloud.sample.connectivity.ConnectivityServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ConnectivityServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- Declare the JNDI lookup of destination -->
    <resource-ref>
    <res-ref-name>connectivityConfiguration</res-ref-name>
    <res-type>com.sap.core.connectivity.api.configuration.ConnectivityConfiguration</res-type>
    </resource-ref>
</web-app>
package com.sap.cloud.sample.connectivity;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;

import javax.annotation.Resource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sap.cloud.account.TenantContext;
import com.sap.core.connectivity.api.configuration.ConnectivityConfiguration;
import com.sap.core.connectivity.api.configuration.DestinationConfiguration;

public class ConnectivityServlet extends HttpServlet {
    @Resource
    private TenantContext  tenantContext;

    private static final long serialVersionUID = 1L;
    private static final int COPY_CONTENT_BUFFER_SIZE = 1024;
    private static final Logger LOGGER = LoggerFactory.getLogger(ConnectivityServlet.class);

    private static final String ON_PREMISE_PROXY = "OnPremise";

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        HttpURLConnection urlConnection = null;
        String destinationName = request.getParameter("destname");

        if (destinationName == null) {
            destinationName = "google_map";
        }
        
        try {
            Context ctx = new InitialContext();
            ConnectivityConfiguration configuration = (ConnectivityConfiguration) ctx.lookup("java:comp/env/connectivityConfiguration");

            DestinationConfiguration destConfiguration = configuration.getConfiguration(destinationName);

            if (destConfiguration == null) {
                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                        String.format("Destination %s is not found. Hint:"
                                + " Make sure to have the destination configured.", destinationName));
                return;
            }

            String value = destConfiguration.getProperty("URL");
            URL url = new URL(value + "xml?origins=Walldorf&destinations=Paris");

            String proxyType = destConfiguration.getProperty("ProxyType");
            Proxy proxy = getProxy(proxyType);

            urlConnection = (HttpURLConnection) url.openConnection(proxy);

            injectHeader(urlConnection, proxyType);

            InputStream instream = urlConnection.getInputStream();
            OutputStream outstream = response.getOutputStream();
            copyStream(instream, outstream);
        } catch (Exception e) {
            String errorMessage = "Connectivity operation failed with reason: "
                    + e.getMessage()
                    + ". See "
                    + "logs for details. Hint: Make sure to have an HTTP proxy configured in your "
                    + "local environment in case your environment uses "
                    + "an HTTP proxy for the outbound Internet "
                    + "communication.";
            LOGGER.error("Connectivity operation failed", e);
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                    errorMessage);
        }
    }

    private Proxy getProxy(String proxyType) {
        Proxy proxy = Proxy.NO_PROXY;
        String proxyHost = null;
        String proxyPort = null;

        if (ON_PREMISE_PROXY.equals(proxyType)) {
            // Get proxy for on-premise destinations
            proxyHost = System.getenv("HC_OP_HTTP_PROXY_HOST");
            proxyPort = System.getenv("HC_OP_HTTP_PROXY_PORT");
        } else {
            // Get proxy for internet destinations
            proxyHost = System.getProperty("https.proxyHost");
            proxyPort = System.getProperty("https.proxyPort");
        }

        if (proxyPort != null && proxyHost != null) {
            int proxyPortNumber = Integer.parseInt(proxyPort);
            proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPortNumber));
        }

        return proxy;
    }

    private void injectHeader(HttpURLConnection urlConnection, String proxyType) {
        if (ON_PREMISE_PROXY.equals(proxyType)) {
            // Insert header for on-premise connectivity with the consumer account name
            urlConnection.setRequestProperty("SAP-Connectivity-ConsumerAccount",
                    tenantContext.getTenant().getAccount().getId());
        }
    }

    private void copyStream(InputStream inStream, OutputStream outStream) throws IOException {
        byte[] buffer = new byte[COPY_CONTENT_BUFFER_SIZE];
        int len;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
    }
}

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

 
 
0
0
分享到:
评论

相关推荐

    Struts+Jndi+Ajax

    JNDI是Java平台的一项服务,它允许Java应用程序查找和绑定命名对象,如数据源、EJB、邮件服务器等。在Web应用程序中,JNDI常用于获取数据库连接池、远程对象等资源。通过JNDI,开发者可以将资源的配置与代码分离,...

    Tomcat6+spring+jndi配置数据源说明.docx

    Tomcat6+Spring+JNDI配置数据源说明 本文档主要介绍了Tomcat6+Spring+JNDI配置数据源的详细步骤和原理。数据源是一个池子,里面有若干个数据连接对象,当需要时就从里面拿一个使用,使用完毕就放回去,如果超过最大...

    JSP+Serlet+JNDI实现酒店管理系统

    这个项目可能使用关系型数据库如MySQL或Oracle,通过JNDI来获取数据库连接,简化了数据库资源的管理。同时,数据库的设计应遵循第三范式,保证数据的一致性和完整性。 5. **Tomcat服务器**:Tomcat是一款开源的...

    ibatis+jndi+mysql

    4. **修改 sqlMapConfig.xml** - 更新 Ibatis 的配置文件,指定使用 JNDI 查找的数据源。 通过以上步骤,Ibatis 可以通过 JNDI 查找到应用程序服务器中配置的数据源,实现了数据库连接的集中管理和透明化。这种方式...

    ssm+maven+jndi+jdbc

    在这个项目中,结合了Maven进行依赖管理,并且使用了JNDI(Java Naming and Directory Interface)和JDBC(Java Database Connectivity)来处理数据库连接。 Spring框架是这个项目的核心,版本为5.0.4。Spring 5.0...

    目录服务和+JNDI

    JNDI(Java Naming and Directory Interface)是Java平台提供的一种标准接口,用于访问各种命名和目录服务。它提供了一种统一的方式,使得Java应用程序可以透明地访问不同的命名和目录服务,如LDAP、DNS等。 **特点...

    uts1.2+JNDI+JDK1.5+MySql

    JNDI是Java应用中的服务定位器,它提供了一种标准的方式来查找和访问各种命名和目录服务。在Java Web应用中,JNDI常用于查找数据源(DataSource),使得应用可以透明地连接到数据库,如MySQL。 5. **JDK 1.5**: ...

    SpringMVC+JNDI+Tomcat配置数据源

    JNDI作为一组API,提供了Java应用程序访问命名和目录服务的能力,通过名称和对象之间的关联,开发者可以方便地使用这些名称来访问对象。在本文档中,我们将详细探讨如何在Tomcat环境下使用SpringMVC与JNDI配置数据源...

    JNDI jsp+jndi

    我知道好多人在做JNDI的时候都报了错,tomcat5和tomcat6配置都是一样的,不要听别人在哪里忽悠,我今晚做过测试的,现在我做了一个小例子,jar包我没有放进来,1.就是必须把数据库驱动必须加在tomcat的lib目录下,当前项目...

    fscontext+providerutil+jndi+dns.jar

    JNDI开发jar 本软件包是JNDI的"文件系统服务提供者",解压缩后,将lib文件夹下的providerutil.jar及fscontext.jar添加到classpath,即可实现有关文件系统的命名\目录服务.

    tomcat6+jndi+c3p0配置数据库连接池

    在IT行业中,数据库连接池是优化数据库访问性能和资源管理的重要技术。本示例主要讲解如何在Tomcat6中结合JNDI(Java Naming and Directory Interface)和C3P0库来配置数据库连接池,这对于初学者理解Web应用服务器...

    jboss配置MySql的JNDI

    JNDI作为Java平台的标准命名和目录接口,用于查找和管理分布式环境中的对象和服务,包括数据库连接等资源。通过在JBoss中配置JNDI数据源,可以实现应用程序与数据库之间的解耦,提高系统的可维护性和扩展性。 ### ...

    java jndi的使用

    Java JNDI(Java Naming and Directory Interface)是Java平台中用于访问命名和目录服务的一组API。它允许Java开发者在应用程序中查找和绑定资源,如数据源、EJB(Enterprise JavaBeans)、邮件服务器等。JNDI的核心...

    springboot-jndi.zip

    附件为springboot+jndi+tomcat的事例代码, 工程中的jndi.txt有详细说明

    java 采用JNDI访问数据库(三种方法)

    Java 通过JNDI(Java Naming and Directory Interface)访问数据库是一种常见的做法,它提供了一种标准的方法来查找和管理资源,如数据源、EJB、邮件服务器等。JNDI在企业级应用中广泛使用,因为它允许应用程序与...

    eclipse+mysql+tomcat配置JNDI

    JNDI是Java平台中的一种标准服务,它提供了一个统一的接口来查找和管理各种命名和目录服务。 首先,我们来理解一下JNDI的作用。JNDI允许Java应用通过一个全局的名字来查找和绑定数据源或者其他服务,如邮件服务器或...

    jndi-1_2_1.zip_jndi_jndi-1.2.1.jar

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问和管理命名和目录服务的一组接口和类。它提供了一种标准的方式来查找和访问多种类型的资源,如数据源、对象服务、邮件服务器等。JNDI的核心理念是...

    jndi-tool JNDI服务利用工具

    JNDI(Java Naming and Directory Interface)是Java平台提供的一种标准接口,用于访问命名和目录服务。它允许程序查找和操作存储在不同类型的命名或目录服务中的对象,如 LDAP(Lightweight Directory Access ...

Global site tag (gtag.js) - Google Analytics