`
819342090
  • 浏览: 5493 次
文章分类
社区版块
存档分类
最新评论

mule传附件attachment

阅读更多

HTTP Endpoint

重写mule源代码中的HttpMultipartMuleMessageFactory.java

 

package com.rakuten.api.cabinet.factory;

import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import javax.activation.DataHandler;
import org.mule.DefaultMuleMessage;
import org.mule.api.MuleContext;
import org.mule.transport.http.HttpMuleMessageFactory;
import org.mule.transport.http.HttpRequest;
import org.mule.transport.http.multipart.MultiPartInputStream;
import org.mule.transport.http.multipart.Part;
import org.mule.transport.http.multipart.PartDataSource;

import com.rakuten.api.cabinet.constants.CabinetFlowConstants;

/**
 *
 * Corretion Alexis ANASTASSIADES ___  alexis - at - ezanas.com
 * @author ldns_zhuling
 */
public class HttpMultipartMuleMessageFactory extends HttpMuleMessageFactory {
    /** parts */
    private Collection<Part> parts;
    /**
     *
     * @param context context
     */
    public HttpMultipartMuleMessageFactory(MuleContext context) {
        super(context);
    }

    @Override
    protected Object extractPayloadFromHttpRequest(HttpRequest httpRequest) throws IOException
    {
        Object body = null;
        String contentType = httpRequest.getContentType();
        if (contentType.toLowerCase().contains("multipart/form-data")) {
            // modify multipart/form-data to lower case
            // 可能出现大小写的contentType,需要全部转为小写的
            contentType = contentType.replace(contentType.substring(0,
                    CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART.length()),
                    CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART);
            MultiPartInputStream in = new MultiPartInputStream(httpRequest.getBody(),
                    contentType, null);

            // We need to store this so that the headers for the part can be read
            parts = in.getParts();
            for (Part part : parts) {
                //将名为xml的附件内容放到message.payload中,这个根据项目传进来的附件名进行修改
                if ("xml".equals(part.getName())) {
                    body = part.getInputStream();
                    break;
                }
            }
        } else {
            body = super.extractPayloadFromHttpRequest(httpRequest);
        }

        return body;
    }

    @Override
    protected void addAttachments(DefaultMuleMessage message, Object transportMessage) throws Exception {
        if (parts != null) {
            try {
                for (Part part : parts) {
                    //将除了名为payload的其他所有的附件放到header中
                    //建议在附件使用完后,将附件删除,否则返回会出现错误
                    if (!"payload".equals(part.getName())) {
                        message.setInboundProperty(part.getName(), new DataHandler(new PartDataSource(part)));
                    }
                }
            } finally {
                // Attachments are the last thing to get processed
                parts.clear();
                parts = null;
            }
        }
    }

    @Override
    protected void convertMultiPartHeaders(Map<String, Object> headers) {
    }

}

 Servlet Endpoint

需要重写ServletMuleMessageFactory.java

package com.rakuten.api.cabinet.factory;

import java.util.Collection;
import javax.activation.DataHandler;
import javax.servlet.http.HttpServletRequest;

import org.mule.DefaultMuleMessage;
import org.mule.api.MuleContext;
import org.mule.transport.http.multipart.MultiPartInputStream;
import org.mule.transport.http.multipart.Part;
import org.mule.transport.http.multipart.PartDataSource;
import org.mule.transport.servlet.ServletMuleMessageFactory;

import com.rakuten.api.cabinet.constants.CabinetFlowConstants;

/**
 *
 * Corretion Alexis ANASTASSIADES ___  alexis - at - ezanas.com
 * @author ldns_zhuling
 */
public class ServletMultipartMuleMessageFactory extends ServletMuleMessageFactory {
    /** parts */
    private Collection<Part> parts;
    /**
     *
     * @param context context
     */
    public ServletMultipartMuleMessageFactory(MuleContext context) {
        super(context);
    }

    @Override
    protected Object extractPayloadFromPostRequest(HttpServletRequest request) throws Exception
    {
        Object body = null;
        String contentType = request.getContentType();
        if (contentType.toLowerCase().contains(CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART)) {
            // modify multipart/form-data to lower case
            contentType = contentType.replace(contentType.substring(0,
                    CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART.length()),
                    CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART);
            MultiPartInputStream in = new MultiPartInputStream(request.getInputStream(),
                    contentType, null);

            // We need to store this so that the headers for the part can be read
            parts = in.getParts();
            for (Part part : parts) {
                if ("xml".equals(part.getName())) {
                    body = part.getInputStream();
                    break;
                }
            }
        } else {
            //原代码中在获取body之前加了这句“request.getParameterNames();”
            //这句必须删掉,否则获取不到body,因为InputStream不能重复读取。
            body = request.getInputStream();
        }

        return body;
    }

    @Override
    protected void addAttachments(DefaultMuleMessage message, Object transportMessage) throws Exception {
        if (parts != null) {
            try {
                for (Part part : parts) {
                    if (!"payload".equals(part.getName())) {
                        message.setInboundProperty(part.getName(), new DataHandler(new PartDataSource(part)));
                    }
                }
            } finally {
                // Attachments are the last thing to get processed
                parts.clear();
                parts = null;
            }
        }
    }
}

 

然后需要在connector中调用该factory

    <http:connector name="defaultconnector" cookieSpec="netscape"
        doc:name="HTTP\HTTPS" receiveBacklog="0" receiveBufferSize="0"
        sendBufferSize="0" socketSoLinger="0" validateConnections="true">
        <dispatcher-threading-profile
            maxBufferSize="0" maxThreadsActive="${maximum.concurrency}"
            maxThreadsIdle="${maximum.concurrency}" poolExhaustedAction="WAIT"
            threadWaitTimeout="${inner.response.timeout}" />
        <service-overrides sessionHandler="org.mule.session.NullSessionHandler" messageFactory="com.rakuten.api.cabinet.factory.HttpMultipartMuleMessageFactory"/>
    </http:connector>

 

    <servlet:connector name="Servlet" doc:name="Servlet">
        <service-overrides messageFactory="com.rakuten.api.coupon.factory.ServletMuleMessageFactory"/>
    </servlet:connector>

 

 

分享到:
评论

相关推荐

    mule IDE (mule ESB)

    Mule ESB 是一个轻量级的基于java的企业服务总线和集成平台, 使得开发人员可以快速,简单的连接多个应用, 使得它们可以交换数据。 Mule ESB 容易集成现有异构系统,包括:JMS, Web Services, JDBC, HTTP, 等. ESB...

    mule文档详解 mule

    **Mule ESB详解** Mule ESB,全称为Mule Enterprise Service Bus,是由MuleSoft公司开发的一款强大且灵活的企业服务总线。它是一种中间件,旨在促进不同应用程序之间的数据交换,通过提供一个集成平台来连接各种...

    mule -esb 源码

    《深入解析Mule ESB源码》 Mule ESB(Enterprise Service Bus,企业服务总线)是一款开源的集成平台,旨在简化企业级应用之间的数据交互。本文将围绕Mule ESB的源码进行深入探讨,揭示其核心设计理念与工作原理。 ...

    mule开发环境搭建和部署

    "Mule开发环境搭建和部署" Mule是当前流行的企业服务总线(Enterprise Service Bus, ESB),它提供了一个灵活、可扩展、高性能的集成平台。构建Mule开发环境是Mule应用程序的基础,以下将对Mule开发环境的搭建和...

    mule web service exsample

    【Mule Web Service 示例】 Mule ESB(Enterprise Service Bus)是一种强大的集成平台,它允许开发者轻松地构建和部署分布式应用程序。在这个示例中,我们将深入探讨如何使用Mule来发布Web服务,这是一种允许不同...

    mule-standalone-3.9.0.zip

    Mule ESB(企业服务总线)是一款强大的集成平台,由Mulesoft公司开发,用于构建和管理企业级的应用程序网络。"mule-standalone-3.9.0.zip"是一个包含Mule ESB独立运行时环境的压缩包,版本为3.9.0。在本文中,我们将...

    Mule企业版、社区版功能比较

    Mule 企业版和社区版功能比较 Mule 企业版和社区版是两种不同的Mule版本,主要区别在于功能、安全性和可靠性等方面。本文将对Mule 企业版和社区版的功能进行比较,帮助用户选择合适的Mule版本。 一、功能框架 ...

    MULE ESB-4.1企业版运行环境

    MULE ESB(Mule Enterprise Service Bus)是Anypoint Platform的核心组件,它是一个强大的、全面集成的企业服务总线(ESB),专为构建、部署和管理API和集成解决方案而设计。MULE ESB-4.1是MuleSoft公司推出的企业版...

    mule in action 即mule实战源码

    《Mule in Action》是关于Mule ESB的实战指南,该书深入浅出地介绍了如何使用Mule这一强大的企业服务总线(ESB)进行应用程序集成。Mule ESB以其用户基数庞大、文档详尽以及社区活跃而备受赞誉,是企业级集成解决...

    Mule ESB手册-中文版

    根据提供的文件内容,以下是关于Mule ESB手册-中文版的知识点: 1. Mule ESB简介 Mule ESB(Enterprise Service Bus)是MuleSoft公司开发的一款企业服务总线产品,它允许企业内部和不同企业之间的服务进行集成,...

    Mule与MQ集成

    【Mule与MQ集成】是关于整合Mule ESB(企业服务总线)与消息中间件,如Apache ActiveMQ的开发文档。Mule是一个开源的ESB,它提供了一个平台来连接各种应用系统,实现数据交换和服务集成。而ActiveMQ则是Apache软件...

    MULE ESB-4.1社区办运行环境

    **MULE ESB-4.1社区版运行环境详解** MULE ESB(Message Broker Enterprise Service Bus)是一款强大的企业级服务总线,由Mulesoft公司开发,它提供了一个集成平台,用于连接各种应用程序和服务,实现数据的高效...

    Mule3.4入门学习

    "Mule3.4入门学习" 本文将对Mule3.4进行入门学习,涵盖Mule环境搭建、Webservice的发布、JMS消息通信、ftp、File应用、协议转换等知识点。 一、Mule环境搭建 Mule环境的搭建需要JDK的支持,包括下载、安装、配置...

    MULE用户指南3.3

    **MULE用户指南3.3** 是一份针对MULE企业服务总线(ESB)的官方文档,旨在帮助用户理解并有效地使用MULE 3.3版本。MULE ESB是一个开源的企业级集成平台,它提供了灵活且强大的工具来连接各种系统、应用程序和服务,...

    Mule 实现路由分发

    在IT行业中,Mule是一个强大的企业服务总线(ESB)和集成平台,它允许开发者构建和部署可扩展的应用程序和服务。"Mule实现路由分发"这一主题涉及到Mule如何处理消息的传递和定向,这在分布式系统和微服务架构中是至...

    mule-社区版-3.8.1.rar

    mule号称开源ESB的最好实现,一个以Java为核心的轻量级的消息框架和整合平台。它使得开发人员可以快速,简单的连接多个应用。 目前许多公司都使用了Mule,比如Walmart,HP,Sony,Deutsche Bank 以及 CitiBank等公司。...

    MuleESB帮助文档

    《Mule ESB详解——构建企业级集成解决方案》 Mule ESB,全称为Mule Enterprise Service Bus,是一款强大的开源企业服务总线,用于构建灵活、可扩展的企业级集成解决方案。Mule ESB的核心功能是作为不同应用系统...

    mule-2.1.1-getting-started

    根据提供的文档信息,本文将对"Mule 2.1.1 Getting Started"这一主题进行深入解析,主要包括Mule的基本概念、架构理解、消息传递机制、环境集成等方面,并通过具体示例来帮助理解如何使用Mule。 ### Mule 2.1.1简介...

Global site tag (gtag.js) - Google Analytics