Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 在Mule 3.4中跨流使用记录_Spring Mvc_Mule_Esb - Fatal编程技术网

Spring mvc 在Mule 3.4中跨流使用记录

Spring mvc 在Mule 3.4中跨流使用记录,spring-mvc,mule,esb,Spring Mvc,Mule,Esb,我想从数据库中选择记录,并在mule的不同流中使用它们 我的方法是使用Springbean获取记录并将其传递给hashmap,然后返回hashmap并将其保存在会话变量中 当前正在获取此错误: Message : Execution of the expression "message.payload.getServiceCodes()" failed. (org.mule.api.expression.ExpressionRuntimeException). Mes

我想从数据库中选择记录,并在mule的不同流中使用它们

我的方法是使用Springbean获取记录并将其传递给hashmap,然后返回hashmap并将其保存在会话变量中

当前正在获取此错误:

Message               : Execution of the expression "message.payload.getServiceCodes()" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: HashMap
Code                  : MULE_ERROR--2
有更好的方法吗?或者我做错了什么

我的配置XML

    <?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:quartz="http://www.mulesoft.org/schema/mule/quartz" xmlns:jdbc-ee="http://www.mulesoft.org/schema/mule/ee/jdbc" xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml" xmlns:data-mapper="http://www.mulesoft.org/schema/mule/ee/data-mapper" xmlns:xm="http://www.mulesoft.org/schema/mule/xml"  xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:jms="http://www.mulesoft.org/schema/mule/jms" 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.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/jdbc http://www.mulesoft.org/schema/mule/ee/jdbc/current/mule-jdbc-ee.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/xml http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/current/mule-jms.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/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/data-mapper http://www.mulesoft.org/schema/mule/ee/data-mapper/current/mule-data-mapper.xsd
http://www.mulesoft.org/schema/mule/quartz http://www.mulesoft.org/schema/mule/quartz/current/mule-quartz.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
    <jms:activemq-connector name="Active_MQ" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"></jms:activemq-connector>
    <xm:jaxb-context name="myJaxb" doc:name="myJaxb" packageNames="com.test.jaxb"></xm:jaxb-context>
    <spring:beans> 
        <spring:bean id="springDataSource" name="Bean" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
            <spring:property name="url" value="jdbc:mysql://localhost:3306/muledb"></spring:property>  
            <spring:property name="maxActive" value="30"></spring:property>  
            <spring:property name="removeAbandoned" value="true"></spring:property>  
            <spring:property name="driverClassName" value="com.mysql.jdbc.Driver"></spring:property>  
            <spring:property name="initialSize" value="20"></spring:property>  
            <spring:property name="username" value="root"></spring:property>  
        </spring:bean>  
    </spring:beans>
    <quartz:connector name="quartzConnector" doc:name="Quartz"> 
        <quartz:factory-property key="org.quartz.scheduler.instanceName" value="MuleScheduler1"></quartz:factory-property>  
        <quartz:factory-property key="org.quartz.threadPool.class" value="org.quartz.simpl.SimpleThreadPool"></quartz:factory-property>  
        <quartz:factory-property key="org.quartz.threadPool.threadCount" value="3"></quartz:factory-property>  
        <quartz:factory-property key="org.quartz.scheduler.rmi.proxy" value="false"></quartz:factory-property>  
        <quartz:factory-property key="org.quartz.scheduler.rmi.export" value="false"></quartz:factory-property>  
        <quartz:factory-property key="org.quartz.jobStore.class" value="org.quartz.simpl.RAMJobStore"></quartz:factory-property>  
    </quartz:connector>
    <jdbc-ee:mysql-data-source name="MySQL_Data_Source" user="root" password="" url="jdbc:mysql://localhost:3306/muledb" transactionIsolation="UNSPECIFIED" doc:name="MySQL Data Source"></jdbc-ee:mysql-data-source>
    <jdbc-ee:connector name="Database" dataSource-ref="MySQL_Data_Source" validateConnections="true" transactionPerMessage="false" queryTimeout="-1" pollingFrequency="0" doc:name="Database"></jdbc-ee:connector>
    <!-- <flow name="JMSMessageFlow1" doc:name="JMSMessageFlow1" > 

        <jdbc-ee:inbound-endpoint queryKey="FirstUpdate" queryTimeout="-1" connector-ref="Database" doc:name="Database" pollingFrequency="0">
            <jdbc-ee:query key="FirstUpdate" value="SELECT * FROM gcp_txn_log WHERE PROCESSED= 'Y'"></jdbc-ee:query> 
            <jdbc-ee:query key="FirstUpdate.ack" value="update gcp_txn_log set PROCESSED='N' where service_id = #[map-payload:service_id]"></jdbc-ee:query>

        </jdbc-ee:inbound-endpoint>

        <logger level="INFO" doc:name="Logger"/>  
      </flow> -->
    <!-- <flow name="JMSMessageFlow2" doc:name="JMSMessageFlow2"> 
        <jdbc-ee:inbound-endpoint queryKey="SelectAll" queryTimeout="-1" connector-ref="Database" doc:name="Database" pollingFrequency="0"> 
            <jdbc-ee:transaction action="ALWAYS_BEGIN"></jdbc-ee:transaction>  

            <jdbc-ee:query key="SelectAll" value="SELECT * FROM gcp_txn_log WHERE PROCESSED= 'N'"></jdbc-ee:query>  
            <jdbc-ee:query key="SelectAll.ack" value="update gcp_txn_log set PROCESSED='Y'  where service_id = #[map-payload:service_id] "></jdbc-ee:query>  
        </jdbc-ee:inbound-endpoint>  
        <xm:object-to-xml-transformer doc:name="Object to XML"></xm:object-to-xml-transformer>  
        <file:outbound-endpoint path="C:\Users\FASYL\Downloads" outputPattern="test#[function:datestamp:dd-MM-yy]_#[function:systime].xml" responseTimeout="10000" doc:name="File"></file:outbound-endpoint>  
     <jdbc-ee:outbound-endpoint queryKey="FirstUpdate" queryTimeout="-1" connector-ref="Database" doc:name="Database">

            <jdbc-ee:query key="FirstUpdate" value="update gcp_txn_log set PROCESSED = 'N' WHERE PROCESSED = 'Y'"></jdbc-ee:query>

        </jdbc-ee:outbound-endpoint> 
    </flow> -->
    <flow name="JMSMessageFlow3" doc:name="JMSMessageFlow3"> 
        <quartz:inbound-endpoint jobName="job2" repeatInterval="1" repeatCount="0" responseTimeout="10000" doc:name="Quartz" connector-ref="quartzConnector">
            <quartz:event-generator-job>
                <quartz:payload>Setting Session Variable</quartz:payload>
            </quartz:event-generator-job>

        </quartz:inbound-endpoint>  
        <component class="com.test.SchedulerComponent" doc:name="Java"></component>  
        <component doc:name="Java">  
            <singleton-object class="com.test.ServiceDAO"> 
                <property key="dataSource" value-ref="springDataSource" value="null"/> 
            </singleton-object> 
        </component>
        <message-properties-transformer scope="session" doc:name="Message Properties">
            <add-message-property key="serviceDAO" value="#[message.payload]"/>
        </message-properties-transformer>
        <logger level="INFO" doc:name="Logger" message="#[sessionVars['serviceDAO']['1001']]"/>
    </flow>
    <!-- <flow name="JMSMessageFlow1" doc:name="JMSMessageFlow1">

    </flow> -->
    <flow name="JMSMessageFlow4" doc:name="JMSMessageFlow4">
        <jms:inbound-endpoint queue="StudioIns" connector-ref="Active_MQ" doc:name="JMS"/>
        <xm:jaxb-xml-to-object-transformer jaxbContext-ref="myJaxb" returnClass="com.test.jaxb.MsgContent"></xm:jaxb-xml-to-object-transformer>
        <choice doc:name="Choice">
            <when expression="payload.getMsgBody().getValue() == 'fundstransfer'" >
                <pooled-component doc:name="Java">  
                    <prototype-object class="com.test.PersonComponent"> 
                        <property key="dataSource" value-ref="springDataSource" value="null"/> 
                    </prototype-object> 
                </pooled-component>
            </when>
            <when expression="#[sessionVars['serviceDAO']['1001'] == 1] ">
                <pooled-component doc:name="Java">  
                    <prototype-object class="com.test.SecondPersonComponent"> 
                        <property key="dataSource" value-ref="springDataSource" value="null"/> 
                    </prototype-object> 
                </pooled-component>
            </when>
        </choice>
        <logger message="#[sessionVars['serviceDAO']]" level="INFO" doc:name="Logger"/>
        <file:outbound-endpoint path="D:\Documents\MuleStudio\workspace\jms_amq\bin\com\test" outputPattern="new.txt" responseTimeout="10000" doc:name="File"/>
    </flow>
</mule>

该错误表明您的负载是HashMap:消息负载的类型为:HashMap。因此表达式:message.payload.getServiceCodes将无法工作,因为HashMap没有名为“getServiceCodes”的方法。如果您想要访问该HashMap的元素,您可以通过几种方式使用MELMule表达式语言

通过标准java方法调用,例如:

payload.get('mykey')
也可以使用MEL速记,例如:

有效载荷['mykey']或有效载荷.mykey

关于会话变量的另一点,您可以通过设置会话变量消息处理器将其存储在会话变量中,并以类似的方式访问元素。您可以使用sessionVars而不是payload来引用它,这一次它将是一个映射图,因此:


sessionVars.mymap.mykey或sessionVars['mymap']['mykey']等。

感谢您的回答,我使用[message.payload]获取它,我可以在该流中引用它,但无法从另一个流访问它。我想在表达式的选择范围内使用它。如果要在传递到第二个流之前更改有效负载,则必须将其存储在变量或属性中。最简单的方法是:会话变量跨流传播,因此您可以使用,在其他流中您可以使用[sessionVars.mymap.mykey]或者,如果您想直接从组件设置它,您可以访问MuleEvent并使用setSessionVariable。我拥有的是一个流,该流有一个组件从数据库snd读取记录并分配给hashmap,该组件返回发送给会话变量的hashmap对象。我还有第二个流,它有一个选择范围。我希望能够使用session变量作为选择范围的条件之一。对于codition,这是我所拥有的:但是得到这个错误:Message:nota statement org.mvel2.ScriptRuntimeException。消息有效负载的类型为:MsgContent Code:MULE_ERROR-2将其标记为括号。Try[sessionVars['serviceDAO']['1001']==1]使用了Try[sessionVars['serviceDAO']['1001']==1]和sessionVars.serviceDAO.1001==1,并给出了相同的问题