Mule ESB 3.3 Wie zu Beginn Transaktions-Ströme gleichzeitig
Ich möchte zum verarbeiten von Nachrichten, die gleichzeitig, aber ich kann nicht verwalten, um Sie transacional, es sei denn, ich habe die VM Anfrage-Antwort... in dem Fall die Verarbeitung ist nicht concurrent.
Mule Dokumentation Staaten, die "Mule-Transaktionen konfiguriert sind, synchronen Endpunkten, aber ich verstehe nicht ganz, diese Einschränkung.
Es ist klar, dass in einer Strömung, die Sie sein wollen, Transaktions-sollte man nicht spawn asynch fließt, aber es ist nicht klar (zu mich), warum man nicht starten kann (von einem nicht-tx-Haupt-flow) eine beliebige Anzahl von asynchronen fließt jede Transaktion.
In anderen Worten: warum funktioniert das gut:
aber wenn ich die VM ' s auf "one-way" schlägt er mit:
org.mule.transaction.IllegalTransactionStateException: Can only bind "javax.sql.DataSource/java.sql.Connection" type resources
Gibt es eine Möglichkeit, um dieses?
XML für den Fluss:
<?xml version="1.0" encoding="UTF-8"?>
<mule>
<spring:beans>
<spring:bean id="dataSource" name="dataSource" class="org.enhydra.jdbc.standard.StandardDataSource" destroy-method="shutdown">
<spring:property name="driverName" value="org.h2.Driver" />
<spring:property name="url" value="jdbc:h2:tcp://localhost/~/mule" />
<spring:property name="user" value="sa" />
<spring:property name="password">
<spring:value></spring:value>
</spring:property>
</spring:bean>
<spring:bean id="transactionFactory" name="transactionFactory" class="org.mule.transport.jdbc.JdbcTransactionFactory" />
</spring:beans>
<jdbc:connector name="dbConnector" dataSource-ref="dataSource" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database" />
<flow name="triggerFlow" doc:name="triggerFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" />
<set-payload value="#[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]" doc:name="[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"/>
<collection-splitter doc:name="Collection Splitter"/>
<vm:outbound-endpoint exchange-pattern="request-response" path="flow" doc:name="flow" />
</flow>
<flow name="flow" doc:name="flow">
<vm:inbound-endpoint exchange-pattern="request-response" path="flow" doc:name="flow">
<custom-transaction factory-ref="transactionFactory" action="ALWAYS_BEGIN" timeout="10" />
</vm:inbound-endpoint>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert" queryTimeout="-1" connector-ref="dbConnector" doc:name="Insert 1">
<jdbc:transaction action="ALWAYS_JOIN" />
<jdbc:query key="insert" value="insert into test values (#[payload], 'Test 1')" />
</jdbc:outbound-endpoint>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="insert2" queryTimeout="-1" connector-ref="dbConnector" doc:name="Insert 2">
<jdbc:transaction action="ALWAYS_JOIN" />
<jdbc:query key="insert2" value="insert into test values (#[payload + 10], 'Test 2')" />
</jdbc:outbound-endpoint>
</flow>
</mule>
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Einschränkung ist aufgrund der Tatsache, dass Maultier wie im Frühjahr, und ganz allgemein in Java, Transaktionen thread-gebunden. Mit asynchronen fließt, mehrere threads im Spiel sind, damit die Transaktion-thread Verein kann nicht aufrechterhalten werden.
Nicht So, Sie kann nicht split/fork/parallelisieren/asynchrone Verarbeitung von Nachrichten und haben auch Transaktionen in Mule.
Aber dies ist nicht die erste Frage von IMO: dies ist, weil Sie nachdrücklich, über eine
custom-transaction
versuchen, sich einen VM-Endpunkt in einer JDBC Transaktion. Das kann nicht funktionieren. Verwenden Sie eine XA-Transaktion, wenn Sie wollen, um sich von heterogenen Ressourcen.EDIT: Von dem, was Sie gesagt haben, in den Kommentaren, die Sie nicht wollen, um sich die VM Endpunkt in der Transaktion, also nur anmelden die JDBC-Endpunkte wie hier:
Diese funktioniert gut mit einem
one-way
inbound-endpoint.request-response
.ALWAYS_BEGIN
auf der ersten JDBC-und EndpunktALWAYS_JOIN
auf der zweiten? Oder wickeln die zwei JDBC-Endpunkte mit einer<transactional>
element?transactional
element. Ich habe überprüft meine Antwort: es funktioniert für mich mit ihm.Habe ich es geschafft, damit es funktioniert. Ich hatte, um ein Zwischenprodukt async flow wich startet das sync - /tx-flow:
Ich denke, das ist hässlich und unnecesary und es wäre vollkommen ok, um es aufzurufen als der ursprüngliche Beitrag, aber aus Gründen sind, als über mich-Mule lässt Sie durch Reifen springen, für diese.
Folgenden ist die Strömung s XML:
Dies ist beschrieben in der Mule Dokumentation. Es ist ein wenig umständlich, dass es sein muss, vielleicht, aber es ist nicht zu schlecht, und nur wirklich benötigt, eine VM-Verkehr, nicht zwei:
Änderte ich es, weil ich wollte, um die Verwendung von TCP anstelle von HTTP, aber es ist im Grunde das gleiche Beispiel.
Den ersten Fluss erhält untransacted TCP, tut etwas mit ihm (nur ein Byte-Array Zu String hier, aber vielleicht hätten Sie die Validierung oder sowas), schiebt sich der Eingang zu den VM-Connector, dann gibt die Eingabe zurück an den TCP-stream. Rückkehr nach der VM-Connector gewährleistet, dass die TCP-Quelle, dass es loslassen kann von seiner Botschaft, wenn es dabei ein wenig low-level-garantierte Lieferung.
Den VM Connector ist one-way, und hat einen permanenten Speicher, die angeschlossen sind, so kann es nicht verloren gehen, die Botschaft. Dies zeigt einen Fehler in Mule Studio 3.5, aber es funktioniert gut.
Dann ist der mittlere Fluss übernimmt, und enthält eine Transaktion, also den VM-Connector nicht gehen lassen, die Nachricht, es sei denn, der business-Logik subflow erfolgreich abgeschlossen.
Schließlich der subflow läuft; aktuell nur Thread.sleep()ing für 5 Sekunden, damit ich sehen kann, dass es funktioniert. Telnetting in hat eine sofortige echo zurück auf die Telnet-Konsole ein, und dann fünf Sekunden später ein weiteres echo.
Hoffe, das hilft! Ich habe nur verbrachte ein paar Stunden mit Mule zusammen, aber diese scheint richtig zu sein.