webservice 的日常:webservice的测试之camel

webservice 的日常:webservice的测试之camel

1.webservice的测试.

简介

使用camel-cxf测试webservice
依赖:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cxf</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

新增camel客户端配置:

@Component
@Slf4j
public class CamelClient {
    private final CamelContext camelContext;

    private final ProducerTemplate template;

    @Autowired
    private CamelTLSFactory camelTLSFactory;

    CamelClient() {
        this.camelContext = new DefaultCamelContext();
        this.template = this.camelContext.createProducerTemplate();
    }

    @PostConstruct
    public void init() throws Exception {
        camelContext.disableJMX();
        camelContext.start();
    }

    private void configureTLS(CxfEndpoint cxfEndpoint) {
        Bus bus = new SpringBus();
        ConduitInitiatorManager cim = bus.getExtension(ConduitInitiatorManager.class);
        if (cim != null) {
            cim.registerConduitInitiator(TRANSPORT_ID, camelTLSFactory);
            cxfEndpoint.setTransportId(TRANSPORT_ID);
            cxfEndpoint.setBus(bus);
        }
    }

    public void addRoute(String endpoint, String url) throws Exception {
        camelContext.addRoutes(new RouteBuilder() {
            @Override
            public void configure() {

                CxfEndpoint cxfEndpoint = (CxfEndpoint) getContext().getEndpoint("cxf:" + url);
                configureTLS(cxfEndpoint);
//                cxfEndpoint.setServiceClass(RseSoapApiPortType.class); // HelloApiPort,正常ws经常xjc插件生成的对象
                cxfEndpoint.setDefaultOperationName("方法名,即action:urn对应的名称");
                cxfEndpoint.setBindingId(SOAPBinding.SOAP12HTTP_BINDING);
                cxfEndpoint.setSynchronous(true);

                from("direct:" + endpoint).routeId(endpoint).process(e -> {
                    if (e == null) {
                        return;
                    }
                    Object req = e.getIn().getBody();
                    e.getOut()
                            .setHeader(CxfConstants.OPERATION_NAME, e.getProperties().get(CxfConstants.OPERATION_NAME));
                    setSessionHeader(e);
                    e.getOut().setBody(req);
                }).to(cxfEndpoint).process(e -> {
                    if (e == null) {
                        return;
                    }
                    Class retType = (Class) e.getProperties().get("ReturnType");
                    e.getOut().setBody(e.getIn().getBody(retType));
                });
            }
        });
    }

    public void removeRoute(String uuID) {
        try {
            camelContext.stopRoute(uuID);
            camelContext.removeRoute(uuID);
        } catch (Exception e) {
//            log.error("Failed to remove Route {}", uuID, e);
        }
    }

    private void setSessionHeader(Exchange e) throws JAXBException {
        // Qname填写自定义的命名空间和header
        SoapHeader hdr = new SoapHeader(new QName("Namespace", "SessionHead"),
                new JAXBDataBinding("Header".getClass()));

        List<SoapHeader> soapHeaders = new ArrayList<>();
        soapHeaders.add(hdr);
        e.getOut().setHeader(Header.HEADER_LIST, soapHeaders);
    }

    public Object send(String uuID, String rseOperation, Object req, Class clazz, String sessionID) throws Exception {
        Exchange exchange = new DefaultExchange(camelContext);
        exchange.getIn().setBody(req);
        if (sessionID != null) {
            exchange.getProperties().put("sessionID", sessionID);
        }
        exchange.getProperties().put("ReturnType", clazz);
        exchange.getProperties().put(CxfConstants.OPERATION_NAME, rseOperation);
        template.send("direct:"+ uuID, exchange);
        Exception throwable = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
        if (throwable != null) {
            throw throwable;
        }
        return exchange.getOut().getBody();
    }

    @PreDestroy
    public void destroy() throws Exception {
//        template.cleanUp();
        camelContext.stop();
    }
}
@Slf4j
@Component
class CamelTLSFactory implements ConduitInitiator {
    private final HTTPTransportFactory factory = new HTTPTransportFactory();

    @Override
    public Conduit getConduit(EndpointInfo endpointInfo, Bus bus) throws IOException {
        HTTPConduit httpConduit = (HTTPConduit) factory.getConduit(endpointInfo, bus);
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(3000);
        httpClientPolicy.setReceiveTimeout(3000);
        httpConduit.setClient(httpClientPolicy);
        httpConduit.setTlsClientParameters(createTlsClientParameters());
        return httpConduit;
    }

    @Override
    public Conduit getConduit(EndpointInfo endpointInfo, EndpointReferenceType target, Bus bus) throws IOException {
        HTTPConduit httpConduit = (HTTPConduit) factory.getConduit(endpointInfo, target, bus);
        httpConduit.setTlsClientParameters(createTlsClientParameters());
        return httpConduit;
    }

    @Override
    public Set<String> getUriPrefixes() {
        return factory.getUriPrefixes();
    }

    @Override
    public List<String> getTransportIds() {
        return factory.getTransportIds();
    }

    private TLSClientParameters createTlsClientParameters() throws IOException {
        TLSClientParameters tlsClientParameters = new TLSClientParameters();

        // DisableCNCheck
        tlsClientParameters.setDisableCNCheck(true);

        try {
            tlsClientParameters.setTrustManagers(new TrustManager[] {new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {

                }

                @Override
                public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {

                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            }});

        } catch (Exception e) {
            log.error("error when set KeyStore", e);
            throw new IOException(e.getMessage());
        }

        return tlsClientParameters;
    }
}

测试类:

    @Autowired
    private CamelClient camelClient;

    @PostMapping("/camel")
    public void testCamel() throws Exception {
        camelClient.addRoute("test", "http://localhost:8080/services/Hello?wsdl");
        camelClient.send("test", "hello", new HelloRequest(), HelloResponse.class, "1234");
        camelClient.removeRoute("test");
    }

ps:
camel请求配置相对复杂,但配置属性详细,适合实际场景应用。

githup:
webservice源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的Java实现,用于将PLM系统中的物料数据传输到ERP系统中。 首先,需要创建一个Java类来实现webservice接口。您可以使用JAX-WS来创建webservice,它是Java API for XML Web Services的缩写。以下是一个示例代码: ```java import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; @WebService public class PLMtoERPWebService { @WebMethod public String transferMaterialData(@WebParam(name = "materialData") String materialData) { // 在这里编写将materialData传输到ERP系统的代码 return "Material data transfer successful!"; } } ``` 在这个示例代码中,我们使用@WebService注释来标识这是一个webservice接口。@WebMethod注释用于标识我们要暴露给外部调用的方法。在这里,我们只需要一个方法来传输物料数据。 在该方法中,我们使用@WebParam注释来指定方法的参数名为“materialData”。在方法体中,我们可以编写将物料数据传输到ERP系统的代码。在这里,我们假设您已经知道如何将数据传输到ERP系统,因此这里的代码略过。 最后,我们只需要将该类发布为webservice即可。您可以使用Java SE中自带的工具wsimport来生成客户端代码。以下是一个示例代码: ```java import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; public class PLMtoERPWebServiceClient { public static void main(String[] args) throws Exception { URL url = new URL("http://localhost:8080/plm-to-erp-webservice?wsdl"); QName qname = new QName("http://webservice.example.com/", "PLMtoERPWebServiceService"); Service service = Service.create(url, qname); PLMtoERPWebService plmToErpWebService = service.getPort(PLMtoERPWebService.class); String materialData = "Material data"; String response = plmToErpWebService.transferMaterialData(materialData); System.out.println(response); } } ``` 在这个示例代码中,我们使用了Java SE中的Service类来创建一个webservice客户端。我们首先指定了webservice的WSDL地址和服务名称,然后通过getServicePort方法获取接口的代理类。最后,我们可以调用代理类中的方法来远程调用webservice接口。 以上就是一个简单的Java实现,用于将PLM系统中的物料数据传输到ERP系统中。您可以根据实际需求进行修改和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值