Configuración de Spring para JMS (Websphere MQ - SSL, Tomcat, JNDI, Non IBM JRE)

Antecedentes: Tengo una aplicación relativamente antigua que usa Websphere MQ para mensajería. Se ejecuta en WAS (servidor de aplicaciones web) y utiliza MDB (beans controlados por mensajes). Pude reemplazar con éxito todos los MDB usandoIntegración de primavera - JMS. Mi próximo paso es tratar de ver si puedo portarlo fuera de WAS para que pueda ejecutarse en cualquier otro contenedor de servlet con un JRE que no sea de IBM (estoy intentando: apache tomcat). Tenga en cuenta que asegurar los canales mediante SSL es un requisito. Prefiero usar JNDI.

Objetivo final: Para desacoplar mi aplicación del servidor de aplicaciones (WAS) y otras infraestructuras como la mensajería (MQ). Pero sacar esto de WAS a Tomcat es el primer paso. Luego viene la tarea de actualizar mi infraestructura de mensajería con algo más escalable. Esto me permite actualizar componentes individuales de la infraestructura en la que se basa mi aplicación, una cosa a la vez (servidor de aplicaciones, capa de mensajería, almacén de datos) sin interrumpir mi aplicación demasiado, a medida que avanzo.

Pregunta: Ahora, mi desafío es definir los recursos JNDI en tomcat que pueden acceder a Websphere MQ. He progresado en esto usando canales no SSL que definí en el archivo context.xml de esta manera:

<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"/>

Mi siguiente paso es lograr que esto funcione con canales SSL. Entiendo la parte que implica configurar los almacenes de claves (archivo kdb y generación e intercambio de certificados), configurar los canales SSL en el QM, etc. Ya tengo todo eso funcionando. ¿Cómo obtengo tomcat para usar mi almacén de claves, conjunto de cifrado, etc.? ¡Punteros o un ejemplo de trabajo sería genial!

Nota: Estoy usando Spring Integration 4.2, Websphere MQ v8, Tomcat v9, actualmente.

Debo agregar que intenté todo sin el JNDI primero. Así que aquí está mi configuración spring jms no ssl sin el JNDI, que funciona:

<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> 

Respuestas a la pregunta(1)

Su respuesta a la pregunta