[jboss-user] [JBoss Messaging] - Re: JBoss Messaging and Spring Message Listener Container
jamesbo
do-not-reply at jboss.com
Wed Jun 18 06:10:40 EDT 2008
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
More information about the jboss-user
mailing list