下面是我的spring xmpp集成配置的片段,
<context:property-placeholder location="classpath:xmpp.properties"/>
<int-xmpp:inbound-channel-adapter auto-startup="true"
payload-expression="getExtension('google:mobile:data').json"
channel="xmppChannel"
xmpp-connection="xmppConnection" />
<int:service-activator ref="xmppMessageConsumer"
input-channel="xmppChannel"/>
<int:logging-channel-adapter id="xmppChannel" log-full-message="true"
/>
这是我的服务激活器定义
import org.apache.log4j.Logger;
import org.springframework.messaging.Message;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.stereotype.Component;
@Component
public class XmppMessageConsumer {
private final List<String> xmppMessages;
private static final Logger LOGGER = Logger.getLogger(XmppMessageConsumer.class);
public XmppMessageConsumer() {
// TODO Auto-generated constructor stub
xmppMessages=new ArrayList<String>();
}
@ServiceActivator
public void consume(Message<?> input) throws Throwable {
String text = (String)input.getPayload();
xmppMessages.add(text);
LOGGER.info(text);
}
从日志中我可以看到通道收到的消息,但是服务激活器函数没有被调用。
10:48:59 PM RECV (0): <message to="588523657007@gcm.googleapis.com" from="devices@gcm.googleapis.com" type="normal"><gcm xmlns="google:mobile:data">{"data":{"Hello":"How are you"},"time_to_live":0,"from":"dqWxVXwH7HU:APA91bFco6xelMctjv5nMgeAIiZtH7TCCMX5a6UZ-ae2yNkBxLh-zVqy32gm6bd1IC3pyKCEwnYOFiBn4au-4XvPn8TzTvikGUNfeQ_1RN_TMk-9dyJ2WtJXVr7RCn0AGynToTWCZ7oC","message_id":"1Id","category":"com.google.firebase.quickstart.fcm"}</gcm></message>
我的假设是通过定义有效负载表达式,消息解析由框架负责。如果我说错了,请指正。
根据您当前的配置,您有两个xmppChannel
的订阅者—服务激活器和日志适配器。
当您有两个消费者订阅了相同的通道(默认为DirectChannel
)时,消息将交替地发送给这两个消费者-轮循分发。
如果您希望文件同时发送给两个消费者,请将其更改为pub/sub通道。
<int:publish-subscribe-channel id="xmppChannel"/>
如果您为org.springframework.integration
打开DEBUG日志,您可以通过流跟踪消息。