基於AnypointStudio IDE開發MuleESB實例

基於AnypointStudio IDE開發MuleESB實例

本文部分內容引用https://www.cnblogs.com/enjoyingsoft/p/10132360.html,在此,對原著作者表示感謝。

一、AnypointStudio IDE環境的安裝

1.安裝jdk1.8以上

2.MuleESB分為社區版和企業版,兩者的區別如下:

基於AnypointStudio IDE開發MuleESB實例


3.mule esb的開發,主要是在AnypointStudio IDE環境下開發的,所以首先需要下載一個AnypointStudio IDE,本文下載的是6.6.4版本。安裝過程和eclipse一樣。

由於Anypoint Studio默認只內嵌了Mule ESB企業版運行環境,如果你想使用社區版的話,我們還需要安裝Mule ESB社區版運行環境。

安裝社區版運行環境,可以使用下列步驟。

點擊Help/Install New Software...菜單

在Work with下拉框中選擇Mule Runtimes for Anypoint Studio

基於AnypointStudio IDE開發MuleESB實例


選中Mule ESB Server Runtime 3.9.0 CE,CE就是Community Edition,社區版的意思。然後點擊Next一直到完成。

本例是實現一個cxf的webservice服務封裝為http服務。

首先,需要自行開發一個webservice的服務端程序。

基於AnypointStudio IDE開發MuleESB實例

<code> <dependencies>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter/<artifactid>

/<dependency>

<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-test/<artifactid>
<scope>test/<scope>
<exclusions>
<exclusion>
<groupid>org.junit.vintage/<groupid>
<artifactid>junit-vintage-engine/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>

<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>



<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web-services/<artifactid>
<version>2.2.5.RELEASE/<version>
/<dependency>

<dependency>
<groupid>org.apache.cxf/<groupid>
<artifactid>cxf-spring-boot-starter-jaxws/<artifactid>
<version>3.3.5/<version>
/<dependency>

<dependency>
<groupid>commons-io/<groupid>
<artifactid>commons-io/<artifactid>
<version>2.5/<version>
/<dependency>

/<dependencies>/<code>
基於AnypointStudio IDE開發MuleESB實例


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@WebService(name = "helloService",targetNamespace="http://service.cxf.cbi.com/")

public interface HelloService {

@WebMethod

String sayHello(@WebParam(name="param") Person person);

}

@Service

@WebService(targetNamespace="http://service.cxf.cbi.com/",

serviceName = "helloService",

endpointInterface = "com.cbi.cxf.server.service.HelloService")

public class HelloServiceImpl implements HelloService {

@Override

public String sayHello(@WebParam(name="param") Person person) {

System.out.println("receive:"+person.getName()+","+person.getAge());

return "hello,"+person.getName()+","+person.getAge();

}

}

  

基於AnypointStudio IDE開發MuleESB實例

<code>@Configuration
public class WebServiceConfig {

@Autowired
private HelloService helloService;

@Autowired
private SpringBus springBus;

@Bean(name = "helloServiceEndPoint")
public Endpoint endpoint() {
EndpointImpl endpoint=new EndpointImpl(springBus, helloService);//綁定要發佈的服務
endpoint.publish("/helloWs"); //顯示要發佈的名稱
return endpoint;
}/<code>
基於AnypointStudio IDE開發MuleESB實例

基於AnypointStudio IDE開發MuleESB實例

<code>public class Person implements Serializable {

private static final long serialVersionUID = 1L;

private String name;

private String age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String string) {
this.age = string;
}

}/<code>
基於AnypointStudio IDE開發MuleESB實例

服務端程序開發完成之後啟動,訪問http://localhost:8080/cxf/webServices/helloWs?wsdl,即可得到如下wsdl:

基於AnypointStudio IDE開發MuleESB實例

<code><definitions>
<types>
<schema>
<element>
<element>
<complextype>
<sequence>
<element>
/<sequence>
/<complextype>
<complextype>
<sequence>
<element>
<element>
/<sequence>
/<complextype>
<complextype>
<sequence>
<element>
/<sequence>
/<complextype>
/<schema>
/<types>
<message>
<part> /<part>
/<message>
<message>
<part> /<part>
/<message>
<porttype>
<operation>
<output> /<output>
/<operation>
/<porttype>
<binding>
<binding>
<operation>
<operation>
<body>
/<input>
<output>
<body>
/<output>
/<operation>
/<binding>
<service>
<port>
<address>

/<port>
/<service>
/<definitions>/<code>
基於AnypointStudio IDE開發MuleESB實例

6.使用AnypointStudio開發mule ESB的服務。

基於AnypointStudio IDE開發MuleESB實例


根據實際選擇運行環境,一直next下去,完成即可。


基於AnypointStudio IDE開發MuleESB實例

工程依賴包:

基於AnypointStudio IDE開發MuleESB實例


工程http2webservice創建好之後,按照區域1拖拽出流程,按照區域3編寫java代碼,區域2是在拖拽流程的過程中,可以搜索需要的組件。

基於AnypointStudio IDE開發MuleESB實例

<code>public class Person implements Serializable {


private static final long serialVersionUID = 1L;

private String name;

private String age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String string) {
this.age = string;
}


}/<code>
基於AnypointStudio IDE開發MuleESB實例

基於AnypointStudio IDE開發MuleESB實例

<code>public class Trans  extends AbstractMessageTransformer{

@Override
public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {

String xml="";
try {
xml=message.getPayloadAsString();
Document doc=DocumentHelper.parseText(xml);
Element root=doc.getRootElement();


Person person=new Person();


person.setName(root.element("name").getText());
person.setAge(root.element("age").getText());


JSONObject node = new JSONObject();

node.put("param", person);
System.out.println("node==================="+node);

Map<string> newMap=TransUtil.parseJSONToMap(node.toString());
System.out.println("newMap==================="+newMap);

xml=TransUtil.parseMapToXML(newMap, "sayHello", "http://service.cxf.cbi.com/");

} catch (Exception e) {
e.printStackTrace();
}
System.out.println("xml==================="+xml);
return xml;
}

}/<string>/<code>
基於AnypointStudio IDE開發MuleESB實例

基於AnypointStudio IDE開發MuleESB實例

<code>public class ReturnTrans  extends AbstractMessageTransformer{

@Override
public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {


Object payload=message.getPayload();

DepthXMLStreamReader xmlreader=(DepthXMLStreamReader) payload;

XMLStreamReader reader=xmlreader.getReader();

String returnxml="";

try {
while(reader.hasNext()) {

int point =reader.next();
if(point==XMLStreamReader.START_ELEMENT) {
String eleName=reader.getName().toString();
if("return".equals(eleName)) {
returnxml=reader.getElementText();
break;

}

}

}
} catch (XMLStreamException e) {

e.printStackTrace();
}
returnxml="<result>"+returnxml+"/<result>";

System.out.println("xml==================="+returnxml);
return returnxml;
}/<code>
基於AnypointStudio IDE開發MuleESB實例

基於AnypointStudio IDE開發MuleESB實例

<code>public class TransUtil {

public static Map<string> parseJSONToMap(String jsonStr){
Map<string> map = new HashMap<>();
JSONObject json = JSONObject.fromObject(jsonStr);
for (Object k : json.keySet()) {
Object v = json.get(k);
if (v instanceof JSONArray) {
List> list = new ArrayList<>();
Iterator<jsonobject> it = ((JSONArray) v).iterator();
while (it.hasNext()) {
JSONObject json2 = it.next();
list.add(parseJSONToMap(json.toString()));
}
map.put(k.toString(), list);
} else {

map.put(k.toString(), v);
}

}
return map;

}
public static String parseMapToXML(Map<string> map,String method,String nameSpace) {

if (map == null) return null;
JSONObject json = JSONObject.fromObject(map);
XMLSerializer ser = new XMLSerializer();
ser.setRootName("tem:" + method);
ser.write(json);
ser.setNamespace("tem", nameSpace);
ser.setTypeHintsEnabled(false);
String result = ser.write(json, "UTF-8");
return result;

}

public static Map<string> multilayerXmlToMap(String xml) {
Document doc = null;
try {
doc = DocumentHelper.parseText(xml);
} catch (DocumentException e) {
e.printStackTrace();
}
Map<string> map = new HashMap<>();
if (null == doc) {
return map;
}
// 獲取根元素
Element rootElement = doc.getRootElement();
recursionXmlToMap(rootElement,map);
return map;
}

/**
* multilayerXmlToMap核心方法,遞歸調用
*
* @param element 節點元素
* @param outmap 用於存儲xml數據的map
*/
private static void recursionXmlToMap(Element element, Map<string> outmap) {
// 得到根元素下的子元素列表
List<element> list = element.elements();

int size = list.size();
if (size == 0) {
// 如果沒有子元素,則將其存儲進map中
outmap.put(element.getName(), element.getTextTrim());
} else {
// innermap用於存儲子元素的屬性名和屬性值
Map<string> innermap = new HashMap<>();
// 遍歷子元素
list.forEach(childElement -> recursionXmlToMap(childElement, innermap));
outmap.put(element.getName(), innermap);
}
}

}/<string>/<element>/<string>/<string>/<string>/<string>/<jsonobject>
/<string>/<string>/<code>
基於AnypointStudio IDE開發MuleESB實例


基於AnypointStudio IDE開發MuleESB實例


基於AnypointStudio IDE開發MuleESB實例


基於AnypointStudio IDE開發MuleESB實例


基於AnypointStudio IDE開發MuleESB實例


基於AnypointStudio IDE開發MuleESB實例


基於AnypointStudio IDE開發MuleESB實例


基於AnypointStudio IDE開發MuleESB實例


按照如上圖的配置完成之後,可以啟動工程。在工程上右鍵run as mule application即可。

7.測試

cxf服務客戶端測試:

方式一:動態調用

基於AnypointStudio IDE開發MuleESB實例

<code>public class TestClient {

public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException, InstantiationException {
// 創建動態客戶端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/cxf/webServices/helloWs?wsdl");
// 需要密碼的情況需要加上用戶名和密碼
// client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD));
Object[] result = null;
//loadClass路徑是命名空間+po類名,不是Po的包路徑+po類名
Object po = Thread.currentThread().getContextClassLoader().loadClass("com.cbi.cxf.service.Person").newInstance();//加載類為服務端自定義對象命名空間
Method method = po.getClass().getMethod("setName", String.class);//調用set方法設置參數
method.invoke(po, "卓寶貝");
method = po.getClass().getMethod("setAge", String.class);//調用set方法設置參數

method.invoke(po, "6");

Object[] parameters = new Object[]{po};
try {
result = client.invoke("sayHello", parameters);//uploadcs為接口方法
System.out.println(result[0].toString());
} catch (Exception e) {
e.printStackTrace();
}

}/<code>
基於AnypointStudio IDE開發MuleESB實例

方式二:靜態調用

基於AnypointStudio IDE開發MuleESB實例

<code>public class TestClient2 {
public static void main(String[] args) {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress("http://localhost:8080/cxf/webServices/helloWs?wsdl");
factory.setServiceClass(HelloService.class);//服務端接口類
Person person = new Person();//自定義對象參數
person.setName("卓寶貝");
person.setAge("6");
HelloService service = (HelloService) factory.create();
String results = service.sayHello(person);//sayHello為接口方法
System.out.println(results);
}
}/<code>
基於AnypointStudio IDE開發MuleESB實例

兩種方式測試原始的webservice接口的結果相同,如下:

hello,卓寶貝,6

使用postman測試封裝的http接口:post方式 http://127.0.0.1:8081/http2webservice/hello


基於AnypointStudio IDE開發MuleESB實例


返回結果說明:

如果返回結果要和原始的webservice接口保持一致,流程圖中的最後一個節點需要去掉。

如果返回結果需要用json表示,則需要在ReturnTrans類中或者在webservice接口返回時,先拼接成xml格式,然後xml to json節點才會正確轉換,否則會報錯,如下:


最終獲得的結果json格式如下:

<code>{
"result": "hello,卓寶貝,6"
}/<code>



分享到:


相關文章: