smppserversession.java
来自「JSMPP Examples to send and receive sms f」· Java 代码 · 共 540 行 · 第 1/2 页
JAVA
540 行
this.responseDeliveryListener = responseDeliveryListener;
}
private class ResponseHandlerImpl implements ServerResponseHandler {
public PendingResponse<Command> removeSentItem(int sequenceNumber) {
return removePendingResponse(sequenceNumber);
}
public void notifyUnbonded() {
sessionContext.unbound();
}
public void sendEnquireLinkResp(int sequenceNumber) throws IOException {
logger.debug("Sending enquire_link_resp");
pduSender().sendEnquireLinkResp(out, sequenceNumber);
}
public void sendGenerickNack(int commandStatus, int sequenceNumber)
throws IOException {
pduSender().sendGenericNack(out, commandStatus, sequenceNumber);
}
public void sendNegativeResponse(int originalCommandId,
int commandStatus, int sequenceNumber) throws IOException {
pduSender().sendHeader(out, originalCommandId | SMPPConstant.MASK_CID_RESP, commandStatus, sequenceNumber);
}
public void sendUnbindResp(int sequenceNumber) throws IOException {
pduSender().sendUnbindResp(out, SMPPConstant.STAT_ESME_ROK, sequenceNumber);
}
public void sendBindResp(String systemId, BindType bindType, int sequenceNumber) throws IOException {
sessionContext.bound(bindType);
try {
pduSender().sendBindResp(out, bindType.responseCommandId(), sequenceNumber, systemId);
} catch (PDUStringException e) {
logger.error("Failed sending bind response", e);
// TODO uudashr: we have double checking when accept the bind request
}
}
public void processBind(Bind bind) {
bindRequestReceiver.notifyAcceptBind(bind);
}
public MessageId processSubmitSm(SubmitSm submitSm)
throws ProcessRequestException {
return fireAcceptSubmitSm(submitSm);
}
public void sendSubmitSmResponse(MessageId messageId, int sequenceNumber)
throws IOException {
try {
pduSender().sendSubmitSmResp(out, sequenceNumber,
messageId.getValue());
fireSubmitSmRespSent(messageId);
} catch (PDUStringException e) {
/*
* There should be no PDUStringException thrown since creation
* of MessageId should be save.
*/
logger.error("SYSTEM ERROR. Failed sending submitSmResp", e);
fireSubmitSmRespFailed(messageId, e);
} catch (IOException e) {
fireSubmitSmRespFailed(messageId, e);
throw e;
} catch (RuntimeException e) {
fireSubmitSmRespFailed(messageId, e);
throw e;
}
}
public SubmitMultiResult processSubmitMulti(SubmitMulti submitMulti)
throws ProcessRequestException {
return fireAcceptSubmitMulti(submitMulti);
}
public void sendSubmitMultiResponse(
SubmitMultiResult submitMultiResult, int sequenceNumber)
throws IOException {
try {
pduSender().sendSubmitMultiResp(out, sequenceNumber,
submitMultiResult.getMessageId(),
submitMultiResult.getUnsuccessDeliveries());
fireSubmitMultiRespSent(submitMultiResult);
} catch (PDUStringException e) {
/*
* There should be no PDUStringException thrown since creation
* of the response parameter has been validated.
*/
logger.error("SYSTEM ERROR. Failed sending submitMultiResp", e);
fireSubmitMultiRespSentError(submitMultiResult, e);
} catch (IOException e) {
fireSubmitMultiRespSentError(submitMultiResult, e);
throw e;
} catch (RuntimeException e) {
fireSubmitMultiRespSentError(submitMultiResult, e);
throw e;
}
}
public QuerySmResult processQuerySm(QuerySm querySm)
throws ProcessRequestException {
return fireAcceptQuerySm(querySm);
}
public void sendQuerySmResp(String messageId, String finalDate,
MessageState messageState, byte errorCode, int sequenceNumber) throws IOException {
try {
pduSender().sendQuerySmResp(out, sequenceNumber, messageId,
finalDate, messageState, errorCode);
} catch (PDUStringException e) {
/*
* There should be no PDUStringException thrown since creation
* of parsed messageId has been validated.
*/
logger.error("SYSTEM ERROR. Failed sending cancelSmResp", e);
}
}
public DataSmResult processDataSm(DataSm dataSm)
throws ProcessRequestException {
return fireAcceptDataSm(dataSm);
}
// TODO uudashr: we can generalize this method
public void sendDataSmResp(DataSmResult dataSmResult, int sequenceNumber)
throws IOException {
try {
pduSender().sendDataSmResp(out, sequenceNumber,
dataSmResult.getMessageId(),
dataSmResult.getOptionalParameters());
} catch (PDUStringException e) {
/*
* There should be no PDUStringException thrown since creation
* of MessageId should be save.
*/
logger.error("SYSTEM ERROR. Failed sending dataSmResp", e);
}
}
public void processCancelSm(CancelSm cancelSm)
throws ProcessRequestException {
fireAcceptCancelSm(cancelSm);
}
public void sendCancelSmResp(int sequenceNumber) throws IOException {
pduSender().sendCancelSmResp(out, sequenceNumber);
}
public void processReplaceSm(ReplaceSm replaceSm)
throws ProcessRequestException {
fireAcceptReplaceSm(replaceSm);
}
public void sendReplaceSmResp(int sequenceNumber) throws IOException {
pduSender().sendReplaceSmResp(out, sequenceNumber);
}
}
private class PDUReaderWorker extends Thread {
private ExecutorService executorService = Executors.newFixedThreadPool(getPduProcessorDegree());
private Runnable onIOExceptionTask = new Runnable() {
public void run() {
close();
};
};
@Override
public void run() {
logger.info("Starting PDUReaderWorker with processor degree:{} ...", getPduProcessorDegree());
while (isReadPdu()) {
readPDU();
}
close();
executorService.shutdown();
logger.info("PDUReaderWorker stop");
}
private void readPDU() {
try {
Command pduHeader = null;
byte[] pdu = null;
pduHeader = pduReader.readPDUHeader(in);
pdu = pduReader.readPDU(in, pduHeader);
PDUProcessServerTask task = new PDUProcessServerTask(pduHeader,
pdu, sessionContext.getStateProcessor(),
sessionContext, responseHandler, onIOExceptionTask);
executorService.execute(task);
} catch (InvalidCommandLengthException e) {
logger.warn("Receive invalid command length", e);
try {
pduSender().sendGenericNack(out, SMPPConstant.STAT_ESME_RINVCMDLEN, 0);
} catch (IOException ee) {
logger.warn("Failed sending generic nack", ee);
}
unbindAndClose();
} catch (SocketTimeoutException e) {
notifyNoActivity();
} catch (IOException e) {
close();
}
}
/**
* Notify for no activity.
*/
private void notifyNoActivity() {
logger.debug("No activity notified");
enquireLinkSender.enquireLink();
}
}
private class EnquireLinkSender extends Thread {
private final AtomicBoolean sendingEnquireLink = new AtomicBoolean(false);
@Override
public void run() {
logger.info("Starting EnquireLinkSender");
while (isReadPdu()) {
while (!sendingEnquireLink.compareAndSet(true, false) && isReadPdu()) {
synchronized (sendingEnquireLink) {
try {
sendingEnquireLink.wait(500);
} catch (InterruptedException e) {
}
}
}
if (!isReadPdu()) {
break;
}
try {
sendEnquireLink();
} catch (ResponseTimeoutException e) {
close();
} catch (InvalidResponseException e) {
// lets unbind gracefully
unbindAndClose();
} catch (IOException e) {
close();
}
}
logger.info("EnquireLinkSender stop");
}
/**
* This method will send enquire link asynchronously.
*/
public void enquireLink() {
if (sendingEnquireLink.compareAndSet(false, true)) {
synchronized (sendingEnquireLink) {
sendingEnquireLink.notify();
}
}
}
}
private class BoundStateListener implements SessionStateListener {
public void onStateChange(SessionState newState, SessionState oldState,
Object source) {
if (newState.isBound()) {
enquireLinkSender.start();
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?