天天看点

graniteds gravity jms

Я сразу посмотрел - ничего не понятно, они не спринговские, а нативные )))

"один канал для жавы и сообщений, или разные?" - это я не очень понял

Пробегусь по настройкам, может, где чего поможет ...

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;
		}
	});
}
           

Не считая кастомного обработчика подписки, все выглядит несложным. Но это все в контексте спринга ...