Printemps manuellement l'Intégration de démarrage/arrêt de l'adaptateur de canal via le bus de contrôle
Est-il de toute façon de démarrer manuellement/init un adaptateur de canal?
J'ai deux paires de trafic entrant/sortant des cartes dans mon context.xml et tiens à décider au moment de l'exécution de qui je veux obtenir commencé.
EDIT:
Le béton scénario:
J'ai un client, qui peut être configurée à l'exécution d'un mqtt éditeur ou de l'abonné.
Mon context.xml ressemble à ceci:
<int-mqtt:message-driven-channel-adapter
client-id="foo"
auto-startup="true"
url="tcp://192.168.97.164:1883"
topics="testtopic/#"
channel="writeToFile" />
<file:outbound-channel-adapter
id="writeToFile"
auto-startup="true"
directory="./test/out"
delete-source-files="false"/>
<int:transformer id="Transformer"
ref="MessageTransformer"
input-channel="readFromFile"
output-channel="mqttOut"
method="bytesFromFile" />
<bean id="MessageTransformer" class="MessageTransformer"/>
<int-mqtt:outbound-channel-adapter
id="mqttOut"
client-id="foo"
url="tcp://192.168.97.164:1883"
auto-startup="false"
default-qos="1"
default-retained="true"
default-topic="testtopic/bla"
/>
<file:inbound-channel-adapter
auto-startup="false"
id="readFromFile"
directory="./test/in"
filename-pattern="myFile*">
<int:poller id="poller"
fixed-rate="5000" />
</file:inbound-channel-adapter>
Comme vous pouvez le voir, j'ai deux paramètres:
1. Abonné cas: Lire mqtt message -> Écrire ce fichier
2. Éditeur cas: un Sondage d'un fichier à partir du répertoire -> Envoyer par mqtt
Je décide au moment de l'exécution de ce paramètre doit être appliqué.
Pouvez-vous donc de bien vouloir me dire comment ce contrôle-chose de bus correspondrait ici exactement?
OriginalL'auteur Hasib. A. Samad | 2014-05-28
Vous devez vous connecter pour publier un commentaire.
Ensemble
autoStartup="false"
et directementstart()
/stop()
ou d'utiliser un<control-bus/>
(envoyer@myAdapter.start()
).Obtenir une référence directe (autowire etc), dépend du type de point de terminaison. Si c'est un interrogées point de terminaison, injecter un
SourcePollingChannelAdapter
; message-driven cartes varient, mais sont généralement unMessageProducerSupport
ouMessagingGatewaySupport
.EDIT:
Lisez à propos de la contrôle-bus ici.
Donner entrant adaptateur un
id
attribut.Ajouter
<control-bus input-channel="control"/>
Ajouter
<int:gateway service-interface="foo.Controller" default-request-channel="control"/>
Créer une interface de passerelle
@Autowire
la passerelle (ou utilisercontext.getBean(Controller.class)
).Ensuite, lorsque vous êtes prêt à commencer à la carte, appeler, par exemple,
gateway.control("@mqttOut.start()")
.Vous n'avez pas besoin
auto-startup="false"
sur la sortante cartes.Cependant, pour une utilisation simple ce cas, vous pourriez vouloir étudier à l'aide de Printemps profils de la place (mettre les cartes dans un profil et activer le profil au moment de l'exécution.
J'ai ajouté les détails de la façon d'utiliser le bus de contrôle pour ce scénario. Mais vous voudrez peut-être regarder au Printemps profils de la place.
Je vous remercie. Cela fonctionne très bien pour le premier cas (à partir de la mqqt:message-driven-canal de l'adaptateur), mais quand j'essaie '@readFromFile.start()' j'obtiens l'erreur suivante: La méthode "start" n'est pas pris en charge par ce processeur de commande. Si vous utilisez le Bus de Contrôle, envisager d'ajouter '@ManagedOperation' ou '@ManagedAttribute'.
C'est parce que vous êtes à l'aide implicite dénomination des voies à l'entrée de l'adaptateur; quand vous ne donnez pas l'adaptateur de canal un
channel
attribut, le canal est l'idreadFromFile
et la carte est appeléreadFromFile.adapter
. Vous essayez de démarrer() la chaîne, qui n'est pas autorisé. Donc, soit d'utiliser des id et le canal sur la carte, ou de l'utilisation@'readFromFile.adapter'.start()
.Je vous remercie. J'ai décidé d'aller avec le Printemps des profils pour l'instant. Bon conseil. Je n'ai encore un question: Où, exactement, est le lien entre la passerelle/de contrôle-bus et mon entrants-adaptateur? Je l'avoue, c'est du travail, mais encore je ne peux pas comprendre comment!
OriginalL'auteur Gary Russell
Pour ce faire, vous devez tout d'abord définir le canal de l'adaptateur d'auto-démarrage valeur false à la propriété
auto-startup="false"
puis à l'aide du bus de commande de démarrage/arrêt de l'adaptateurVoir ici bus de contrôle d'exemple - https://github.com/spring-projects/spring-integration-samples/tree/master/basic/control-bus
OriginalL'auteur Rajesh Gheware
J'ai été à la recherche pour le même exemple en utilisant le printemps de l'intégration de Java DSL, mais je n'ai rien trouvé, j'ai donc créé mon propre. Il se montre assez simple à configurer.
Pour l'Arrêter:
controlChannel.send(new GenericMessage<>("@myInboundAdapter.stop()"));
https://github.com/CauchyPeano/sftp-poller-control-bus
OriginalL'auteur Igor Konoplyanko