You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by vi...@apache.org on 2016/12/25 09:13:10 UTC

incubator-rocketmq git commit: Develop a vendor-neutral open standard for distributed messaging 1, add MessagingEndPoint

Repository: incubator-rocketmq
Updated Branches:
  refs/heads/spec 591dea838 -> 57e775a83


Develop a vendor-neutral open standard for distributed messaging
1, add MessagingEndPoint


Project: http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/commit/57e775a8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/tree/57e775a8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/diff/57e775a8

Branch: refs/heads/spec
Commit: 57e775a833068e54d279c3cb5da38b43a5cf0515
Parents: 591dea8
Author: vintagewang <vi...@apache.org>
Authored: Sun Dec 25 17:12:57 2016 +0800
Committer: vintagewang <vi...@apache.org>
Committed: Sun Dec 25 17:12:57 2016 +0800

----------------------------------------------------------------------
 .../apache/openmessaging/MessagingEndPoint.java | 25 ++++++++
 .../openmessaging/MessagingEndPointManager.java | 43 +++++++++++++
 .../internal/MessagingEndPointFactory.java      | 38 +++++++++++
 .../internal/ServiceConstants.java              | 35 +++++++++++
 .../internal/ServiceEndPointAdapter.java        | 66 ++++++++++++++++++++
 .../openmessaging/internal/URISpecParser.java   | 63 +++++++++++++++++++
 6 files changed, 270 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/blob/57e775a8/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/MessagingEndPoint.java
----------------------------------------------------------------------
diff --git a/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/MessagingEndPoint.java b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/MessagingEndPoint.java
new file mode 100644
index 0000000..5d90ae2
--- /dev/null
+++ b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/MessagingEndPoint.java
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.openmessaging;
+
+/**
+ * @author vintagewang@apache.org
+ * @since 2016-12-25
+ */
+public interface MessagingEndPoint {
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/blob/57e775a8/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/MessagingEndPointManager.java
----------------------------------------------------------------------
diff --git a/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/MessagingEndPointManager.java b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/MessagingEndPointManager.java
new file mode 100644
index 0000000..3dfffb0
--- /dev/null
+++ b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/MessagingEndPointManager.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.openmessaging;
+
+import org.apache.openmessaging.internal.MessagingEndPointFactory;
+import org.apache.openmessaging.internal.URISpecParser;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * @author vintagewang@apache.org
+ * @since 2016-12-25
+ */
+public class MessagingEndPointManager {
+    public static MessagingEndPoint getMessagingEndPoint(String url) throws Exception {
+        return getMessagingEndPoint(url, new Properties());
+    }
+
+    public static MessagingEndPoint getMessagingEndPoint(String url, Properties properties) throws Exception {
+        Map<String, List<String>> driverUrl = URISpecParser.parseURI(url);
+        if (null == driverUrl || driverUrl.size() == 0) {
+            throw new IllegalArgumentException("driver url parsed result.size ==0");
+        }
+        return MessagingEndPointFactory.createServiceEndPoint(driverUrl, properties);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/blob/57e775a8/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/MessagingEndPointFactory.java
----------------------------------------------------------------------
diff --git a/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/MessagingEndPointFactory.java b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/MessagingEndPointFactory.java
new file mode 100644
index 0000000..5c4990a
--- /dev/null
+++ b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/MessagingEndPointFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.openmessaging.internal;
+
+import org.apache.openmessaging.MessagingEndPoint;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+
+public class MessagingEndPointFactory {
+    public static MessagingEndPoint createServiceEndPoint(Map<String, List<String>> url, Properties properties)
+            throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
+            InstantiationException, IllegalAccessException {
+        List<String> driver = url.get(ServiceConstants.SPI_NAME);
+        List<String> urls = url.get(ServiceConstants.URL_NAME);
+        if (urls != null && urls.size() > 0)
+            properties.put(ServiceConstants.URL, urls.get(0));
+        return ServiceEndPointAdapter.instantiateServiceEndPoint(driver.get(0), properties);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/blob/57e775a8/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/ServiceConstants.java
----------------------------------------------------------------------
diff --git a/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/ServiceConstants.java b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/ServiceConstants.java
new file mode 100644
index 0000000..42e867a
--- /dev/null
+++ b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/ServiceConstants.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.openmessaging.internal;
+
+public class ServiceConstants {
+    public static final String PROTOCOL_NAME = "protocol";
+    public static final String SPI_NAME = "spi";
+    public static final String URL_NAME = "urls";
+    public static final String URL = "url";
+    public static final String DISCOVERY_URL = "service.discovery.url";
+    public static final String DEFAULT_SERVICE_END_POINT = "aliRelay";
+    public static final String DEFAULT_SERVICE_IMPL = "com.alibaba.jukola.java.sdk.ServiceEndPointStandardImpl";
+    public static final String DEFAULT_SERVICE_DISCOVERY_URL = "http://jukola.alibaba.com:8443";
+    public static final String NAMESPACE_ID = "method.namespace.id";
+    public static final String URL_SEPARATOR = ":";
+    public static final String LIST_SEPARATOR = ",";
+    public static final String PARAM_SEPARATOR = "&";
+    public static final String KV_SEPARATOR = "=";
+    public static final String SERVICE_DISCOVER_PROTOCOL = "http";
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/blob/57e775a8/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/ServiceEndPointAdapter.java
----------------------------------------------------------------------
diff --git a/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/ServiceEndPointAdapter.java b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/ServiceEndPointAdapter.java
new file mode 100644
index 0000000..19b5733
--- /dev/null
+++ b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/ServiceEndPointAdapter.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.openmessaging.internal;
+
+
+import org.apache.openmessaging.MessagingEndPoint;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+
+public class ServiceEndPointAdapter {
+    private static Map<String, String> serviceEndPointClassMap = new HashMap<String, String>();
+
+    static {
+        serviceEndPointClassMap.put(ServiceConstants.DEFAULT_SERVICE_END_POINT,
+                ServiceConstants.DEFAULT_SERVICE_IMPL);
+    }
+
+    static MessagingEndPoint instantiateServiceEndPoint(String url, Properties properties)
+            throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException,
+            InvocationTargetException, InstantiationException {
+        String serviceImpl = ServiceConstants.DEFAULT_SERVICE_IMPL;
+        if (serviceEndPointClassMap.containsKey(url))
+            serviceImpl = serviceEndPointClassMap.get(url);
+        Class<?> serviceEndPointClass = Class.forName(serviceImpl);
+        if (serviceEndPointClass == null)
+            return null;
+
+        String serviceUrl = ServiceConstants.DEFAULT_SERVICE_DISCOVERY_URL;
+        if (properties.get(ServiceConstants.URL) != null) {
+            String[] propertySplits = ((String) properties.get(ServiceConstants.URL)).split(ServiceConstants.PARAM_SEPARATOR);
+            if (propertySplits.length > 0) {
+                serviceUrl = propertySplits[0];
+                for (int index = 1; index < propertySplits.length; index++) {
+                    String[] kv = propertySplits[index].split(ServiceConstants.KV_SEPARATOR);
+                    properties.put(kv[0], kv[1]);
+                }
+            }
+        }
+        properties.remove(ServiceConstants.URL);
+        properties.put(ServiceConstants.DISCOVERY_URL, serviceUrl);
+        Class[] paramTypes = {Properties.class};
+        Constructor constructor = serviceEndPointClass.getConstructor(paramTypes);
+        assert constructor != null;
+        return (MessagingEndPoint) constructor.newInstance(properties);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq/blob/57e775a8/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/URISpecParser.java
----------------------------------------------------------------------
diff --git a/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/URISpecParser.java b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/URISpecParser.java
new file mode 100644
index 0000000..cbe07ba
--- /dev/null
+++ b/spec/code/messaging-user-level-api/java/src/main/java/org/apache/openmessaging/internal/URISpecParser.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.openmessaging.internal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author xuanyin
+ */
+public class URISpecParser {
+    public static Map<String, List<String>> parseURI(String uri) {
+        if (uri == null || uri.length() == 0) {
+            return new HashMap<String, List<String>>();
+        }
+
+        int spiIndex = 0;
+        int index = uri.indexOf(ServiceConstants.URL_SEPARATOR);
+        Map<String, List<String>> results = new HashMap<String, List<String>>();
+        String protocol = uri.substring(0, index);
+        List<String> protocolSet = new ArrayList<String>();
+        protocolSet.add(protocol);
+        results.put(ServiceConstants.PROTOCOL_NAME, protocolSet);
+        if (index > 0) {
+            String spi;
+            spiIndex = uri.indexOf(ServiceConstants.URL_SEPARATOR, index + 1);
+            if (spiIndex > 0) {
+                spi = uri.substring(index + 1, spiIndex);
+            } else {
+                spi = uri.substring(index + 1);
+            }
+            List<String> spiSet = new ArrayList<String>();
+            spiSet.add(spi);
+            results.put(ServiceConstants.SPI_NAME, spiSet);
+        }
+        if (spiIndex > 0) {
+            String urlList = uri.substring(spiIndex + 1);
+            String[] list = urlList.split(ServiceConstants.LIST_SEPARATOR);
+            if (list.length > 0) {
+                results.put(ServiceConstants.URL_NAME, Arrays.asList(list));
+            }
+        }
+        return results;
+    }
+}