From ea03c92eb0c1211cb52f41e9d6d4a322407afc66 Mon Sep 17 00:00:00 2001 From: jinyu Date: Fri, 31 Jul 2015 09:05:08 +0800 Subject: [PATCH] =?UTF-8?q?weixin4j-server:=20WeixinServerBootstrap=20?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E5=85=AC=E4=BC=97=E5=8F=B7=20&=20MessageHandlerAdapte?= =?UTF-8?q?r=20=E5=A3=B0=E6=98=8E=E6=97=B6=E9=99=90=E5=AE=9A=E6=B3=9B?= =?UTF-8?q?=E5=9E=8B=E4=B8=BA=20WeixinMessage=20=E7=9A=84=E5=AD=90?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGE.md | 7 ++++- weixin4j-server/CHANGE.md | 8 ++++- .../dispatcher/DefaultMessageMatcher.java | 10 +++--- .../dispatcher/WeixinMessageDispatcher.java | 31 ++++++++++--------- .../dispatcher/WeixinMessageMatcher.java | 7 +++-- .../handler/MessageHandlerAdapter.java | 4 ++- .../weixin4j/request/WeixinMessage.java | 9 ++++++ .../startup/WeixinServerBootstrap.java | 21 +++++++++---- 8 files changed, 68 insertions(+), 29 deletions(-) diff --git a/CHANGE.md b/CHANGE.md index 0a1ab617..06d30247 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -394,4 +394,9 @@ * 2015-07-30 + **weixin4j-qy**: 调整[WeixinSuiteProxy](./weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java)对多个套件的支持 - \ No newline at end of file + +* 2015-07-31 + + + **weixin4j-server**:`WeixinServerBootstrap` 构造函数支持多个公众号 + + + **weixin4j-server**:`MessageHandlerAdapter` 声明时限定泛型为`WeixinMessage`的子类 \ No newline at end of file diff --git a/weixin4j-server/CHANGE.md b/weixin4j-server/CHANGE.md index 4c0f085d..58f58341 100644 --- a/weixin4j-server/CHANGE.md +++ b/weixin4j-server/CHANGE.md @@ -56,4 +56,10 @@ * 2015-07-04 - + released 1.0.3 \ No newline at end of file + + released 1.0.3 + +* 2015-07-31 + + `WeixinServerBootstrap` 构造函数支持多个公众号 + + `MessageHandlerAdapter` 声明时限定泛型为`WeixinMessage`的子类 \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/DefaultMessageMatcher.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/DefaultMessageMatcher.java index 3365456c..9e5a7057 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/DefaultMessageMatcher.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/DefaultMessageMatcher.java @@ -21,6 +21,7 @@ import com.foxinmy.weixin4j.mp.event.MassEventMessage; import com.foxinmy.weixin4j.mp.event.TemplatesendjobfinishMessage; import com.foxinmy.weixin4j.qy.event.BatchjobresultMessage; import com.foxinmy.weixin4j.qy.event.EnterAgentEventMessage; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.type.AccountType; import com.foxinmy.weixin4j.type.EventType; import com.foxinmy.weixin4j.type.MessageType; @@ -36,10 +37,10 @@ import com.foxinmy.weixin4j.type.MessageType; */ public class DefaultMessageMatcher implements WeixinMessageMatcher { - private final Map> messageClassMap; + private final Map> messageClassMap; public DefaultMessageMatcher() { - messageClassMap = new HashMap>(); + messageClassMap = new HashMap>(); initMessageClass(); } @@ -159,12 +160,13 @@ public class DefaultMessageMatcher implements WeixinMessageMatcher { } @Override - public Class match(MessageKey messageKey) { + public Class match(MessageKey messageKey) { return messageClassMap.get(messageKey); } @Override - public void regist(MessageKey messageKey, Class messageClass) { + public void regist(MessageKey messageKey, + Class messageClass) { Class clazz = messageClassMap.get(messageKey); if (clazz != null) { throw new IllegalArgumentException("duplicate messagekey '" diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java index 35999d44..160feb8c 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java @@ -28,6 +28,7 @@ import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.handler.MessageHandlerAdapter; import com.foxinmy.weixin4j.handler.WeixinMessageHandler; import com.foxinmy.weixin4j.interceptor.WeixinMessageInterceptor; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.request.WeixinRequest; import com.foxinmy.weixin4j.response.TextResponse; import com.foxinmy.weixin4j.response.WeixinResponse; @@ -88,7 +89,7 @@ public class WeixinMessageDispatcher { /** * 消息转换 */ - private Map, Unmarshaller> messageUnmarshaller; + private Map, Unmarshaller> messageUnmarshaller; /** * 开启debug:未匹配到MessageHanlder输出消息信息 @@ -101,7 +102,7 @@ public class WeixinMessageDispatcher { public WeixinMessageDispatcher(WeixinMessageMatcher messageMatcher) { this.messageMatcher = messageMatcher; - this.messageUnmarshaller = new HashMap, Unmarshaller>(); + this.messageUnmarshaller = new HashMap, Unmarshaller>(); } /** @@ -120,11 +121,9 @@ public class WeixinMessageDispatcher { throws WeixinException { MessageKey messageKey = defineMessageKey(cruxMessage.getMsgType(), cruxMessage.getEventType(), cruxMessage.getAccountType()); - Class targetClass = messageMatcher.match(messageKey); - Object message = request.getOriginalContent(); - if (targetClass != null) { - message = messageRead(request.getOriginalContent(), targetClass); - } + Class targetClass = messageMatcher + .match(messageKey); + Object message = messageRead(request.getOriginalContent(), targetClass); logger.info("define '{}' matched '{}'", messageKey, targetClass); MessageHandlerExecutor handlerExecutor = getHandlerExecutor(context, request, messageKey, message, cruxMessage.getNodeNames()); @@ -178,7 +177,7 @@ public class WeixinMessageDispatcher { protected void noHandlerFound(ChannelHandlerContext context, WeixinRequest request, Object message) { if (isDebug) { - if (message instanceof String) { + if (message == null) { context.writeAndFlush( new TextResponse(request.getOriginalContent() .replaceAll("\\!\\[CDATA\\[", "") @@ -357,13 +356,16 @@ public class WeixinMessageDispatcher { * @return 消息对象 * @throws WeixinException */ - protected Object messageRead(String message, Class clazz) - throws WeixinException { + protected Object messageRead(String message, + Class clazz) throws WeixinException { + if (clazz == null) { + return null; + } try { Source source = new StreamSource(new ByteArrayInputStream( message.getBytes(Consts.UTF_8))); - JAXBElement jaxbElement = getUnmarshaller(clazz).unmarshal( - source, clazz); + JAXBElement jaxbElement = getUnmarshaller( + clazz).unmarshal(source, clazz); return jaxbElement.getValue(); } catch (JAXBException e) { throw new WeixinException(e); @@ -378,7 +380,7 @@ public class WeixinMessageDispatcher { * @return 消息转换器 * @throws WeixinException */ - protected Unmarshaller getUnmarshaller(Class clazz) + protected Unmarshaller getUnmarshaller(Class clazz) throws WeixinException { Unmarshaller unmarshaller = messageUnmarshaller.get(clazz); if (unmarshaller == null) { @@ -445,7 +447,8 @@ public class WeixinMessageDispatcher { this.beanFactory = beanFactory; } - public void registMessageClass(MessageKey messageKey, Class messageClass) { + public void registMessageClass(MessageKey messageKey, + Class messageClass) { messageMatcher.regist(messageKey, messageClass); } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java index 16916e23..705d07f8 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java @@ -1,5 +1,7 @@ package com.foxinmy.weixin4j.dispatcher; +import com.foxinmy.weixin4j.request.WeixinMessage; + /** * 微信消息匹配 * @@ -17,7 +19,7 @@ public interface WeixinMessageMatcher { * 消息key * @return 消息类型 */ - public Class match(MessageKey messageKey); + public Class match(MessageKey messageKey); /** * 注册消息类型「程序没有及时更新而微信又产生了新的消息类型」 @@ -27,5 +29,6 @@ public interface WeixinMessageMatcher { * @param messageClass * 消息类型 */ - public void regist(MessageKey messageKey, Class messageClass); + public void regist(MessageKey messageKey, + Class messageClass); } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/MessageHandlerAdapter.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/MessageHandlerAdapter.java index 6155ce86..f4491d20 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/MessageHandlerAdapter.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/MessageHandlerAdapter.java @@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.handler; import java.util.Set; import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.request.WeixinRequest; import com.foxinmy.weixin4j.response.WeixinResponse; @@ -16,7 +17,8 @@ import com.foxinmy.weixin4j.response.WeixinResponse; * @see */ @SuppressWarnings("unchecked") -public abstract class MessageHandlerAdapter implements WeixinMessageHandler { +public abstract class MessageHandlerAdapter implements + WeixinMessageHandler { @Override public boolean canHandle(WeixinRequest request, Object message, diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/request/WeixinMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/request/WeixinMessage.java index 9533d5bd..280ddb83 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/request/WeixinMessage.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/request/WeixinMessage.java @@ -1,8 +1,11 @@ package com.foxinmy.weixin4j.request; +import java.beans.Transient; import java.io.Serializable; +import java.util.Date; import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; /** * 微信消息基类 @@ -90,6 +93,12 @@ public class WeixinMessage implements Serializable { return createTime; } + @Transient + @XmlTransient + public Date getFormatCreateTime() { + return createTime > 0l ? new Date(createTime * 1000l) : null; + } + public String getMsgType() { return msgType; } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java index 897f3a70..f316f2ab 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java @@ -24,6 +24,7 @@ import com.foxinmy.weixin4j.dispatcher.WeixinMessageMatcher; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.handler.WeixinMessageHandler; import com.foxinmy.weixin4j.interceptor.WeixinMessageInterceptor; +import com.foxinmy.weixin4j.request.WeixinMessage; import com.foxinmy.weixin4j.socket.WeixinServerInitializer; import com.foxinmy.weixin4j.util.AesToken; @@ -81,7 +82,7 @@ public final class WeixinServerBootstrap { * 明文模式 * * @param weixinid - * 微信号(原始ID/appid/cropid) + * 微信号(原始ID/appid/corpid) * @param token * 开发者token * @@ -94,7 +95,7 @@ public final class WeixinServerBootstrap { * 兼容模式 & 密文模式 * * @param appid - * 公众号的appid + * 公众号的appid/corpid * @param token * 开发者填写的token * @param aesKey @@ -108,7 +109,7 @@ public final class WeixinServerBootstrap { * 多个公众号的支持 *

* 请注意:需在服务接收事件的URL中附加一个名为wexin_id的参数,其值请填写公众号的appid/ - * cropid + * corpid *

* * @param aesTokens @@ -123,7 +124,7 @@ public final class WeixinServerBootstrap { * 多个公众号的支持 *

* 请注意:需在服务接收事件的URL中附加一个名为wexin_id的参数,其值请填写公众号的appid/ - * cropid + * corpid *

* * @param messageMatcher @@ -152,7 +153,15 @@ public final class WeixinServerBootstrap { * */ public void startup() throws WeixinException { - startup(DEFAULT_BOSSTHREADS, DEFAULT_WORKERTHREADS, DEFAULT_SERVERPORT); + startup(DEFAULT_SERVERPORT); + } + + /** + * 指定端口启动服务 + * + */ + public void startup(int serverPort) throws WeixinException { + startup(DEFAULT_BOSSTHREADS, DEFAULT_WORKERTHREADS, serverPort); } /** @@ -296,7 +305,7 @@ public final class WeixinServerBootstrap { * @return */ public WeixinServerBootstrap registMessageClass(MessageKey messageKey, - Class messageClass) { + Class messageClass) { messageDispatcher.registMessageClass(messageKey, messageClass); return this; }