1、修改APNs三方包为pushy

2、修改注释和增强SessionGroup
This commit is contained in:
远方夕阳 2021-10-18 22:07:25 +08:00
parent 1c1480ef2c
commit 1faf67a977
12 changed files with 90 additions and 1573 deletions

View File

@ -1,147 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<webroots />
</configuration>
</facet>
<facet type="jpa" name="JPA">
<configuration>
<setting name="validation-enabled" value="true" />
<setting name="provider-name" value="Hibernate" />
<datasource-mapping />
<naming-strategy-map />
</configuration>
</facet>
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.5.2" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.14.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.14.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.31" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.28" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.5.2" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.12.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.12.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.12.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.12.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.12.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.12.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.48" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.48" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.48" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-freemarker:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.31" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.3.8" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:6.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.4.7" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-jpa:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.6" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.5.2" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.8" level="project" />
<orderEntry type="library" name="Maven: jakarta.transaction:jakarta.transaction-api:1.3.3" level="project" />
<orderEntry type="library" name="Maven: jakarta.persistence:jakarta.persistence-api:2.2.3" level="project" />
<orderEntry type="library" name="Maven: org.hibernate:hibernate-core:5.4.32.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.javassist:javassist:3.27.0-GA" level="project" />
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.22" level="project" />
<orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
<orderEntry type="library" name="Maven: org.jboss:jandex:2.2.3.Final" level="project" />
<orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.3" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.common:hibernate-commons-annotations:5.1.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.4" level="project" />
<orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
<orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:2.3.4" level="project" />
<orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:3.0.12" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-jpa:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.5.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-orm:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aspects:5.3.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.5.2" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-boot-starter:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-oas:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-annotations:2.1.2" level="project" />
<orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-models:2.1.2" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spi:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-schema:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-core:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.8.83" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webflux:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:3.0.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.mapstruct:mapstruct:1.3.1.Final" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-data-rest:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-bean-validators:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:3.0.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.31" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE" level="project" />
<orderEntry type="module-library">
<library name="Maven: com.farsunset:cim-server-sdk:4.0.0">
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/cim-server-sdk-netty-4.0.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.8.0" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.22" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec-http:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-epoll:linux-x86_64:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-unix-common:4.1.65.Final" level="project" />
<orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.17.0" level="project" />
<orderEntry type="library" name="Maven: cn.teaey.apns4j:apns4j:1.1.4" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
</component>
</module>

File diff suppressed because it is too large Load Diff

View File

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="76444805-771d-4ba6-8c14-1f699154c26c" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/cim-boot-server.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/cim-boot-server.ipr" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/cim-boot-server.iws" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="RunManager">
<configuration default="true" type="ArquillianTestNG" factoryName="" nameIsGenerated="true">
<option name="arquillianRunConfiguration">
<value>
<option name="containerStateName" value="" />
</value>
</option>
<option name="TEST_OBJECT" value="CLASS" />
<properties />
<listeners />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="BootApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
<module name="cim-boot-server" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.farsunset.cim.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="SPRING_BOOT_MAIN_CLASS" value="com.farsunset.cim.BootApplication" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<recent_temporary>
<list>
<item itemvalue="Spring Boot.BootApplication" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="76444805-771d-4ba6-8c14-1f699154c26c" name="Default Changelist" comment="" />
<created>1632398352014</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1632398352014</updated>
<workItem from="1632398355222" duration="104000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
</project>

View File

@ -127,15 +127,15 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.teaey.apns4j</groupId> <groupId>com.eatthepath</groupId>
<artifactId>apns4j</artifactId> <artifactId>pushy</artifactId>
<version>1.1.4</version> <version>0.15.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.6</version> <version>2.7</version>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -58,6 +58,9 @@ public class ClosedHandler implements CIMRequestHandler {
sessionGroup.remove(channel); sessionGroup.remove(channel);
/*
* ios开启了apns也需要显示在线因此不删记录
*/
if (!Objects.equals(channel.attr(ChannelAttr.CHANNEL).get(), Session.CHANNEL_IOS)){ if (!Objects.equals(channel.attr(ChannelAttr.CHANNEL).get(), Session.CHANNEL_IOS)){
sessionService.delete(uid,nid); sessionService.delete(uid,nid);
return; return;

View File

@ -28,6 +28,8 @@ public class APNsProperties {
private boolean debug; private boolean debug;
private String appId;
private final P12 p12 = new P12(); private final P12 p12 = new P12();
public static class P12 { public static class P12 {
@ -67,6 +69,13 @@ public class APNsProperties {
return p12.file; return p12.file;
} }
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getP12Password() { public String getP12Password() {
return p12.password; return p12.password;

View File

@ -21,21 +21,23 @@
*/ */
package com.farsunset.cim.service.impl; package com.farsunset.cim.service.impl;
import cn.teaey.apns4j.Apns4j; import com.eatthepath.pushy.apns.ApnsClient;
import cn.teaey.apns4j.network.ApnsChannel; import com.eatthepath.pushy.apns.ApnsClientBuilder;
import cn.teaey.apns4j.network.ApnsChannelFactory; import com.eatthepath.pushy.apns.ApnsPushNotification;
import cn.teaey.apns4j.network.ApnsGateway; import com.eatthepath.pushy.apns.util.ApnsPayloadBuilder;
import cn.teaey.apns4j.protocol.ApnsPayload; import com.eatthepath.pushy.apns.util.SimpleApnsPayloadBuilder;
import com.eatthepath.pushy.apns.util.SimpleApnsPushNotification;
import com.eatthepath.pushy.apns.util.TokenUtil;
import com.farsunset.cim.config.properties.APNsProperties; import com.farsunset.cim.config.properties.APNsProperties;
import com.farsunset.cim.sdk.server.model.Message; import com.farsunset.cim.sdk.server.model.Message;
import com.farsunset.cim.service.APNsService; import com.farsunset.cim.service.APNsService;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@Service @Service
@ -43,15 +45,19 @@ public class APNsServiceImpl implements APNsService {
private static final Logger LOGGER = LoggerFactory.getLogger(APNsServiceImpl.class); private static final Logger LOGGER = LoggerFactory.getLogger(APNsServiceImpl.class);
private final ApnsChannelFactory apnsChannelFactory; private final ApnsClient apnsClient;
private final APNsProperties properties;
@Autowired @Autowired
public APNsServiceImpl(APNsProperties properties){ public APNsServiceImpl(APNsProperties properties) throws IOException {
this.properties = properties;
InputStream stream = getClass().getResourceAsStream(properties.getP12File()); InputStream stream = getClass().getResourceAsStream(properties.getP12File());
apnsChannelFactory = Apns4j.newChannelFactoryBuilder()
.keyStoreMeta(stream) apnsClient = new ApnsClientBuilder()
.keyStorePwd(properties.getP12Password()) .setApnsServer(properties.isDebug() ? ApnsClientBuilder.DEVELOPMENT_APNS_HOST : ApnsClientBuilder.PRODUCTION_APNS_HOST)
.apnsGateway(properties.isDebug() ? ApnsGateway.DEVELOPMENT : ApnsGateway.PRODUCTION) .setClientCredentials(stream, properties.getP12Password())
.build(); .build();
} }
@ -64,29 +70,33 @@ public class APNsServiceImpl implements APNsService {
return ; return ;
} }
ApnsChannel apnsChannel = apnsChannelFactory.newChannel(); ApnsPayloadBuilder payloadBuilder = new SimpleApnsPayloadBuilder();
ApnsPayload apnsPayload = new ApnsPayload();
apnsPayload.alert("您有一条新的消息"); payloadBuilder.setAlertTitle("您有一条新的消息");
apnsPayload.sound("default"); payloadBuilder.setSound("default");
apnsPayload.badge(1); payloadBuilder.setBadgeNumber(1);
apnsPayload.extend("id",message.getId()); payloadBuilder.addCustomProperty("id",message.getId());
apnsPayload.extend("action",message.getAction()); payloadBuilder.addCustomProperty("action",message.getAction());
apnsPayload.extend("content",message.getContent()); payloadBuilder.addCustomProperty("content",message.getContent());
apnsPayload.extend("sender",message.getSender()); payloadBuilder.addCustomProperty("sender",message.getSender());
apnsPayload.extend("receiver",message.getReceiver()); payloadBuilder.addCustomProperty("receiver",message.getReceiver());
apnsPayload.extend("format",message.getFormat()); payloadBuilder.addCustomProperty("format",message.getFormat());
apnsPayload.extend("extra",message.getExtra()); payloadBuilder.addCustomProperty("extra",message.getExtra());
apnsPayload.extend("timestamp",message.getTimestamp()); payloadBuilder.addCustomProperty("timestamp",message.getTimestamp());
try { String token = TokenUtil.sanitizeTokenString(deviceToken);
apnsChannel.send(deviceToken, apnsPayload);
LOGGER.info("APNs push done.\ndeviceToken : {} \napnsPayload : {}",deviceToken,apnsPayload.toJsonString()); String payload = payloadBuilder.build();
}catch(Exception exception) {
LOGGER.error("APNs push failed",exception); ApnsPushNotification notification = new SimpleApnsPushNotification(token, properties.getAppId(), payload);
}finally {
IOUtils.closeQuietly(apnsChannel); apnsClient.sendNotification(notification).whenComplete((response, cause) -> {
} if (response != null) {
LOGGER.info("APNs push done.\ndeviceToken : {} \napnsPayload : {}",deviceToken,payload);
} else {
LOGGER.error("APNs push failed",cause);
}
});
} }
} }

View File

@ -1,81 +0,0 @@
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
***************************************************************************************
* *
* Website : http://www.farsunset.com *
* *
***************************************************************************************
*/
package com.farsunset.cim.util;
import cn.teaey.apns4j.protocol.ApnsPayload;
public class ApnsPayloadCompat extends ApnsPayload {
private static final String DATA_FORMAT = "{\"aps\": {\"message\": {\"action\":\"%s\",\"content\":\"%s\",\"sender\":\"%s\",\"receiver\":\"%s\",\"format\":\"%s\"},\"content-available\": 1}}";
private String action;
private String content;
private String sender;
private String format;
private String receiver;
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
@Override
public String toJsonString() {
return String.format(DATA_FORMAT, action, content, sender,receiver,format);
}
}

View File

@ -63,7 +63,8 @@ spring.messages.basename=i18n/messages
cim.app.port=23456 cim.app.port=23456
cim.websocket.port=34567 cim.websocket.port=34567
#please setting your p12 info. #please setting your p12 info and appId.
cim.apns.p12.file=/apns/app.p12 cim.apns.p12.file=/apns/app.p12
cim.apns.p12.password=123 cim.apns.p12.password=123
cim.apns.debug=false cim.apns.debug=false
cim.apns.app-id=com.xxx.xxx.ios

View File

@ -76,6 +76,10 @@ public class SessionGroup extends ConcurrentHashMap<String, Collection<Channel>>
find(key).stream().filter(matcher).forEach(channel -> channel.writeAndFlush(message)); find(key).stream().filter(matcher).forEach(channel -> channel.writeAndFlush(message));
} }
public void write(String key, Message message, Collection<String> excludedSet){
find(key).stream().filter(channel -> excludedSet == null || !excludedSet.contains(channel.attr(ChannelAttr.UID).get())).forEach(channel -> channel.writeAndFlush(message));
}
public void write(Message message){ public void write(Message message){
this.write(message.getReceiver(),message); this.write(message.getReceiver(),message);
} }

View File

@ -29,7 +29,7 @@ import java.io.Serializable;
/** /**
* 消息对象 * 消息对象
*/ */
public class Message implements Serializable, Transportable { public class Message implements Serializable, Transportable,Cloneable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -171,30 +171,52 @@ public class Message implements Serializable, Transportable {
return txt != null && txt.trim().length() != 0; return txt != null && txt.trim().length() != 0;
} }
@Override
public Message clone(){
Message message = new Message();
message.id = id;
message.action = action;
message.title = title;
message.content = content;
message.sender = sender;
message.receiver = receiver;
message.extra = extra;
message.format = format;
message.timestamp = timestamp;
return message;
}
@Override @Override
public byte[] getBody() { public byte[] getBody() {
MessageProto.Model.Builder builder = MessageProto.Model.newBuilder(); MessageProto.Model.Builder builder = MessageProto.Model.newBuilder();
builder.setId(id); builder.setId(id);
builder.setAction(action); builder.setAction(action);
builder.setSender(sender); builder.setSender(sender);
builder.setReceiver(receiver);
builder.setTimestamp(timestamp); builder.setTimestamp(timestamp);
/** /*
* 下面字段可能为空 * 下面字段可能为空
*/ */
if (receiver != null){
builder.setReceiver(receiver);
}
if (content != null) { if (content != null) {
builder.setContent(content); builder.setContent(content);
} }
if (title != null) { if (title != null) {
builder.setTitle(title); builder.setTitle(title);
} }
if (extra != null) { if (extra != null) {
builder.setExtra(extra); builder.setExtra(extra);
} }
if (format != null) { if (format != null) {
builder.setFormat(format); builder.setFormat(format);
} }
return builder.build().toByteArray(); return builder.build().toByteArray();
} }