트러블 슈팅(Trouble Shooting)

시스템 운영 중 혹은 기동 시에 나타날 수 있는 문제점에 대하여 기술합니다.

기술 대상은 아래와 같습니다.

시스템 기동 시 트러블 슈팅

시스템 실행 스크립트 작동 시 서비스가 올라오지 않는 경우입니다.

정상적인 실행 상태

E:\xpush\bin>startup.bat
2007.06.29 14:49:03,SYSTEM_INFO,[SVCL_00005]ServiceURL was set up : file:/E:/mip
ush/conf/xpush_config.xml
[2007/06/29 14:49:03.796][INFO] message provider started with listening port 50002
[2007/06/29 14:49:03.843][INFO] publisher server started with listening port 50001
[2007/06/29 14:49:03.859][INFO] monitor started with listening port 50003

위의 3가지 서비스 (provider service, publisher service, monitor service) 가 모두 정상적인 상태를 보여 줍니다. 이와 다른 형태의 메시지가 나올 경우 먼저 system의 로그 레벨을 수정해 시스템 로그를 확인하고 그에 따라 상황에 대처하도록 합니다.

<depends>
	<service name="FileLogger"
		code="jp.ossc.nimbus.service.log.SimpleCategoryService">
		<attribute name="CategoryName">File</attribute>
		<attribute name="PriorityRange">0:40</attribute> <!--로그 레벨을 높입니다-->
		<attribute name="MessageWriterServiceName">#FileLogWriter</attribute>
		...
	</service>
</depends>

environment variable JAVA_HOME is not defined

원인

환경변수 JAVA_HOME이 설정되지 않은 경우입니다.

해결책

환경변수 JAVA_HOME을 설정합니다.


C:\tobesoft\xpush-2.0\bin>startup.bat

environment variable JAVA_HOME is not defined.

/bin/java: not found

원인

환경변수 JAVA_HOME이 잘못 설정되어 실해파일 java를 찾지 못한 경우입니다.

해결책

환경변수 JAVA_HOME를 올바르게 설정합니다.

환경변수 JAVA_HOME에 설정될 값은 java가 있는 bin이 있는 디렉터리입니다.


mashup@mashup-linux:~/tobesoft/xpush-2.0/bin$ ./startup.sh

exec: 42: /invalid/java/path/bin/java: not found

mashup@mashup-linux:~/tobesoft/xpush-2.0/bin$

WARNING! environment variable XPUSH_HOME is not defined

원인

환경변수 XPUSH_HOME이 설정되지 않은 경우입니다. 이 경우 bin의 상위 디렉터리가 기본값으로 사용됩니다.

해결책

환경변수 XPUSH_HOME을 설정합니다.


C:\tobesoft\xpush-2.0\bin>startup.bat

WARNING! environment variable XPUSH_HOME is not defined. C:\tobesoft\xpush-2.0\bin will be used for XPUSH_HOME

2008.02.19 18:23:10,SYSTEM_INFO,[SVCL_00005]ServiceURL was set up : file:/C:/tobesoft/xpush-2.0/conf/xpush_config.xml

2008.02.19 18:23:10,SYSTEM_INFO,[SVCL_00013]It was set up so that SYSTEM_DEBUG log of Server Logger might not be outputted.

java.net.BindException: Address already in use: bind

원인

X-PUSH 서버가 사용하는 기본 port가 이미 다른 프로세스에 의해 사용되는 경우입니다.

해결책

포트를 사용하는 타 프로세스를 중지시키거나 xpush 포트 변경합니다.


2007.06.29 09:59:35,SYSTEM_INFO,[SVCL_00005]ServiceURL was set up : file:/E:/mipush/conf/xpush_config.xml

2007.06.29 09:59:35,SYSTEM_ERROR,[SVC__00037]Exception occurred in start() processing of Service "PushServer#SocketPushMessageProvider."

java.net.BindException: Address already in use: bind

Exception in thread "main"

java.lang.NoClassDefFoundError: com/tobesoft/xpush/server/XPushServer

원인

환경변수 XPUSH_HOME이 잘못 설정된 경우입니다.

해결책

환경변수 XPUSH_HOME 설정을 확인하십시오.

환경변수 XPUSH_HOME의 값은 bin 디렉터리가 있는 디렉터리 입니다.


E:\xpush\bin>startup.bat

Exception in thread "main" java.lang.NoClassDefFoundError: com/tobesoft/xpush/server/XPushServer

Exception in thread "main" java.lang.UnsupportedClassVersionError

원인

설치된 Java 버전이 1.8 이하일 경우입니다.

해결책

1.8 이상 버전 Java를 설치하십시오.


D:\work\temp\bin>startup.bat

Exception in thread "main" java.lang.UnsupportedClassVersionError:

com/tobesoft/xpush/server/XPushServer (r version 49.0)

at java.lang.ClassLoader.defineClass0(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:539)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)

0403-006 Execute permission denied

원인

실행 스크립트의 실행 권한이 없거나 혹은 실행 모드 설정이 되지 않은 경우입니다.

해결책

실행스크립트에 실행권한을 주거나, 실행 가능한 계정으로 로그인하십시오.

실행 USER와 파일의 OWNER를 확인하여 주세요.


tester:[/home/user2]startup.sh

ksh: startup.sh: 0403-006 Execute permission denied.

tester:[/home/use2]

Error occurred during initialization of VM

원인

메모리가 여유가 실행 스크립트의 크기보다 작을 경우(기본 설정 1024M) 발생합니다.

해결책

bin/startup.bat(sh)에서 –Xms, -Xmx에 설정된 값을 1024보다 작게 설정 합니다.

X-PUSH 서버의 실행 스크립트의 기본 설정 메모리는 1024M 입니다. 실제 가용한 메모리가 이보다 작을 경우 설정을 시스템에 맞게 조정해야 합니다.


E:\xpush\bin>startup.bat

Error occurred during initialization of VM

Could not reserve enough space for object heap

SYSTEM_ERROR,[SVC__00037]Exception occurred in start() processing of Service

"PushServer*MiPlatformProtocolAuthenticator."java.lang.ClassNotFoundException

원인

Authenticator 설정이 잘못된 경우입니다.

해결책

Authenticator가 포함된 jar 파일이 lib 폴더 내에 존재하는지 확인합니다.

xpush_config.xml의 설정이 정확한지 확인합니다.


2007.07.04 14:30:30,SYSTEM_ERROR,[SVC__00037]Exception occurred in start() processing of Service "PushServer#MiPlatformProtocolAuthenticator."

java.lang.ClassNotFoundException: DummyAuthenticator

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

loading MessageFormatter failed. class

원인

Message formatter 설정이 잘못된 경우입니다.

해결책

Message formatter가 포함된 jar 파일이 lib 폴더 내에 존재하는지 확인합니다.

xpush_config.xml의 설정이 정확한지 확인합니다.


2007.07.04 14:34:55,SYSTEM_INFO,[SVCL_00005]ServiceURL was set up : file:/e:/xpush/conf/xpush_config.xml

[2007/07/04 14:34:55.609][INFO] message provider started with listening port 50002

[2007/07/04 14:34:55.625][WARN] TobePublishContainerService: loading MessageFormatter failed. class = DummyMessageFormatter

[2007/07/04 14:34:55.656][WARN] TobePublishContainerService: loading MessageFormatter failed. class = DummyMessageFormatter

[2007/07/04 14:34:55.656][WARN] TobePublishContainerService: loading MessageFormatter failed. class = DummyMessageFormatter

loading PushedMessageProcessor failed. class

원인

PushedMessageProcessor 설정이 잘못된 경우입니다.

해결책

Pushed Message Processor가 포함된 jar 파일이 lib 폴더내에 존재 하는지 확인합니다.

xpush_config.xml의 설정이 정확한지 확인합니다.


2007.07.04 14:34:55,SYSTEM_INFO,[SVCL_00005]ServiceURL was set up : file:/e:/xpush/conf/xpush_config.xml

[2007/07/04 14:34:55.609][INFO] message provider started with listening port 50002

[2007/07/04 14:34:55.625][WARN] TobePublishContainerService: loading PushedMessageProcessor failed. class = DummyPushedMessageProcessor

[2007/07/04 14:34:55.656][WARN] TobePublishContainerService: loading PushedMessageProcessor failed. class = DummyPushedMessageProcessor

[2007/07/04 14:34:55.656][WARN] TobePublishContainerService: loading PushedMessageProcessor failed. class = DummyPushedMessageProcessor

Error: no server' JVM at C:\Program Files\Java\jre1.8.0_11\bin\server\jvm.dll'

원인

java가 JDK가 아닌 JRE로 설치된 경우입니다.

해결책

설정된 JAVA_HOME과 PATH를 원상태로 되돌리고, JDK 1.8.x을 설치 후 JAVA_HOME과 PATH를 다시 설정합니다.


E:\xpush\bin>startup.bat

Error: no server' JVM at C:\Program Files\Java\jre1.8.0_11\bin\server\jvm.dll'.

HP 운영체제에서는 경우 java 실행 옵션 “-server”를 지원하지 않는 경우가 있습니다. 이런 경우에는 $JAVA_HOME/bin/startup.sh의 다음 행에서 –server를 삭제합니다.


set JAVA_OPTS=-Xms1024m -Xmx1024m -server

[ERROR] Invalid license

원인

라이선스 관련 문제입니다.

해결책

정상적인 라이선스 파일을 XPUSH_HOME/conf/ 디렉터리에 복사합니다.


[2015/02/02 13:29:08.840][ERROR] Invalid license

com.nexacro.xapi.license.InvalidLicenseException

com.nexacro.xpush.server.LicenseTask.loadLicense(LicenseTask.java:33)

com.nexacro.xpush.server.LicenseTask.run(LicenseTask.java:73)

java.util.TimerThread.mainLoop(Timer.java:512)

java.util.TimerThread.run(Timer.java:462)

Caused by: java.io.FileNotFoundException: I:\project\workspace_indigo_XPUSH\xpush-2.5.1\conf\X-PUSH_Server_License.xml (The system cannot find the file specified)

java.io.FileInputStream.open(Native Method)

java.io.FileInputStream.<init>(FileInputStream.java:106)

java.io.FileInputStream.<init>(FileInputStream.java:66)

com.nexacro.xpush.server.LicenseTask.loadLicense(LicenseTask.java:30)

com.nexacro.xpush.server.LicenseTask.run(LicenseTask.java:73)

java.util.TimerThread.mainLoop(Timer.java:512)

java.util.TimerThread.run(Timer.java:462)

Service definition XML fatal : Content is not allowed in prolog.

원인

xpush_config.xml 파싱 오류입니다.

해결책

xpush_config.xml 파일 상단 헤더부분에 텍스트나 공백 등이 입력되지 않았는지 확인하고

삭제합니다.


SYSTEM_FATAL,[SVCL_00032]Service definition XML fatal : Content is not allowed in prolog.

java.lang.Exception: Fail to load service definition file \conf\xpush_config.xml

2017.07.17 13:15:08,SYSTEM_ERROR,[SVCL_00010]Loading of a service definition failed : file://conf/xpush_config.xml

org.xml.sax.SAXParseException: Content is not allowed in prolog.

com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)

DB error occured choosing queryset.[Error message: ORA-01157, ORA-01110]

원인

테이블 스페이스가 없거나, 데이터 파일을 열 수 없는 상황입니다.

해결책

해당 데이터 파일을 복구하거나 변경합니다.


[2019/09/03 11:54:11.853][ERROR] DB error occured choosing queryset.

[Error message:ORA-01157: 데이터 파일을 식별 또는 잠금 할 수 없습니다. 추적 파일을 보십시오.79 - DBWR 데이터 파일ORA-01110: 79 : '/oracle/product/11.2.0/dbhome_1/dbs/xpush_data01.dbf']

Fail Get a Database Connection. Check Database

원인

데이터 베이스와 연결이 되지 않은 상황

해결책

1. ip, port 확인

2. JDBC jar 파일 확인

3. JDBC jar 권한 확인

4. 방화벽 확인(telnet)


[2019/09/03 11:54:11.853][ERROR] Fail Get a Database Connection. Check Database

SQLException occured!

원인

다국어 지원 문제

해결책

orai18n.jar 를 $XPUSH_HOME/lib 폴더에 추가


[2019/09/03 11:54:11.853][ERROR] SQLException occured!

java.sql.SQLException: 지원되지 않는 문자 집합(클래스 경로에 orai18n.jar 추가): K016MSWIN949

......

default directory must be absolute

원인

OS 환경 문제

java 에 사용되는 user.dir 이 상대 경로로 잡혀 생기는 현상

해결책

시스템 담당자에게 문의


Caused by: java.lang.RuntimeException: default directory must be absolute

at sun.nio.fs.unixFileSystem.<init>(UnixFileSystem.java:67)

......

AIX running terminal stop

원인

OS 환경 문제

해결책

startup.sh 파일 수정

...... $STARTUP_CLASS "$@" 2</dev/null &



윈도우 서비스 등록 시 트러블 슈팅

X-PUSH 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다.

원인

msvcr100.dll 파일이 없거나 잘못된 경우입니다.

해결책

자바가 설치된 경로 ex)C:\Program Files\Java\jdk1.8.0_191\bin 디렉토리에서 msvcr100.dll 파일을 복사합니다. 그리고 C:\Windows\System32 디렉토리에 존재하는 기존 msvcr100.dll 파일을 대체합니다.

XPUSH_HOME 과 JAVA_HOME 세팅 확인

JAVA_HOME 의 값과 JAVA 결치 경로가 일치 하는지 확인

Error attempting to install X-PUSH service

원인

-

해결책

윈도우 탐색기 자체를 관리자 권한으로 실행 시킨 후 재실행

혹은 명령 프롬프트 자체를 관리자 권한으로 실행 후 install_as_service_bat 실행

can't find jvm.dll

원인

-

해결책

XPUSH_HOME 과 JAVA_HOME 세팅 확인

JAVA_HOME 의 값과 JAVA 설치 경로가 일치하는지 확인

운영 중의 트러블 슈팅

Client

Client 접속 확인

[2021/11/29 13:56:59.013][DEBUG] publisher(/172.10.12.74:60161) : action=AUTH
[2021/11/29 13:56:59.016][DEBUG] publisher(/172.10.12.74:60161) : doAuthAction()
[2021/11/29 13:56:59.016][DEBUG] publisher(/172.10.12.74:60161) : projectID=ANT, id=black01
[2021/11/29 13:56:59.018][INFO] Add Connection User=[ANT, black01], SessionID=/172.10.12.74:60161
[2021/11/29 13:56:59.021][DEBUG] ConnectionManager.Added Entry :  Member=Member [172.10.12.74]:50007 this ,EventType=ADDED ,Name=u:ONLINE_USERINFO ,Key=User [userID=black01] ,Value=ConnectionInfo [ipInfo=/172.10.12.74:60161, serverInetSocketAddress=/172.10.12.74:50007]
[2021/11/29 13:56:59.022][DEBUG] publisher(/172.10.12.74:60161) : auth success
[2021/11/29 13:56:59.022][DEBUG] publisher(/172.10.12.74:60161) : channel created with servant Id /172.10.12.74:60161
[2021/11/29 13:56:59.022][DEBUG] + ConnectionManager size : 1
[2021/11/29 13:56:59.027][DEBUG] [Publisher] SessionID=/172.10.12.74:60161, Action=AUTH, projectID=ANT, UserId=black01
[2021/11/29 13:50:32.747][DEBUG] initialize SockJS handlers:[id: 0x47afa876, L:/172.10.12.74:50000 - R:/172.10.12.74:60120], Server setting isHTTPS:false
[2021/11/29 13:50:32.748][DEBUG] PreflightHandler(/172.10.12.74:60120) channelRead0()
[2021/11/29 13:50:32.748][DEBUG] PreflightHandler(/172.10.12.74:60120) channelRead0() origin:http://127.0.0.1:4098
[2021/11/29 13:50:32.748][DEBUG] ServiceRouter(/172.10.12.74:60120) channelRead0()
[2021/11/29 13:50:32.748][DEBUG] ServiceRouter(/172.10.12.74:60120) handleService() path:/info
[2021/11/29 13:50:32.750][DEBUG] initialize SockJS handlers:[id: 0x06679ad3, L:/172.10.12.74:50000 - R:/172.10.12.74:60121], Server setting isHTTPS:false
[2021/11/29 13:50:32.751][DEBUG] PreflightHandler(/172.10.12.74:60121) channelRead0()
[2021/11/29 13:50:32.751][DEBUG] PreflightHandler(/172.10.12.74:60121) channelRead0() origin:http://127.0.0.1:4098
[2021/11/29 13:50:32.751][DEBUG] ServiceRouter(/172.10.12.74:60121) channelRead0()
[2021/11/29 13:50:32.751][DEBUG] ServiceRouter(/172.10.12.74:60121) handleService() path:/380/sphhngw3/websocket
[2021/11/29 13:50:32.751][DEBUG] ServiceRouter(/172.10.12.74:60121) handleService(), handleSession() transport:/websocket, server:380, sessionId: sphhngw3
[2021/11/29 13:50:32.751][DEBUG] ServiceRouter(/172.10.12.74:60121) handleService(), handleSession() sessionManager Not Contain:sphhngw3
[2021/11/29 13:50:32.751][DEBUG]  + webpush session : sphhngw3
[2021/11/29 13:50:32.751][DEBUG] onConnection: SockJsConnection [protocol=websocket, channel=[id: 0x06679ad3, L:/172.10.12.74:50000 - R:/172.10.12.74:60121]]
[2021/11/29 13:50:32.751][DEBUG] ServiceRouter(/172.10.12.74:60121) handleService(), handleSession() webpush session count : 1
[2021/11/29 13:50:32.751][DEBUG] handleService ctx.fireChannelRead(request)
[2021/11/29 13:50:32.752][DEBUG] handleWebSocketFrame: ["{\"Action\":\"AUTH\",\"ID\":\"black01\",\"PW\":\"...\",\"ProjectID\":\"ANT\"}"]
[2021/11/29 13:50:32.752][TRACE] WebPublisherService(/172.10.12.74:60121) onData(): ["{\"Action\":\"AUTH\",\"ID\":\"black01\",\"PW\":\"...\",\"ProjectID\":\"ANT\"}"]
[2021/11/29 13:50:32.755][TRACE] WebPublisherService(/172.10.12.74:60121) Action: AUTH
[2021/11/29 13:50:32.755][DEBUG] publisher(/172.10.12.74:60121) : doAuthAction()
[2021/11/29 13:50:32.755][DEBUG] publisher(/172.10.12.74:60121) : projectID=ANT, id=black01
[2021/11/29 13:50:32.755][INFO] Add Connection User=[ANT, black01], SessionID=/172.10.12.74:60121
[2021/11/29 13:50:32.756][DEBUG] ConnectionManager.Added Entry :  Member=Member [172.10.12.74]:50007 this ,EventType=ADDED ,Name=u:ONLINE_USERINFO ,Key=User [userID=black01] ,Value=ConnectionInfo [ipInfo=/172.10.12.74:60121, serverInetSocketAddress=/172.10.12.74:50007]
[2021/11/29 13:50:32.757][DEBUG] publisher(/172.10.12.74:60121) : auth success
[2021/11/29 13:50:32.757][DEBUG] publisher(/172.10.12.74:60121) : channel created with servant Id /172.10.12.74:60121
[2021/11/29 13:50:32.757][DEBUG] + ConnectionManager size : 1
[2021/11/29 13:50:32.758][DEBUG] [Publisher] SessionID=/172.10.12.74:60121, Action=AUTH, projectID=ANT, UserId=black01

Message Provider

java.net.ConnectException: Connection refused: connect

원인

X-PUSH 서버에 접속하지 못하는 경우입니다.

해결책

X-PUSH 서버의 운영 port 번호를 확인하고, 해당 MessageProvider에서 port 번호를 사용합니다.

배포 시의 기본값은 50002입니다.

Message Provider 역시 양방향 교신이 되어야 합니다. 단방향만 방화벽에서 허용하는지를 확인합니다.


java.net.ConnectException: Connection refused: connect

at sun.nio.ch.Net.connect(Native Method)

at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:464)

at com.nexacro.xpush.api.PushMessageProvider.connect(Unknown Source)

at DemoPushMessageProvider.main(Unknown Source)

com.nexacro.xpush.fw.service.auth.AuthenticateSystemException

원인

구현된 authenticator가 사용하는 인증시스템에 문제가 있는 경우입니다.

해결책

인증시스템을 점검합니다.


com.nexacro.xpush.fw.service.auth.AuthenticateSystemException:Login System Error Occured

at DummyAuthenticator.authenticate(DummyAuthenticator.java:15)

at com.nexacro.xpush.service.auth.AuthenticatorService.authenticate(Unknown Source)

java.lang.IndexOutOfBoundsException : Index: 0, Size: 0

원인

메시지 전송 시 DB에 정상적으로 적재가 실패했으며, response.getResponseMessage() 호출 시 IndexOutOfBoundsException이 발생합니다.

해결책

response.getMessage()를 호출하여 원인을 분석합니다.


AUTH_FAIL: 아이디와 패스워드를 확인하세요.

TOO_LARGE_MESSAGE: 메시지의 사이즈는 4000바이트보다 작아야합니다.

PROTOCOL_VERSION_ERROR: Provider 프로토콜을 확인하세요.


java.lang.IndexOutOfBoundsException : Index: 0, Size: 0

at java.util.ArrayList.rangeCheck(Unknown Source)

at java.util.ArrayList.get(Unknown Source)

at com.nexacro.xpush.api.PushResponse.getResponseMessage( PushResponse.java:203 )

Message Provider에서는 메시지가 보냈으나 클라이언트에서 받지 못하는 경우

원인

이러한 문제는 몇 가지 원인에 의하여 발생할 수 있습니다.

해결책

원인을 파악하기 위하여 로그를 확인하여 어디까지 메시지가 전달되었는지 파악하여야 합니다. 로그에서 해당 메시지가 정상적으로 처리 되었는지 확인합니다.

로그를 확인했을 때 메시지가 전달되지 않았다면 상황에 따라 처리할 수 있습니다.

로그에서 해당 메시지가 정상적으로 처리 되었는지 확인합니다.

[2007/07/04 16:40:09.984][DEBUG] provider(127.0.0.1:3783) : action=PUSH
[2007/07/04 16:40:10.000][DEBUG] provider(127.0.0.1:3783) : got push message, 
message=[ messageType=CPDT, messageId=1004, values=('1004', '10200') ]
[2007/07/04 16:40:10.000][DEBUG] provider(127.0.0.1:3783) : got push message,
message=[ messageType=OPDT, messageId=ALL, values=('ALL', 'Message Test : 16:40:09') ]
[2007/07/04 16:40:10.000][DEBUG] publisher(127.0.0.1:3784) : pushed to client. 
message=[ messageType=CPDT, messageId=1004, values=('1004', '10200') ]
[2007/07/04 16:40:10.000][DEBUG] publisher(127.0.0.1:3784) : pushed to client.
message=[ messageType=OPDT, messageId=ALL, values=('ALL', ' Message Test : 16

"got push message" 로그가 있다면 메시지 제공자에서 푸시서버까지는 메시지가 제대로 전달된 것입니다. 그리고 "pushed to client" 로그가 있다면 메시지가 푸시 서버에서 클라이언트까지 제대로 전달된 것입니다.

로그를 확인했을 때 메시지가 전달되지 않았다면 아래의 항목으로 확인하여 처리할 수 있습니다.

  1. 메시지가 푸시서버로 전달되지 않는 경우

    메시지 제공자가 연결되었는지 확인합니다. 보통 메시지 제공자에서 설정한 푸시서버의 접속 정보(ip address, port)가 잘못된 경우이거나, 방화벽이나 네트워크 문제인 경우입니다.

// Message Provider 연결이 성공했는지 확인합니다.
[2007/07/04 16:37:14.296][DEBUG] provider(61.107.23.253:3779) : action=AUTH
[2007/07/04 16:37:14.296][TRACE] provider(61.107.23.253:3779) : new provider connection
[2007/07/04 16:37:14.296][DEBUG] provider(61.107.23.253:3779) : id=sdf, password=asdf
[2007/07/04 16:37:14.312][TRACE] provider(61.107.23.253:3779) : auth completed
...
// Message Provider에서 전송한 메시지가 X-PUSH Server에 도착했는지 확인합니다.
[2007/07/04 16:37:14.453][DEBUG] provider(61.107.23.253:3779) : action=PUSH
[2007/07/04 16:37:14.468][DEBUG] provider(61.107.23.253:3779) : got push message
, message=[ messageType=CPDT, messageId=1001, values=('1001', '10000') ]
[2007/07/04 16:37:14.468][DEBUG] provider(61.107.23.253:3779) : got push message, 
message=[ messageType=OPDT, messageId=ALL, values=('ALL', 'Message Test  : 16:37:14') ]
  1. 메시지가 푸시서버까지는 전달되었으나 클라이언트로 전달되지 않는 경우

    클라이언트가 연결을 맺었는지 확인합니다. 푸시서버로의 접속정보(ip address, port)와 방화벽이나 네트워크 설정을 확인합니다.

// 해당 클라이언트가 접속에 성공했는지 확인합니다.
[2007/07/04 16:40:06.703][DEBUG] publisher(61.107.23.253:3785) : data channel created for servantId fec711bc7b1afbb8bf85e3b06f2dc64f10a479a7
[2007/07/04 16:40:06.734][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.734][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1001)
[2007/07/04 16:40:06.750][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.750][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1002)
[2007/07/04 16:40:06.765][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.765][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1003)
...
[2007/07/04 16:40:12.015][DEBUG] publisher(61.107.23.253:3784) : pushed to client. message=[ messageType=CPDT, messageId=1001, values=('1001', '10100') ]
[2007/07/04 16:40:06.703][DEBUG] publisher(61.107.23.253:3785) : data channel created for servantId fec711bc7b1afbb8bf85e3b06f2dc64f10a479a7
[2007/07/04 16:40:06.734][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.734][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1001)
// 클라이언트가 메시지에 대한 토픽을 등록했는지 확인합니다.
[2007/07/04 16:40:06.750][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.750][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1002)
[2007/07/04 16:40:06.765][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.765][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1003)
……………………..
[2007/07/04 16:40:12.015][DEBUG] publisher(61.107.23.253:3784) : pushed to client. message=[ messageType=CPDT, messageId=1001, values=('1001', '10100') ]
[2007/07/04 16:40:06.703][DEBUG] publisher(61.107.23.253:3785) : data channel created for servantId fec711bc7b1afbb8bf85e3b06f2dc64f10a479a7
[2007/07/04 16:40:06.734][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.734][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1001)
// 클라이언트가 메시지에 대한 토픽을 등록했는지 확인합니다.
[2007/07/04 16:40:06.750][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.750][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1002)
[2007/07/04 16:40:06.765][DEBUG] publisher(61.107.23.253:3784) : action=ADDF
[2007/07/04 16:40:06.765][DEBUG] publisher(61.107.23.253:3784) : topic subscribed (CPDT,1003)
...
[2007/07/04 16:40:12.015][DEBUG] publisher(61.107.23.253:3784) : pushed to client. message=[ messageType=CPDT, messageId=1001, values=('1001', '10100') ]
// 만약 등록된 경우라면 메시지의 키(type, id)와 등록한 키가 정확한지 확인합니다.
// 클라이언트가 등록한 토픽에 대하여 메시지가 전달되었는지 확인합니다.
[2007/07/04 16:40:12.015][DEBUG] publisher(61.107.23.253:3784) : pushed to client. message=[ messageType=CPDT, messageId=1002, values=('1002', '10200') ]
  1. 접속이 끊어 지는 경우

주기적으로 KEEP 메시지가 오는지 확인
[2019/06/14 15:43:19.231][DEBUG] publisher(172.10.11.87:28991) : action=KEEP
[2019/06/14 15:43:29.233][DEBUG] publisher(172.10.11.87:28991) : action=KEEP
[2019/06/14 15:43:39.234][DEBUG] publisher(172.10.11.87:28991) : action=KEEP
클라이언트가 KEEP 메시지를 보내지 않았을 경우
[2019/06/17 11:20:43.490][WARN] [publisher] SessionID=172.10.11.87:54106, UserId=user00, message=connection closed. No KeepAlive
[2019/06/17 11:20:43.490][DEBUG] Remove Connection User =User [userID=user00] 172.10.11.87:54106
[2019/06/17 11:20:43.491][TRACE] publisher(172.10.11.87:54106) : connection closed.  No KeepAlive
[2019/06/17 11:20:43.491][DEBUG] - ConnectionManager.Removed Entry :  Member=Member [172.10.11.87]:50007 this ,EventType=REMOVED ,Name=u:ONLINE_USERINFO ,Key=User [userID=user00] ,Value=ConnectionInfo [ipInfo=172.10.11.87:54106, serverInetSocketAddress=/172.10.11.87:50007]
  1. 메시지가 클라이언트로 전달되었으나 클라이언트에서 보이지 않는 경우

    이 경우는 클라이언트에서 메시지를 처리하는 로직에 문제가 있는 경우입니다.

  1. 전체는 아니고 한두 개씩 메시지가 클라이언트로 전송되지 않는 경우

    message formatter가 반환하는 값이 null일 경우 해당 메시지를 클라이언트에 전달하지 않습니다. message formatter의 로직을 확인합니다. 혹은 message formatter 내부의 로직으로 인해 행이 걸린 경우입니다.

  1. Embedded Message Provider에서 생성한 message가 전달되지 않을 경우

    로그에서 embedded Message Provider가 정상적으로 message를 생성하여 전달하는지를 확인합니다.

...
// Embedded Provider에서 메시지가 생성되어 Client에 보낼 준비가 되었는지 확인합니다.
[2007/07/05 11:38:04.484][DEBUG] provider(Embedded Provider) : got push message, message
=[ messageType=CPDT, messageId=1007, values=('1007', 'Message Test1') ]
// Embedded Provider에서 생성된 메시지가 Client에 전달되었는지 확인합니다.
[2007/07/05 11:38:04.484][DEBUG] publisher(127.0.0.1:1421) : pushed to client. message

=[ messageType=CPDT, messageId=1007, values=('1007', 'Message Test1') ]
[2007/07/05 11:38:04.500][DEBUG] provider(Embedded Provider) : got push message, message
=[ messageType=CPDT, messageId=1008, values=('1008', 'Message Test2') ]
[2007/07/05 11:38:04.500][DEBUG] publisher(127.0.0.1:1421) : pushed to client. message
=[ messageType=CPDT, messageId=1008, values=('1008', 'Message Test2') ]

Notification Service

java.net.ConnectException: Connection refused: connect

원인

X-PUSH 서버에 접속하지 못하는 경우입니다.

해결책

X-PUSH 서버의 운영 port 번호를 확인하고, 해당 MessageProvider에서 port 번호를 사용합니다.

배포 시의 기본값은 50002입니다.

Message Provider 역시 양방향 교신이 되어야 합니다. 단방향만 방화벽에서 허용하는지를 확인합니다.


java.net.ConnectException: Connection refused: connect

at sun.nio.ch.Net.connect(Native Method)

at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:464)

at com.nexacro.xpush.api.PushMessageProvider.connect(Unknown Source)

at DemoPushMessageProvider.main(Unknown Source)

Notification이 APNs로 전달되지 않는 경우

[2019/01/11 17:43:41.353][DEBUG] [Apns]: Before Create SSL Socket.APNS_Provider_pool-thread-1
[2019/01/11 17:43:41.353][ERROR] [Apns]: Connection Occured IOException. java.net.SocketException: Permission denied: connect
[2019/01/11 17:43:41.354][TRACE] APNs(Response) : Response From Apns.
        ErrorCode        : Unknown
        Device           : 19126aa707aae420f8600ff1865dc4a9f5eff1bd68142003a138fe0bad9be928

Apns 서버로 지속적으로 요청했으나, 응답이 없을 경우 방화벽이나 네트워크 환경에 의해 문제가 발생할 수 있습니다. 이를 확인하기 위해 XPUSH는 스크립트 파일을 통해 간단히 APNS와 연결 테스트를 수행할 수 있습니다.

APNS 서버로 메시지 테스트 하기

[2019/01/11 16:00:13.868][ERROR] [Apns]: Write Occured IOException. javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_expired
[2019/01/11 16:00:13.868][ERROR] [Apns]: OutputStream Close Occured IOException. javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_expired
[2019/01/11 16:00:13.873][TRACE] APNs(Response) : Response From Apns.
        ErrorCode        : Unknown
        Device           : 19126aa707aae420f8600ff1865dc4a9f5eff1bd68142003a138fe0bad9be928
[2019/01/21 10:20:30.236][ERROR] [Apns]: Write Occured IOException. javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_revoked
[2019/01/21 10:20:30.350][TRACE] APNs(Response) : Response From Apns.
	ErrorCode	: Unknown
	Device  	: c9e075705c00898dec59992c0cf931a43c4dc9a78c1a2e884141941f90d2bcfa

APNS 인증서 갱신하기

[2018/09/27 11:14:13.291][ERROR] [Apns]: Connection Occured ConnectionException. java.net.ConnectException: Connection timed out: connect

xpush 서버는 해당 디바이스에게 APNS 서버로 notification을 요청 할 때마다, 새로운 연결을 수행합니다. 이에 따라, 많은 Notification을 요청할 경우 Apns Connection Exception이 발생할 수 있으며 설정한 retry 만큼 재 연결을 시도합니다.

java.io.FileNotFoundException: I:\workspace\xpush-2.7.x\conf12\apns-certificate2.p12 (지정된 경로를 찾을 수 없습니다)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:120)
	at java.io.FileInputStream.<init>(FileInputStream.java:79)
	at com.nexacro.xpush.apns.ApnsSSLConnection.init(ApnsSSLConnection.java:46)
	at com.nexacro.xpush.apns.Provider.open(Provider.java:35)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.sendEachPayload(XPushApnsConnector.java:102)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.send(XPushApnsConnector.java:47)
	at com.nexacro.xpush.service.notification.ApnsNotifier.consume(ApnsNotifier.java:64)
	at jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	at java.lang.Thread.run(Thread.java:662)
java.lang.NullPointerException
	at com.nexacro.xpush.apns.Provider.sendNotification(Provider.java:111)
	at com.nexacro.xpush.apns.Provider.provide(Provider.java:60)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.sendEachPayload(XPushApnsConnector.java:110)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.send(XPushApnsConnector.java:47)
	at com.nexacro.xpush.service.notification.ApnsNotifier.consume(ApnsNotifier.java:64)
	at jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	at java.lang.Thread.run(Thread.java:662)
javax.net.ssl.SSLException: Received fatal alert: internal_error
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1822)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1004)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:654)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:100)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at com.nexacro.xpush.apns.Provider.sendNotification(Provider.java:130)
	at com.nexacro.xpush.apns.Provider.provide(Provider.java:60)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.sendEachPayload(XPushApnsConnector.java:110)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.send(XPushApnsConnector.java:47)
	at com.nexacro.xpush.service.notification.ApnsNotifier.consume(ApnsNotifier.java:64)
	at jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	at java.lang.Thread.run(Thread.java:662)
javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: Received fatal alert: internal_error
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1343)
	at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
	at java.io.FilterInputStream.read(FilterInputStream.java:90)
	at com.nexacro.xpush.apns.Provider.sendNotification(Provider.java:147)
	at com.nexacro.xpush.apns.Provider.provide(Provider.java:60)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.sendEachPayload(XPushApnsConnector.java:110)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.send(XPushApnsConnector.java:47)
	at com.nexacro.xpush.service.notification.ApnsNotifier.consume(ApnsNotifier.java:64)
	at jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	at java.lang.Thread.run(Thread.java:662)
Caused by: javax.net.ssl.SSLException: Received fatal alert: internal_error
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1822)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1004)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:654)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:100)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at com.nexacro.xpush.apns.Provider.sendNotification(Provider.java:130)
	... 6 more
javax.net.ssl.SSLException: Received fatal alert: internal_error
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1822)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1004)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:818)
	at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
	at java.io.FilterInputStream.read(FilterInputStream.java:90)
	at com.nexacro.xpush.apns.feedback.ApnsFeedbackServer.receiveFeedback(ApnsFeedbackServer.java:109)
	at com.nexacro.xpush.apns.Provider.checkFeedback(Provider.java:103)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.sendEachPayload(XPushApnsConnector.java:133)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.send(XPushApnsConnector.java:47)
	at com.nexacro.xpush.service.notification.ApnsNotifier.consume(ApnsNotifier.java:64)
	at jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	at java.lang.Thread.run(Thread.java:662)
java.lang.NullPointerException
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.sendEachPayload(XPushApnsConnector.java:135)
	at com.nexacro.xpush.service.notification.connector.XPushApnsConnector.send(XPushApnsConnector.java:47)
	at com.nexacro.xpush.service.notification.ApnsNotifier.consume(ApnsNotifier.java:64)
	at jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	at java.lang.Thread.run(Thread.java:662)
[2018/09/28 14:30:10.569][INFO] [APNs](FeedbackService): The Device Token not used. [19fb08169b74677bfea818f11d0acee0d2306830a04efec3a702dacc013a4aa7]

앱을 다시 설치한 경우 디바이스 토큰이 변경되며, 이전 디바이스 토큰으로 메시지를 전송하면 Apns 서버로부터 실패 응답을 받지 않습니다. Feedback Service를 통해 더 이상 작동하지 않는 디바이스토큰에게 메시지를 보내지 않도록 비활성화 합니다.

Apns의 Feedback 옵션을 true로 설정해야 합니다.

[2019/01/11 17:43:41.353][ERROR] [APNs] : [2283c9670e9eed11aa1c8fcca384869fdba2ca1bdfa94c8f09607ace92cf5d16] invalid matching bundleID=com.tobesoft.sampleProject in config.xml

xpush_config.xml 에서


<attribute name="AppInfo" type ="java.util.HashMap">

com.nexacro.apns=C:\tmp\apns.p12,tobe0701,PKCS12,false,

</attribute>


com.nexacro.apns 부분과 일치하지 않아 생기는 오류

com.nexacro.apns 부분을 해당 BundleID 로 수정 후 재 기동

Notification이 GCM으로 전달되지 않는 경우

[2019/01/11 17:43:41.353][ERROR] [FCM]: Send Message Result is null.
[2019/01/11 17:43:41.353][TRACE] FCM(Response) : Response From Firebase.
        ErrorCode       : Unavailable
        Device          : APA91bF5vaa4IHSQD-oLBBjAlQ5QsAbNBTSEy1wG7hN9KueiPgFDWicVDWcJWm7L7a_DIohg4SuJ4ePiBD831Vfwtw-KOx
Enjj5jnPSP-kl7oF15SnKY-QvI-59DF5flZOrneS8owfCe

FCM 서버로 지속적으로 요청했으나, 응답이 없을 경우 방화벽이나 네트워크 환경에 의해 문제가 발생할 수 있습니다. 이를 확인하기 위해 XPUSH는 스크립트 파일을 통해 간단히 FCM 서버와와 연결 테스트를 수행할 수 있습니다.


FCM 서버로 메시지 테스트 하기

[2018/03/05 13:48:12.316][DEBUG] GcmHttpConnector: send Message(priority=high, data: {cmd=RELI,nParam=3,prefix=null,message=Mobiletest12345678,postfix=null,topicType=NOTI,topicId=ALL,badge=20}) to [APA91bGa2qSZ9TPad6_EONvNXiSQY7Nv1OtQPhCL1plqMJ3icdiXoZ-WiqwnRU-o5cCkyPw1DJGFKZ-DBdn0-vr7vGYBAFmEKeBqNUoSu5-N_zke--jTF0ARG_ykGQb9iCaiNZWsTRZn], Result:null
com.google.android.gcm.server.InvalidRequestException: HTTP Status Code: 401()
	at com.google.android.gcm.server.Sender.makeGcmHttpRequest(Sender.java:484)
	at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:422)
	at com.nexacro.xpush.service.notification.connector.GcmHttpConnector.sendMessage(GcmHttpConnector.java:216)
	at com.nexacro.xpush.service.notification.connector.GcmHttpConnector.send(GcmHttpConnector.java:54)
	at com.nexacro.xpush.service.notification.GcmNotifier.consume(GcmNotifier.java:64)
	at jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
	at com.nexacro.xpush.service.notification.connector.GcmHttpConnector.toGcmResult(GcmHttpConnector.java:129)
	at com.nexacro.xpush.service.notification.connector.GcmHttpConnector.send(GcmHttpConnector.java:58)
	at com.nexacro.xpush.service.notification.GcmNotifier.consume(GcmNotifier.java:64)
	at jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	at java.lang.Thread.run(Thread.java:745)
[2018/09/28 15:35:00.187][INFO] FCM(Response): The Device token Changed.
 	
[APA91bFWx9b_hxWSlgjKMPQTXNDgncwcrKhEgIDeT0LXkKH92s1rPW9NmEnhSYUFdxVteVTtkONcySDYptsRvXYaQ2Xa1wbenGO5OYemoM26NeSKk1z4r_yMDA62pJwYCh1FKAl0ZAuw]
 -> 
[APA91bEp2DbA3l1wARO5vvK9nd1ovR9t6YiVPt-RwzCSi3MmmDDSq84oZtFs86XYErKu6L6VcZ-hQEYluNrafWOYVKdSZs1aH8v7mdqww5zl827mUMGTRLd6TpnZDCcnrAlxX78hgArV]

디바이스 토큰이 변경되면, FCM 서버로부터 변경된 디바이스 토큰을 확인 할 수 있으며 기존 디바이스 토큰으로 메시지를 보내지 못하도록 비활성화 합니다.


디바이스토큰에 대한 사항은 다음 링크에서 확인 할 수 있습니다.

https://firebase.google.com/docs/cloud-messaging/android/client#sample-register

[2020/08/31 10:41:39.523][DEBUG] [FCM] : [xxxxxx8KQ6eMIUO6KjywE7:xxxxxxxxx_8MI-XXmpalmXxxxx_XzXj9iXXXXXjX4p6qXpO1XXXXXXXH-XQ20n_wXX5ps8Sv97tcx5ZdXXumtXXuX1XXXXqbXX5XoxxXX2_hatg2ga0KbsKptXXX2X10ewXXX7_y3vXX] invalid matching SenderID=123456789012 in config.xml

서버의 세팅되어 있는 값과 T_MOBILE 테이브에 세팅 되어 있는 값이 상이한 경우 발생하는 에러

Dbcp Service

tibero에서 다음과 같은 에러가 발생할 경우

No more extent available in tablespace 'SYSTEM'.

원인

tibero의 System Tablespace의 공간이 부족한 경우입니다.

해결책

해당 Tablespace 의 TotalSize를 증가시킵니다.

[ERROR] Exception :
java.sql.SQLException: JDBC-21004:No more extent available in tablespace 'SYSTEM'.
	com.tmax.tibero.jdbc.err.TbError.makeSQLException(Unknown Source)
	com.tmax.tibero.jdbc.err.TbError.newSQLException(Unknown Source)
	com.tmax.tibero.jdbc.msg.common.TbMsgError.readErrorStackInfo(Unknown Source)
	com.tmax.tibero.jdbc.msg.TbMsgEreply.deserialize(Unknown Source)
	com.tmax.tibero.jdbc.comm.TbStream.readMsg(Unknown Source)
	com.tmax.tibero.jdbc.comm.TbCommType4.prepareExecute(Unknown Source)
	com.tmax.tibero.jdbc.driver.TbPreparedStatementImpl.executeCompleteSQL(Unknown Source)
	com.tmax.tibero.jdbc.driver.TbPreparedStatementImpl.executeInternal(Unknown Source)
	com.tmax.tibero.jdbc.driver.TbPreparedStatementImpl.executeUpdate(Unknown Source)
	com.tmax.tibero.jdbc.driver.TbPreparedStatement.executeUpdate(Unknown Source)
	org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
	org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
	com.nexacro.xpush.service.repository.job.sql.plainSql.executeUpdateStatement(Unknown Source)
	com.nexacro.xpush.service.repository.job.sql.OracleSql2511DontUseTrigger.insertTopicMessage(Unknown Source)
	com.nexacro.xpush.service.repository.job.ProvidedMessageProcess.executeQuery(Unknown Source)
	com.nexacro.xpush.service.repository.job.DBProcessRunnable.run(Unknown Source)
	java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	java.lang.Thread.run(Thread.java:662)

No more undo space available

원인

tibero의 undo Tablespace의 공간이 부족한 경우입니다.

해결책

해당 Tablespace 의 TotalSize를 증가시킵니다.

java.sql.BatchUpdateException: JDBC-21002:No more undo space available.
	com.tmax.tibero.jdbc.comm.TbCommType4.batchUpdateLoop(Unknown Source)
	com.tmax.tibero.jdbc.driver.TbPreparedStatementImpl.executeBatch(Unknown Source)
	com.tmax.tibero.jdbc.driver.TbPreparedStatement.executeBatch(Unknown Source)
	org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
	org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
	com.nexacro.xpush.service.repository.job.sql.reliableSql.executeBatch(reliableSql.java:428)
	com.nexacro.xpush.service.repository.job.sql.reliableSql.updateTopicMessage(reliableSql.java:384)
	com.nexacro.xpush.service.repository.job.ResponseMessageProcess.executeQuery(ResponseMessageProcess.java:40)
	com.nexacro.xpush.service.repository.job.DBProcessRunnable.run(DBProcessRunnable.java:37)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	java.lang.Thread.run(Thread.java:745)

Unable to open a session.

원인

tibero의 open 가능한 session 수가 부족한 경우입니다.

해결책

MAX_SESSION_COUNT 증가시킨 후 DB를 재구동합니다.

[ERROR] Exception :
java.sql.SQLException: JDBC-12003:Unable to open a session.
	com.tmax.tibero.jdbc.err.TbError.makeSQLException(Unknown Source)
	com.tmax.tibero.jdbc.err.TbError.newSQLException(Unknown Source)
	com.tmax.tibero.jdbc.msg.common.TbMsgError.readErrorStackInfo(Unknown Source)
	com.tmax.tibero.jdbc.msg.TbMsgEreply.deserialize(Unknown Source)
	com.tmax.tibero.jdbc.comm.TbStream.readMsg(Unknown Source)
	com.tmax.tibero.jdbc.comm.TbCommType4.logon(Unknown Source)
	com.tmax.tibero.jdbc.driver.TbConnection.openConnection(Unknown Source)
	com.tmax.tibero.jdbc.TbDriver.connectInternal(Unknown Source)
	com.tmax.tibero.jdbc.TbDriver.connect(Unknown Source)
	java.sql.DriverManager.getConnection(DriverManager.java:571)
	java.sql.DriverManager.getConnection(DriverManager.java:215)
	org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:75)
	org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
	org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1188)
	org.apache.commons.dbcp.PoolingDriver.connect(PoolingDriver.java:180)
	java.sql.DriverManager.getConnection(DriverManager.java:571)
	java.sql.DriverManager.getConnection(DriverManager.java:233)
	com.nexacro.xpush.service.dbConPool.DBCPService.getConnection(Unknown Source)
	com.nexacro.xpush.service.repository.handler.AbstractQueueHandler.consume(Unknown Source)
	jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	java.lang.Thread.run(Thread.java:745)

oracle 에서 다음과 같은 에러가 발생할 경우

ORA-02289: 시퀀스가 존재하지 않습니다.

원인

X-PUSH 서버에서 사용하는 T_MOBILE_SEQUENCE, T_NOTIFICATION_SEQUENCE, T_TOPIC_SEQUENCE 시퀀스가 존재하지 않거나, 권한이 없을 경우

해결책

- 시퀀스가 존재하지 않을 경우

[시퀀스 생성 쿼리]

CREATE SEQUENCE t_topic_sequence START WITH 1 INCREMENT BY 1;

CREATE SEQUENCE t_user_message_sequence START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999999999999999999 CYCLE;

CREATE SEQUENCE t_mobile_sequence START WITH 1 INCREMENT BY 1;

CREATE SEQUENCE t_notification_sequence START WITH 1 INCREMENT BY 1;


- 권한이 없을 경우

[Database 접속 권한으로 생성]


[접속 권한 확인 Query]

select * from all_sequences where sequence_owner = 'C##XPUSH';

select * from all_tables where owner = 'C##XPUSH';


[권한 부여(GRANT) 케이스]

synonym 를 생성해줘야 한다. (xpush 소스에 쿼리가 포함되어 있어 쿼리 수정 불가)

java.sql.SQLSyntaxErrorException: ORA-02289: 시퀀스가 존재하지 않습니다.

SSL

도메인으로 접속하지 않을 경우( IP로 접속 시도했을 경우 )

[2020/11/04 15:09:26.378][DEBUG] PreflightHandlerOutbound(/158.44.51.49:14546) exceptionCaught:io.netty.handler.codec.De

coderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown

[2020/11/04 15:09:26.386][DEBUG] initialize SockJS handlers:[id: 0xe3ecf5a0, L:/158.44.51.49:50000 - R:/158.44.51.49:145

51], Server setting isHTTPS:true

[2020/11/04 15:09:26.443][DEBUG] PreflightHandlerOutbound(/158.44.51.49:14551) exceptionCaught:io.netty.handler.codec.De

coderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown

원인

IP 로 접속 시도

해결책

https 접속 시 domain 으로 접속

정상적인 인증서가 아닌 경우

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown

원인

올바른 형식의 인증서가 아님

해결책

정삭적인 인증서 적용

IBM AIX 에서 TLS 1.2 적용

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown

원인

AIX 에서는 기본적으로 TLS 1.0 으로 세팅

해결책

xpush 구동시 JDK 옵션 추가 ( -Dcom.ibm.jsse2.overrideDefaultTLS=ture )


$XPUSH_HOME/bin/startup.sh 파일에 아래의 내용 추가

JAVA_OPTS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -Djava.net.preferIPv4Stack=true -Dcom.ibm.jsse2.overrideDefaultTLS=true"

운영 서버

Too many open files

원인

시스템에서 사용할 수 있는 파일 수가 작게 설정되어 있는 경우입니다.

해결책

서버 관리자에게 설정을 크게 요청합니다.


Windows XP나 Unix/Linux의 일반 계정일 경우 발생할 수 있습니다. 동시에 오픈할 수 있는 파일 수는 최소 4,000개 이상이어야 합니다.


Could not accept connection : java.net.SocketException: Too many open files

java.net.SocketException: Too many open files

at java.net.PlainSocketImpl.socketAccept(Native Method)

jp.ossc.nimbus.service.publish.AnalyzeProcessException: Could not entry

원인

접속 가능한 클라이언트의 최대 수에 도달한 경우입니다.

해결책

서버를 증설합니다.

최대접속수의 변경은 설정파일에서 가능하나 X-PUSH 서버의 성능에 큰 영향을 끼칠 수 있습니다. 변경하여야 하는 경우 고객센터에 문의하십시오.


[2007/07/04 14:38:54.187][DEBUG] publisher(127.0.0.1:2786) : id=test, authToken=test

[2007/07/04 14:38:54.187][WARN] protocolUser : container is full

[2007/07/04 14:38:54.187][DEBUG] publisher(127.0.0.1:2786) : exception occured.

jp.ossc.nimbus.service.publish.AnalyzeProcessException: Could not entry

: 422ce79163fad1607722cacb1e09cf415628a8c0

at com.nexacro.xpush.service.publish.MiPlatformPublisherProtocolService.

doAuthAction(Unknown Source)

at com.nexacro.xpush.service.publish.MiPlatformPublisherProtocolService.analyze(Unknown Source)

at com.nexacro.xpush.fw.service.publish.TobePublisherService$SocketReader.

read(Unknown Source)

at com.nexacro.xpush.fw.service.publish.TobePublisherService$SocketReader.

consume(Unknown Source)

java.lang.OutOfMemoryError: Java heap space

원인

메모리가 여유가 실행 스크립트의 크기보다 작을 경우(기본 설정 1,024M) 발생합니다.

해결책

bin/startup.bat(sh)에서 –Xms, -Xmx에 설정된 값을 크게 합니다.

X-PUSH 서버의 실행 스크립트의 기본 설정 메모리는 1,024M 입니다. 실제 가용한 메모리가 이보다 작을 경우 설정을 시스템에 맞게 조정해야 합니다.


[2007/07/04 14:00:46.578][TRACE] provider(127.0.0.1:2338) : connection closed.

e=java.lang.OutOfMemoryError: Java heap space

[2007/07/04 14:00:46.578][DEBUG] provider : exception occured.

java.lang.OutOfMemoryError: Java heap space

java.io.IOException: There is not enough space on the disk

원인

하드 디스크의 공간이 부족한 경우입니다.

해결책

불필요한 파일을 삭제합니다.

보통 log 등에 의해 디스크 공간이 모두 사용되는 경우 발생합니다.


[2007/07/04 15:02:06.312][DEBUG] provider(127.0.0.1:3077) : action=PUSH

log4j:ERROR Failed to flush writer,

java.io.IOException: There is not enough space on the disk

at java.io.FileOutputStream.writeBytes(Native Method)

at java.io.FileOutputStream.write(FileOutputStream.java:260)

at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)

at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)

at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)

at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)

Decryption operation failed, ommitting any further information aboutthe cause for security reasons.

원인

user.properties 의 passwod 부분(암호화)이 회손외었을 경우

해결책

passwod 를 암호화하여 user.properties 에 적용 한다.

(run_property_encrypt 스크립트를 이용하여 생성함)


[2020/06/04 15:33:16.862][ERROR] monitor : exception occured.

com.tobesoft.xpush.crypto.EncryptionOperationFailedException: Decryption operation failed, ommitting any further information aboutthe cause for security reasons.

com.tobesoft.xpush.crypto.XPushPBEStringEncryptor.decrypt(XPushPBEStringEncryptor.java:100)

com.tobesoft.xpush.fw.service.auth.UserPropertiesEncryptAuthenticator.authenticate(UserPropertiesEncryptAuthenticator.java:77)

com.tobesoft.xpush.service.auth.AuthenticatorService.authenticate(AuthenticatorService.java:118)

com.tobesoft.xpush.service.monitor.PushMonitorProtocolService.doLogin(PushMonitorProtocolService.java:861)

com.tobesoft.xpush.service.monitor.PushMonitorProtocolService.analyze(PushMonitorProtocolService.java:143)

com.tobesoft.xpush.service.monitor.PushMonitorService$SocketReader.read(PushMonitorService.java:562)

com.tobesoft.xpush.service.monitor.PushMonitorService$SocketReader.consume(PushMonitorService.java:483)

jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)

java.lang.Thread.run(Thread.java:809)

운영 서버의 비정상 shutdown

we are being asked to shutdown when active = true

원인

의도해서 xpush 서버로 종료 SIGTERM을 보낸 경우가 아니라면, 제어 터미널에 의해 xpush 서버는 shutdown 될 수 있습니다.

해결책

SIGTERM을 받지 않도록 설정하거나 사용 중이지 않은 터미널의 접속을 해제합니다.

[DEBUG] [10.0.1.154]:10187 [dev] ** we are being asked to shutdown when active = true
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down the clientHandlerService
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down the connection manager
[DEBUG] [10.0.1.154]:10187 [dev] Stopping ConnectionManager
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down SocketAcceptor thread.
[DEBUG] [10.0.1.154]:10187 [dev] Closing selector hz._hzInstance_1_dev.IO.thread-Acceptor
[TRACE] [10.0.1.154]:10187 [dev] Connection [Address[10.0.1.155]:10187] lost. Reason: java.io.EOFException[null]
[DEBUG] [10.0.1.154]:10187 [dev] Destroying Connection [/10.0.1.155:55940 -> Address[10.0.1.155]:10187] live=false, client=false, type=MEMBER
[DEBUG] [10.0.1.154]:10187 [dev] Connection is removed Address[10.0.1.155]:10187
[TRACE] [10.0.1.154]:10187 [dev] Connection [Address[10.0.1.156]:10187] lost. Reason: java.io.EOFException[null]
[DEBUG] [10.0.1.154]:10187 [dev] Destroying Connection [/10.0.1.156:59607 -> Address[10.0.1.156]:10187] live=false, client=false, type=MEMBER
[DEBUG] [10.0.1.154]:10187 [dev] Connection is removed Address[10.0.1.156]:10187
[DEBUG] [10.0.1.154]:10187 [dev] An error occurred on connection to Address[10.0.1.156]:10187 Cause => java.io.EOFException {null}, Error-Count: 1
[DEBUG] [10.0.1.154]:10187 [dev] An error occurred on connection to Address[10.0.1.155]:10187 Cause => java.io.EOFException {null}, Error-Count: 1
[WARN] [10.0.1.154]:10187 [dev] hz._hzInstance_1_dev.IO.thread-1 Closing socket to endpoint Address[10.0.1.155]:10187, Cause:java.io.EOFException
[WARN] [10.0.1.154]:10187 [dev] hz._hzInstance_1_dev.IO.thread-2 Closing socket to endpoint Address[10.0.1.156]:10187, Cause:java.io.EOFException
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down IO selectors, total: 3
[DEBUG] [10.0.1.154]:10187 [dev] closing selector hz._hzInstance_1_dev.IO.thread-0
[DEBUG] [10.0.1.154]:10187 [dev] closing selector hz._hzInstance_1_dev.IO.thread-1
[TRACE] provider(127.0.0.1:58192) : connection closed.  e=java.lang.IllegalStateException: Hazelcast Instance is not active!
[ERROR] provider : exception occured.
java.lang.IllegalStateException: Hazelcast Instance is not active!
	com.hazelcast.impl.FactoryImpl.initialChecks(FactoryImpl.java:755)
	com.hazelcast.impl.TopicProxyImpl.ensure(TopicProxyImpl.java:42)
	com.hazelcast.impl.TopicProxyImpl.publish(TopicProxyImpl.java:88)
	com.nexacro.xpush.service.node.hazel.NodeManagerService.publish(Unknown Source)
	com.nexacro.xpush.service.provider.SocketPushMessageProviderProtocolService.publishToNode(Unknown Source)
	com.nexacro.xpush.service.provider.SocketPushMessageProviderProtocolService.doReceivePushMessage(Unknown Source)
	com.nexacro.xpush.service.provider.SocketPushMessageProviderProtocolService.distribute(Unknown Source)
	com.nexacro.xpush.service.provider.SocketPushMessageProviderProtocolService.analyze(Unknown Source)
	com.nexacro.xpush.service.provider.SocketPushMessageProviderService$SocketReader.read(Unknown Source)
	com.nexacro.xpush.service.provider.SocketPushMessageProviderService$SocketReader.consume(Unknown Source)
	jp.ossc.nimbus.daemon.Daemon.run(Daemon.java:394)
	java.lang.Thread.run(Thread.java:853)
    
[DEBUG] [10.0.1.154]:10187 [dev] closing selector hz._hzInstance_1_dev.IO.thread-2
[DEBUG] [10.0.1.154]:10187 [dev] Closing server socket channel: sun.nio.ch.ServerSocketChannelImpl[/0.0.0.0:10187]
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down the concurrentMapManager
[DEBUG] [10.0.1.154]:10187 [dev] Destroying CMap[c:__hz_Locks]
[DEBUG] [10.0.1.154]:10187 [dev] Destroying CMap[m:u:ONLINE_USERINFO]
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down the partition manager
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down the cluster service
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down the cluster manager
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down the executorManager
[TRACE] [10.0.1.154]:10187 [dev] Destroying node initializer.
[DEBUG] [10.0.1.154]:10187 [dev] Shutting down thread hz._hzInstance_1_dev.HealthMonitor
[TRACE] [10.0.1.154]:10187 [dev] Hazelcast Shutdown is completed in 2261 ms.

SSL 인증서

MOZILLA_PKIX_ERROR_ADDITIONAL_POLICY_CONSTRAINT_FAILED

웹사이트의 인증서가 Mozilla의 CA 인증 프로그램을 준수하지 않음

SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE

인증서의 날자가 유효하지 않음

SEC_ERROR_EXPIRED_CERTIFICATE

인증서의 날자가 만료

SEC_ERROR_UNKNOWN_ISSUER

발급자 인증서를 알 수 없으므로 인증서를 신뢰할수 없음

MOZILLA_PKIX_ERROR_MITM_DETECTED

발급자 인증서를 알 수 없으므로 인증서를 신뢰할수 없음

ERROR_SELF_SIGNED_CERT

인증서가 자체 서명되기때문에 신뢰할 수 없음

SSL_ERROR_BAD_CERT_DOMAIN

이 사이트는 특정 사이트에 대해 유효하지 않은 인증서를 사용하므로 Firefox가 신뢰하지 않음

위와 같은 에러가 발생시 정상적인 인증서 교체가 필요함

https://support.mozilla.org/ko/kb/what-does-your-connection-is-not-secure-mean

공통 확인 사항

클라이언트 확인 사항

Message Client

에러 코드가 "-300"

원인

X-PUSH 서버에 접속하지 못한 경우입니다.

해결책

운영서버의 port를 확인하여 일치시킵니다

배포시의 기본값은 50001입니다.

Message Provider 역시 양방향 교신이 되어야 합니다. 단방향만 방화벽에서 허용하는지를 확인합니다.

에러코드가 "-201 혹은 -202"인 경우

원인

접속하였으나 인증이 실패한 경우입니다.

해결책

Id, password를 확인합니다.

authenticator가 정상적으로 작동하는지 확인합니다.

인증시스템을 점검합니다.

데모 프로그램 등을 이용하여 테스트를 수행할 수 있습니다.

혹은 서버에서 처리할 수 있는 Client의 동시 접속자 수를 초과한 경우입니다. 이 경우 로그 파일을 확인합니다.

X-PUSH 서버에 접속할때 -801오류가 모바일에서만 발생. 런타임에서는 동작.

원인

모바일환경에서의 경로설정이 다르기 때문에 발생.

해결책

모바일에서는 경로명 앞에 %USERAPP% 앨리어스를 붙여야함.

- 예시 -

런타임: AA::push_message_layout.xml

모바일: %USERAPP%/AA/push_message_layout.xml

X-PUSH 서버로부터 메시지를 받지 못할 경우

원인

단계별 처리가 제대로 수행되지 않았기 때문에 발생.

해결책

단계별 과정에 대해 확인합니다.

1) Connection이 정상적으로 수행됐는지 확인합니다.

2) Subscribe가 정상적으로 수행됐는지 확인합니다.

3) xpush 오브젝트에 layout이 제대로 설정되었는지 확인합니다.

4) layout의 필드값과 dataSet의 컬럼이 일치하는지 확인합니다.

스크립트 확인 사항

Linux shell script 사용 시, 특수문자가 들어간 인자를 넣을 경우,

스크립트가 정상 동작하지 않을 수 있습니다.

ex) event not found


인자값을 ''(single quotation) 으로 감싸서 입력하면 정상 동작합니다.

패치 주의 사항

v2.8.9 이전 버전에서 v2.8.9 이상의 버전으로 패치하고자 하는 경우,

패치하고자 하는 버전의 제품을 기반으로 두고 사용하시던 $XPUSH_HOME/conf/xpush_config.xml 내용 중 필요한 사항으로 수정하는 것을 권장드립니다.


권장 이유 : v2.8.9 에서 Log4j2 반영으로 패치 시, 수정해야 할 사항이 많고, 또한 v2.8.12 이상 버전에서 script 추가 등의 변경사항이 있어 수동 패치 시, 어려움이 있을 수 있습니다.