【问题标题】:chunking soap web service using axis2 in java?在java中使用axis2分块soap Web服务?
【发布时间】:2021-10-13 02:10:59
【问题描述】:

我在 java 中实现了一个肥皂网络服务的调用 我有一个 wsdl 文件,我使用 axis2 中的嵌入式 wsdl2java 导入了该文件
然后我能够调用网络服务并且它工作正常 util 请求的大小超过了 30 兆 输出请求包含以下参数:

<param1>some value</param1>
<array>
   recored1
   recored2
   .
   .
   .
</array>

我能够发送 500000 次重新编码,但是当超过这个数字时,我遇到了“java 堆空间错误” 问题是有没有办法以小块发送soap请求......并且使用xmlbeans导入WSDL会影响性能 对于其他 API,我能够为块添加传输编码并以小块的形式提供它的主体,但对于肥皂服务,我没有找到解决方案,如果有任何示例,我将不胜感激.. 提前致谢

【问题讨论】:

    标签: java soap axis2 chunks


    【解决方案1】:

    流式传输一个事务要求所有涉及管道的步骤都采用流式传输方式。如果其中一个崩溃了流(即myStream.collect(toList())),那么流式处理将被中断,此时所有输入流都将进入内存(可能会被过滤、减少……)。

    一般来说,要以流方式(在axis2下)处理XML输入,您可以使用Axiom,以流方式处理的简单示例是(from here):

    public void processFragments(InputStream in) throws XMLStreamException {
        // Create an XMLStreamReader without building the object model
        XMLStreamReader reader =
            OMXMLBuilderFactory.createOMBuilder(in).getDocument().getXMLStreamReader(false);
        while (reader.hasNext()) {
            if (reader.getEventType() == XMLStreamReader.START_ELEMENT &&
                    reader.getName().equals(new QName("tag"))) {
                // A matching START_ELEMENT event was found. Build a corresponding OMElement.
                OMElement element = 
                    OMXMLBuilderFactory.createStAXOMBuilder(reader).getDocumentElement();
                // Make sure that all events belonging to the element are consumed so
                // that the XMLStreamReader points to a well defined location (namely the
                // event immediately following the END_ELEMENT event).
                element.build();
                // Now process the element.
                processFragment(element);
            } else {
                reader.next();
            }
        }
    }
    

    虽然您可以打开一个 HTTP 流并使用这个 sn-p,但不幸的是,将其转换为您的自动生成的客户端并不容易。

    创建 AXIOM 客户端不太方便,因为您必须处理 AXIOM 对象,from the documentation

    private static EndpointReference targetEPR = 
        new EndpointReference("http://localhost:8080/axis2/services/StockQuoteService");
    
    public static OMElement getPricePayload(String symbol) {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");
    
        OMElement method = fac.createOMElement("getPrice", omNs);
        OMElement value = fac.createOMElement("symbol", omNs);
        value.addChild(fac.createOMText(value, symbol));
        method.addChild(value);
        return method;
    }
    
    public static OMElement updatePayload(String symbol, double price) {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");
    
        OMElement method = fac.createOMElement("update", omNs);
    
        OMElement value1 = fac.createOMElement("symbol", omNs);
        value1.addChild(fac.createOMText(value1, symbol));
        method.addChild(value1);
    
        OMElement value2 = fac.createOMElement("price", omNs);
        value2.addChild(fac.createOMText(value2,
                                         Double.toString(price)));
        method.addChild(value2);
        return method;
    }
    
    public static void main(String[] args) {
        try {
            OMElement getPricePayload = getPricePayload("WSO");
            OMElement updatePayload = updatePayload("WSO", 123.42);
            Options options = new Options();
            options.setTo(targetEPR);
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
    
            ServiceClient sender = new ServiceClient();
            sender.setOptions(options);
    
            sender.fireAndForget(updatePayload);
            System.err.println("price updated");
            OMElement result = sender.sendReceive(getPricePayload);
    
            String response = result.getFirstElement().getText();
            System.err.println("Current price of WSO: " + response);
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    然后您可以以流式方式消化响应:

    result.getFirstElement().getText()
    

    如果您的 WSDL 定义很复杂,可能只适合为大事务编写 AXIOM 客户端,但如果您可以拆分调用,那将是一个更好的方法。

    【讨论】:

    • 谢谢亲爱的,我刚刚编辑了 java 堆大小作为解决方案,您的方法似乎有效,但需要进行一些重大修改,我现在只坚持解决方法
    • @kikicoder 建立更大的堆并不能解决问题,只会延迟它。无论如何,我的回答是针对您的“问题是有没有办法以小块发送soap请求”我认为是正确的。
    • 亲爱的,再次感谢您我同意您的看法,我只是急于寻找解决方案,直到我可以实施您的解决方案
    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2012-08-09
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多