I've done a proof-of-concept necessitated by http://www.jboss.com/index.html?module=bb&op=viewtopic&t=136956 using Spring's JmsMessageEndpointManager.
I started testing by bootstrapping via applicationContext.xml as documented by Spring then did the equivalent in code (because we need dynamic configuration). This has worked fine so far. One problem I had was http://jira.jboss.com/jira/browse/JBAS-5623 so implemented following as workaround: /** | * Customised partly to work around http://jira.jboss.com/jira/browse/JBAS-5623 and partly to provide support | * for SESSION_TRANSACTED. By default Spring would override this to AUTO_ACKNOWLEDGE although JBoss would | * ignore that so long as its 'sessionTransacted' property remained true (the default value). | */ | public class JBossJmsActivationSpecFactory extends StandardJmsActivationSpecFactory { | | @Override | protected void applyAcknowledgeMode(BeanWrapper bw, int ackMode) { | if (bw.isWritableProperty("acknowledgeMode")) { | switch (ackMode) { | case Session.AUTO_ACKNOWLEDGE: | bw.setPropertyValue("acknowledgeMode", "AUTO_ACKNOWLEDGE"); | break; | case Session.DUPS_OK_ACKNOWLEDGE: | bw.setPropertyValue("acknowledgeMode", "DUPS_OK_ACKNOWLEDGE"); | break; | case Session.SESSION_TRANSACTED: | bw.setPropertyValue("acknowledgeMode", "SESSION_TRANSACTED"); | break; | default: | throw new IllegalArgumentException("acknowledgeMode = " + ackMode + " not supported."); | } | | } | } | | } So POJO MessageListener looks OK. I was able to confirm that Transactional messaging was now working, the callback is on a proper WorkManager Thread and we can dynamically create, start and stop connections. Here's config from initial test: <?xml version="1.0" encoding="UTF-8"?> | <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | xmlns:jee="http://www.springframework.org/schema/jee" xmlns:util="http://www.springframework.org/schema/util" | xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd | http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd | http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> | | <bean id="mbeanServer" class="org.jboss.mx.util.MBeanServerLocator" factory-method="locateJBoss" /> | | <bean id="resourceAdapter" factory-bean="mbeanServer" factory-method="getAttribute"> | <constructor-arg> | <bean class="org.springframework.jmx.support.ObjectNameManager" factory-method="getInstance"> | <constructor-arg value="jboss.jca:name='jms-ra.rar',service=RARDeployment" /> | </bean> | </constructor-arg> | <constructor-arg value="ResourceAdapter" /> | </bean> | | <bean id="messageListener" class="jca.jms.MessageLogger" /> | | <bean id="jmsManager" class="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager" | lazy-init="true"> | <property name="activationSpecFactory"> | <bean class="jca.jms.config.JBossJmsActivationSpecFactory"> | <property name="activationSpecClass" value="org.jboss.resource.adapter.jms.inflow.JmsActivationSpec" /> | </bean> | </property> | <property name="activationSpecConfig"> | <bean class="org.springframework.jms.listener.endpoint.JmsActivationSpecConfig"> | <property name="destinationName" value="MYTOPIC" /> | <property name="pubSubDomain" value="true" /> | <property name="acknowledgeMode"> | <util:constant static-field="javax.jms.Session.SESSION_TRANSACTED" /> | </property> | </bean> | </property> | <property name="autoStartup" value="false" /> | <property name="resourceAdapter" ref="resourceAdapter" /> | <property name="messageListener" ref="messageListener" /> | </bean> | | </beans> And code equivalent: public class ControlEJB extends AbstractStatelessSessionBean { | | private static final String FACTORY_SELECTOR = "classpath*:beanRefFactory.xml"; | private static final String FACTORY_KEY = "jca-jms"; | | private static final Logger log = Logger.getLogger(ControlEJB.class); | | private JmsMessageEndpointManager jmsManager; | | public void start() { | log.info("#start"); | jmsManager.start(); | } | | public void stop() { | log.info("#stop"); | jmsManager.stop(); | } | | @Override | public void setSessionContext(SessionContext sessionContext) { | super.setSessionContext(sessionContext); | setBeanFactoryLocator(ContextSingletonBeanFactoryLocator.getInstance(FACTORY_SELECTOR)); | setBeanFactoryLocatorKey(FACTORY_KEY); | } | | @Override | protected void onEjbCreate() throws CreateException { | log.info("#onEjbCreate"); | jmsManager = new JmsMessageEndpointManager(); | | JmsActivationSpecConfig activationSpecConfig = new JmsActivationSpecConfig(); | activationSpecConfig.setAcknowledgeMode(Session.SESSION_TRANSACTED); | activationSpecConfig.setDestinationName("MYTOPIC"); | activationSpecConfig.setPubSubDomain(true); | jmsManager.setActivationSpecConfig(activationSpecConfig); | | StandardJmsActivationSpecFactory activationSpecFactory = new JBossJmsActivationSpecFactory(); | try { | activationSpecFactory.setActivationSpecClass(Class | .forName("org.jboss.resource.adapter.jms.inflow.JmsActivationSpec")); | } catch (ClassNotFoundException e) { | throw new EJBException(e); | } | jmsManager.setActivationSpecFactory(activationSpecFactory); | | jmsManager.setAutoStartup(false); | jmsManager.setResourceAdapter((ResourceAdapter) getBeanFactory().getBean("resourceAdapter")); | | MessageListener listener = new MessageLogger(); | jmsManager.setMessageListener(listener); | try { | jmsManager.afterPropertiesSet(); | } catch (ResourceException e) { | throw new EJBException(e); | } | } | | } View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4158929#4158929 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4158929 _______________________________________________ jboss-user mailing list [email protected] https://lists.jboss.org/mailman/listinfo/jboss-user
