Я сразу посмотрел - ничего не понятно, они не спринговские, а нативные )))
"один канал для жавы и сообщений, или разные?" - это я не очень понял
Пробегусь по настройкам, может, где чего поможет ...
1. Брокер
<amq:broker id="broker" useJmx="false" persistent="false" brokerName="activemq" advisorySupport="false">
<amq:transportConnectors>
<amq:transportConnector uri="vm://activemq"/>
</amq:transportConnectors>
</amq:broker>
Тем самым спринг поднимает ActiveMQ. У тебя тут протокол tcp://localhost:61616.
2. Создаю слушателя - бин для topic destination
<bean id="customTopic" class="myproject.messaging.CustomTopicDestination">
<property name="createBroker" value="false"/>
<property name="brokerUrl" value="vm://activemq"/>
<property name="acknowledgeMode" value="AUTO_ACKNOWLEDGE"/>
<property name="noLocal" value="true"/>
<property name="id" value="customTopic"/>
<property name="name" value="customTopic"/>
<property name="sessionSelector" value="true"/>
</bean>
который при инициализации формирует мне конфиг типа твоего messaging-config.xml. Адаптер и сервисы выглядят примерно так:
Channel channel = servicesConfig.findChannelById("gravityamf");
Service service = servicesConfig.findServiceById("gravity-service");
Adapter adapter = null;
if (channel == null || service == null) {
channel = new Channel("gravityamf", "org.granite.gravity.channels.GravityChannel", new EndPoint("http://{server.name}:{server.port}/{context.root}/gravityamf/amf", "flex.messaging.endpoints.AMFEndpoint"), new XMap());
servicesConfig.addChannel(channel);
adapter = new Adapter("activemq", "myproject.messaging.CustomServiceAdapter", new XMap());
Map<String, Adapter> adapters = new HashMap<String, Adapter>();
adapters.put(adapter.getId(), adapter);
service = new Service("gravity-service", "flex.messaging.services.MessagingService", "flex.messaging.messages.AsyncMessage", adapter, adapters, new HashMap<String, Destination>());
servicesConfig.addService(service);
} else adapter = service.findAdapterById("activemq");
service.getDestinations().put(id, this.buildDestination(adapter));//непосредственное формирование XMap конфига
То есть видно, что я связал брокер "activemq" со своим кастомным адаптером CustomServiceAdapter extends ActiveMQServiceAdapter, где в @Override public Object manage() обрабатываю сообщения SUBSCRIBE_OPERATION и UNSUBSCRIBE_OPERATION. Другие идут на CustomGravityServlet implements org.apache.catalina.comet.CometProcessor, где обрабатываются стандартным образом. Конфигурируется сервлет в web.xml:
<servlet>
<servlet-name>GravityServlet</servlet-name>
<servlet-class>myproject.messaging.CustomGravityServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GravityServlet</servlet-name>
<url-pattern>/gravityamf/*</url-pattern>
</servlet-mapping>
3. Producer:
<bean id="jmsGlobalProducerTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cachingConnectionFactory"/>
<property name="defaultDestination" ref="allAdmins"/>
</bean>
и зависимые
<amq:connectionFactory id="connectionFactory" brokerURL="vm://activemq" watchTopicAdvisories="false" closeTimeout="0"/>
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="connectionFactory"/>
<property name="sessionCacheSize" value="100"/>
</bean>
<amq:topic id="admins" physicalName="customTopic.global.>"/>
Входящие получаю как описал выше (кастомная подписка и отписка нужна для регистрации юзера в системе и контроля уникальности).
Отправку сообщений делаю примерно так (это приватная, для общей меняется топик):
dispatchPrivateMessage(CometEvent.POPUP, isAdminMessage, message, admin.getName(), toAdmin);
...
protected synchronized void dispatchPrivateMessage(final CometEvent event, final Object body, final String id, final String name, final String admin) {
template.send(new ActiveMQTopic("customTopic.global." + admin), new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
ActiveMQObjectMessage message = (ActiveMQObjectMessage) session.createObjectMessage(new CustomMessage(event, body, id, name));
return message;
}
});
}
Не считая кастомного обработчика подписки, все выглядит несложным. Но это все в контексте спринга ...