【问题标题】:Can someone give me simple spring integration with mule?有人可以给我简单的弹簧与骡子集成吗?
【发布时间】:2015-12-12 12:40:05
【问题描述】:

我正在将一个 spring 项目与 Mule 和 a 集成,在启动时遇到错误。是否有任何最佳参考可用于 Spring mule 与完整流程的集成?

骡流配置

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml"
    xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.7.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/xml http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd">


<spring:beans>
    <spring:import resource="classpath:app-spring.xml"/>
</spring:beans>

    <file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File" />
    <mulexml:jaxb-context name="JAXB_Context" packageNames="com.dbs.ibgt.scf.eventhandler" doc:name="JAXB Context" />

    <flow name="Push  Transactions to IMEX">
        <file:inbound-endpoint responseTimeout="10000" doc:name="File" path="D:\SCF\eh_in" />
        <mulexml:jaxb-xml-to-object-transformer jaxbContext-ref="JAXB_Context" doc:name="XML to JAXB Object" returnClass="com.eventhandler.EventHandlerMessage" />
        <set-session-variable variableName="jaxbObject" value="#[payload]" doc:name="Set the Jaxb Object" />

    <component>
      <spring-object bean="EventChecker">
            <property-entry-point-resolver property = "checkEvent" />
      </spring-object>
    </component>

        <logger level="INFO" doc:name="Logger" message="message=&quot;#[message.payload]&quot;" />
    </flow>

</mule>

Java 文件

@Component
public class EventChecker {

    public String checkEvent()
    {
        System.out.println("Inside Check Event");
        return "SEND_IMEX";
    }
}

错误堆栈.....

INFO:初始化 Spring 根 WebApplicationContext org.mule.api.config.ConfigurationException:XML 文档中的第 35 行 来自网址 [文件:/D:/Work/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/...../WEB-INF/classes/EventHandler.xml] 是无效的;嵌套异常是 org.xml.sax.SAXParseException; 行号:35;列号:66; cvc-complex-type.2.4.a:无效 发现内容以元素开头 '属性入口点解析器'。之一 '{"http://www.mulesoft.org/schema/mule/core":属性, "http://www.mulesoft.org/schema/mule/core":properties}' 是预期的。 (org.mule.api.lifecycle.InitialisationException) 在 org.mule.config.builders.AbstractConfigurationBuilder.configure(AbstractConfigurationBuilder.java:49) 在 org.mule.config.builders.AbstractResourceConfigurationBuilder.configure(AbstractResourceConfigurationBuilder.java:69) 在 org.mule.context.DefaultMuleContextFactory$2.configure(DefaultMuleContextFactory.java:103) 在 org.mule.context.DefaultMuleContextFactory.doCreateMuleContext(DefaultMuleContextFactory.java:217) 在 org.mule.context.DefaultMuleContextFactory.createMuleContext(DefaultMuleContextFactory.java:98) 在 org.mule.context.DefaultMuleContextFactory.createMuleContext(DefaultMuleContextFactory.java:57) 在 com.dbs.ibgt.scf.startup.MuleStartup.contextInitialized(MuleStartup.java:57) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 在 java.util.concurrent.FutureTask.run(FutureTask.java:262) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:745)

【问题讨论】:

    标签: spring mule


    【解决方案1】:

    Jeba,我有一个模板可以满足你的要求:

    https://github.com/jrichardsz/mule-esb-usefull-templates

    这个项目包含一个简单的弹簧组件,并展示了如何在 mule 应用程序中使用它。

    还展示了如何同时读取属性文件和处理 mule 消息。

    结构:

    mule-project\pom.xml
    mule-project\README.md
    mule-project\src
    mule-project\src\main
    mule-project\src\test
    mule-project\src\main\app
    mule-project\src\main\java
    mule-project\src\main\resources
    mule-project\src\main\app\mule-app.properties
    mule-project\src\main\app\mule-deploy.properties
    mule-project\src\main\app\spring-mule.xml
    mule-project\src\main\java\com
    mule-project\src\main\java\com\spring
    mule-project\src\main\java\com\spring\component
    mule-project\src\main\java\com\spring\component\SearchAuthor.java
    mule-project\src\main\resources\app-spring-component.xml
    mule-project\src\main\resources\app-spring-context.xml
    mule-project\src\main\resources\app.properties
    mule-project\src\test\java
    mule-project\src\test\resources
    mule-project\src\test\java\.keep
    mule-project\src\test\resources\.keep
    

    骡子应用:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
        xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.6.1"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:stdio="http://www.mulesoft.org/schema/mule/stdio"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
    http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
    http://www.mulesoft.org/schema/mule/stdio http://www.mulesoft.org/schema/mule/stdio/3.6/mule-stdio.xsd">
    
        <spring:beans>
            <spring:import
                resource="classpath*:/app-spring-context.xml" />        
            <spring:import
                resource="classpath*:/app-spring-component.xml" />      
        </spring:beans>
    
        <stdio:connector name="stdioConnector" messageDelayTime="1234"
               outputMessage="abc" promptMessage="Ingrese el nombre del libro : "
               promptMessageCode="456"
               doc:name="STDIO"/>
    
        <flow name="spring-muleFlow">
    
            <stdio:inbound-endpoint  system="IN" connector-ref="stdioConnector" doc:name="STDIO"/>
            <logger message="Search book : #[payload]" level="INFO" doc:name="Logger"/>
    
            <component doc:name="searchAuthor">
                <spring-object bean="searchAuthor" />
            </component>
            <logger message="Show Results : #[payload]" level="INFO" doc:name="Logger"/>
        </flow>
    </mule>
    

    弹簧组件:

    package com.spring.component;
    
    import java.util.Map;
    
    import javax.annotation.Resource;
    
    import org.mule.api.MuleEventContext;
    import org.mule.api.lifecycle.Callable;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    
    @Component("searchAuthor")
    @Scope("prototype")
    
    /*
     * Use Callable if you want : 
     * (spring functionalities, handle mule message and read a properties file) 
     * at the same time.
     * 
     * This is what you will use more.
     * 
     * If you need only spring, dont use : implements Callable
     * 
     * */
    public class SearchAuthor implements Callable{
    
    //  @Autowired
    //  private AnotherSpringComponetOrServiceOrWhatever spring;    
    
        @Resource(name="app") //app is the id="app" app-spring-context.xml
        protected Map<String,String> propertiesApp; 
    
        @Override
        public Object onCall(MuleEventContext eventContext) throws Exception {
    
            String payload = (String) eventContext.getMessage().getPayload();
    
            return String.format("This book [%s] was made by : %s", payload, propertiesApp.get("by"));
        }
    
    }
    

    Spring xml 配置:

    app-spring-context.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:jee="http://www.springframework.org/schema/jee"
        xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
        <!--general spring configurations-->
        <context:annotation-config />   
    
        <util:properties id="app" location="classpath:app.properties"/>
        <context:property-placeholder properties-ref="app" ignore-resource-not-found="true"/>
    
        <context:component-scan base-package="com.spring.component"/>
    
    
    </beans>
    

    app-spring-component.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:jee="http://www.springframework.org/schema/jee"
        xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
        <!-- import objects that have not been scanned or another spring functionalities -->
    
        <!-- <bean ... -->
    
    </beans>
    

    希望对你有帮助。

    问候。

    【讨论】:

      【解决方案2】:

      根据documentation,spring-object 允许的唯一子元素是属性和属性。如果你想配置property-entry-point-resolver,你需要为组件做。

      【讨论】:

        【解决方案3】:

        试试下面的方法

         <component>
                <property-entry-point-resolver property = "checkEvent" />
        </component>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多