Printemps de Configuration pour JMS (Websphere MQ SSL, Tomcat, JNDI, Non IBM JRE)
De fond:
J'ai un relativement ancienne application qui utilise Websphere MQ pour la messagerie. Il fonctionne sur A (Websphere Application Server) et utilise Mdb (Message Driven Beans). J'ai été avec succès en mesure de remplacer toutes les banques multilatérales de développement à l'aide de Spring Integration - JMS. Ma prochaine étape est d'essayer de voir si je peux le port de a ÉTÉ, de sorte qu'il peut fonctionner sur n'importe quel autre conteneur de servlet avec un non-IBM JRE (je suis en train d'essayer: apache, tomcat). Notez que la sécurisation des canaux à l'aide de SSL est une exigence. Je préfère utiliser JNDI.
Objectif Final: La
Afin de dissocier mon application à partir de l'application server (was) et d'autres infrastructures telles que la messagerie (MQ). Mais la prise de ce de a ÉTÉ sur tomcat est la première étape. Vient ensuite la tâche de mise à jour de mon infrastructure de messagerie avec quelque chose de plus évolutif. Cela me permet de mettre à jour les différents composants de l'infrastructure que mon application s'appuie sur les, une chose à la fois (serveur d'application, les messages de la couche, banque de données) sans perturber ma demande trop, que je vais.
Question:
Maintenant, mon défi est de définir les ressources JNDI sur tomcat qui peuvent accéder à Websphere MQ. J'ai fait quelques progrès sur ce à l'aide de non-SSL canaux que j'ai défini dans la context.xml fichier comme ceci:
<Resource
name="jms/qcf_sandbox"
auth="Container"
type="com.ibm.mq.jms.MQQueueConnectionFactory"
factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory"
description="JMS Queue Connection Factory for sending messages"
HOST="localhost"
PORT="1414"
CHAN="CHANNEL_SANDBOX"
TRAN="1"
QMGR="QM_SANDBOX"/>
<Resource
name="jms/SandboxQ"
auth="Container"
type="com.ibm.mq.jms.MQQueue"
factory="com.ibm.mq.jms.MQQueueFactory"
description="JMS Queue"
QU="SANDBOX_Q"/>
Ma prochaine étape est d'obtenir que cela fonctionne avec le protocole SSL canaux. Je comprends la partie qui implique la mise en place du fichier de stockage des clés (kdb fichier cert et la génération et l'échange), la configuration de SSL sur les canaux QM etc. J'ai tout qui fonctionne déjà. Comment puis-je obtenir tomcat pour utiliser mon fichier de stockage des clés, de la suite de chiffrement, etc? Les pointeurs ou un exemple de travail serait génial!
Note: je suis à l'aide de Spring Integration 4.2, Websphere MQ v8, Tomcat v9, actuellement.
Je dois ajouter que je n'ai tout essayer sans le JNDI premier. Donc, ici, est mon de printemps jms non-ssl config sans le JNDI, qui fonctionne:
<bean id="mq-jms-cf-sandbox"
class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory">
<ref bean="mqQueueConnectionFactory" />
</property>
</bean>
<bean id="mqQueueConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName" value="localhost" />
<property name="port" value="1414" />
<property name="queueManager" value="QM_SANDBOX" />
<property name="transportType" value="1" />
<property name="channel" value="CHANNEL_SANDBOX" />
</bean>
<bean id="jms-destination-sandbox" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="SANDBOX_Q" />
<property name="baseQueueManagerName">
<value>QM_SANDBOX</value>
</property>
<property name="baseQueueName">
<value>SANDBOX_Q</value>
</property>
</bean>
OriginalL'auteur code4kix | 2016-03-29
Vous devez vous connecter pour publier un commentaire.
Je pense que j'ai enfin compris comment tirer cette off... en voici une brève description des étapes à suivre. Si vous avez besoin de plus de détails, laissez-moi savoir.
Pré-reqs:
Websphere MQ Server installé (au moins v 8.0.0.2)
Configurer le QM, SSL et non-SSL canaux, créer Qs et toutes ces bonnes choses dont vous avez besoin.
Inutile de dire, vous avez besoin de Websphere MQ pots. Être conscient de tous les restrictions de licences.
Étape 1: Obtenir la connexion directe de travail sans SSL, pas de JNDI. Vous aurez besoin d'utiliser ces haricots à configurer en fonction de votre printemps JMS auditeurs et JMS Modèles etc.
Étape 2: Obtenir la connexion directe de travail avec SSL, pas de JNDI. J'ai trouvé cette mise en place un peu délicat.
2a. Depuis que j'ai été en utilisant un non-IBM JRE, je devais m'assurer que les spécifications de chiffrement & suites de chiffrement nécessaires pour être configuré selon les mappages spécifié ici:
http://www-01.ibm.com/support/docview.wss?uid=swg1IV66840
De toute évidence, cela signifie que nous sommes au moins d'avoir Websphere MQ mis à niveau vers 8.0.0.2. Dans mon cas, j'ai utilisé ECDHE_RSA_AES_256_GCM_SHA384 sur le canal SSL et configuré le jms les haricots dans l'application à utiliser TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, comme suit:
2b. Créer des certificats, des fichiers de clés (kdbs), l'échange de certificats, etc. Il y a beaucoup de façons de le faire. Mais sachez que vous aurez besoin de ranger les mots de passe, l'étiquette de la clé pour le gestionnaire de file d'attente doit être "ibmwebspheremqqmgr" – "tous en minuscules, sans espaces, (sans les guillemets), l'étiquette de la clé doit être comme" ibmwebspheremquserid " – " tous en minuscules, sans espaces, (sans les guillemets), où le nom d'utilisateur est le nom d'utilisateur qui exécute le serveur tomcat. Si vous avez besoin de plus d'informations sur exactement comment je l'ai fait à l'aide de auto-signé certs, laissez-moi savoir.
2c. Maintenant, vous devez obtenir la JVM que tomcat fonctionne, pour lire vos fichiers de clés. Il existe de nombreuses façons, mais voici comment j'ai fait:
Créer un setenv.fichier bat dans le dossier bin de tomcat, avec le contenu suivant (débogage SSL est facultatif)
2d. Démarrer tomcat à l'aide de la commande suivante:
Pour arrêter, appuyez simplement sur ctrl+c (windows). Selon la manière dont vous le faites, assurez-vous que setenv.chauve-souris est utilisé lors du démarrage. Ou utiliser JAVA_OPTS pour définir le fichier de clés propriétés.
2e. Vérifiez que le en utilisant le canal SSL fonctionne.
Étape 3: Obtenir une connexion JNDI de travail avec des non-SSL, JNDI
Il y a beaucoup de était de mettre en place JNDI sur tomcat. Voici comment j'ai fait: au Sein de l'application web créer un fichier META-INF/Context.xml avec le contenu suivant:
Maintenant dans votre ressort de config, au lieu de le diriger configurations, tout ce que vous avez à faire est de:
Noter que pour des raisons de concision, je n'ai tout simplement pas utiliser des références de ressources. Dans le cas où vous le faites, il ya quelques étapes supplémentaires qui sont droits de l'avant.
Étape 4: Maintenant, la dernière étape consiste à utiliser un canal SSL et JNDI. En supposant que vous avez fait à l'étape 2, c'est facile. Modifier la META-INF/Context.xml avec le contenu suivant:
Remarque la ligne avec SCPHS="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384". Si vous avez besoin de définir d'autres paramètres, voir la "Forme Courte" colonne dans ce lien:
https://www.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.ref.dev.doc/q111800_.htm%23jm10910_?lang=en
Espérons que tout cela fonctionne pour vous. Bonne chance!
Une fois que cette configuration fonctionne, l'envoi de messages est assez simple. Mais c'est la façon dont vous pouvez écouter un message dans une file d'attente à l'aide de Printemps JMS
Référence: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html
Étape 1: Utiliser le Printemps DefaultMessageListenerContainer et configurer vos haricots dans un fichier xml comme (spring-beans.xml):
Étape 2: Ajouter ceci à votre web.xml
Étape 3: Écrire un Message Auditeur classe comme ceci:
Alternativement, au lieu de l'étape 3, si vous êtes à l'aide de spring integration, vous pouvez faire quelque chose comme ça:
Lorsque vous configurez l'Étape 1? nom du fichier, est-il dans spring-beans.xml ou dans un autre fichier et comment il va le lire.
C'est le fichier XML où vous configurez votre beans spring (peut être décomposé en plusieurs fichiers). Assurez-vous qu'il est repris dans de mentionner que, dans votre web.xml (si il ne peut pas être ramassé par défaut basé sur des conventions de nommage)
Je suis juste essayer de migrer vers a ÉTÉ de 8,5 à partir de A, les 7 et supprimer toutes les EJB et MDB . J'ai réussi à faire avec les EJB pour Spring4 Injecter et ComponentContext , maintenant je suis coincé avec un MDB que j'ai dans le code. J'ai été en utilisant ActiveSpec à lire à partir de a ÉTÉ.Pouvez-vous m'aider comment peut migrer en a ÉTÉ de 8,5?
Ma suggestion est complètement à l'écart banques multilatérales de développement et des actifs spec. Sur le serveur, tous vous avez besoin est le qm usine de raccordement et q des fabriques de connexions. Sur l'application, allez avec juste par message Pojo (au lieu de banques multilatérales de développement). Je suis sûr qu'il y a des exemples si vous recherchez. Si vous ne pouvez pas vraiment trouver de tout, poser une autre question dans stackoverflow peut-être. Je vais essayer de l'obtenir si personne d'autre ne peut.
OriginalL'auteur code4kix