📄 smppsession.java
字号:
RegisteredDelivery registeredDelivery,
ReplaceIfPresentFlag replaceIfPresentFlag, DataCoding dataCoding,
byte smDefaultMsgId, byte[] shortMessage,
OptionalParameter[] optionalParameters) throws PDUException,
ResponseTimeoutException, InvalidResponseException,
NegativeResponseException, IOException {
SubmitMultiCommandTask task = new SubmitMultiCommandTask(pduSender(),
serviceType, sourceAddrTon, sourceAddrNpi, sourceAddr,
destinationAddresses, esmClass, protocolId, priorityFlag,
scheduleDeliveryTime, validityPeriod, registeredDelivery,
replaceIfPresentFlag, dataCoding, smDefaultMsgId, shortMessage,
optionalParameters);
SubmitMultiResp resp = (SubmitMultiResp)executeSendCommand(task,
getTransactionTimer());
return new SubmitMultiResult(resp.getMessageId(), resp
.getUnsuccessSmes());
}
/* (non-Javadoc)
* @see org.jsmpp.session.ClientSession#queryShortMessage(java.lang.String, org.jsmpp.bean.TypeOfNumber, org.jsmpp.bean.NumberingPlanIndicator, java.lang.String)
*/
public QuerySmResult queryShortMessage(String messageId,
TypeOfNumber sourceAddrTon, NumberingPlanIndicator sourceAddrNpi,
String sourceAddr) throws PDUException, ResponseTimeoutException,
InvalidResponseException, NegativeResponseException, IOException {
QuerySmCommandTask task = new QuerySmCommandTask(pduSender(),
messageId, sourceAddrTon, sourceAddrNpi, sourceAddr);
QuerySmResp resp = (QuerySmResp)executeSendCommand(task,
getTransactionTimer());
if (resp.getMessageId().equals(messageId)) {
return new QuerySmResult(resp.getFinalDate(), resp
.getMessageState(), resp.getErrorCode());
} else {
// message id requested not same as the returned
throw new InvalidResponseException(
"Requested message_id doesn't match with the result");
}
}
/* (non-Javadoc)
* @see org.jsmpp.session.ClientSession#replaceShortMessage(java.lang.String, org.jsmpp.bean.TypeOfNumber, org.jsmpp.bean.NumberingPlanIndicator, java.lang.String, java.lang.String, java.lang.String, org.jsmpp.bean.RegisteredDelivery, byte, byte[])
*/
public void replaceShortMessage(String messageId,
TypeOfNumber sourceAddrTon, NumberingPlanIndicator sourceAddrNpi,
String sourceAddr, String scheduleDeliveryTime,
String validityPeriod, RegisteredDelivery registeredDelivery,
byte smDefaultMsgId, byte[] shortMessage) throws PDUException,
ResponseTimeoutException, InvalidResponseException,
NegativeResponseException, IOException {
ReplaceSmCommandTask replaceSmTask = new ReplaceSmCommandTask(
pduSender(), messageId, sourceAddrTon, sourceAddrNpi,
sourceAddr, scheduleDeliveryTime, validityPeriod,
registeredDelivery, smDefaultMsgId, shortMessage);
executeSendCommand(replaceSmTask, getTransactionTimer());
}
/* (non-Javadoc)
* @see org.jsmpp.session.ClientSession#cancelShortMessage(java.lang.String, java.lang.String, org.jsmpp.bean.TypeOfNumber, org.jsmpp.bean.NumberingPlanIndicator, java.lang.String, org.jsmpp.bean.TypeOfNumber, org.jsmpp.bean.NumberingPlanIndicator, java.lang.String)
*/
public void cancelShortMessage(String serviceType, String messageId,
TypeOfNumber sourceAddrTon, NumberingPlanIndicator sourceAddrNpi,
String sourceAddr, TypeOfNumber destAddrTon,
NumberingPlanIndicator destAddrNpi, String destinationAddress)
throws PDUException, ResponseTimeoutException,
InvalidResponseException, NegativeResponseException, IOException {
CancelSmCommandTask task = new CancelSmCommandTask(pduSender(),
serviceType, messageId, sourceAddrTon, sourceAddrNpi,
sourceAddr, destAddrTon, destAddrNpi, destinationAddress);
executeSendCommand(task, getTransactionTimer());
}
public MessageReceiverListener getMessageReceiverListener() {
return messageReceiverListener;
}
public void setMessageReceiverListener(
MessageReceiverListener messageReceiverListener) {
this.messageReceiverListener = messageReceiverListener;
}
@Override
protected Connection connection() {
return conn;
}
@Override
protected AbstractSessionContext sessionContext() {
return sessionContext;
}
@Override
protected GenericMessageReceiverListener messageReceiverListener() {
return messageReceiverListener;
}
private synchronized boolean isReadPdu() {
return sessionContext.getSessionState().isBound() || sessionContext.getSessionState().equals(SessionState.OPEN);
}
@Override
protected void finalize() throws Throwable {
close();
}
private void fireAcceptDeliverSm(DeliverSm deliverSm) throws ProcessRequestException {
if (messageReceiverListener != null) {
messageReceiverListener.onAcceptDeliverSm(deliverSm);
} else {
logger.warn("Receive deliver_sm but MessageReceiverListener is null. Short message = " + new String(deliverSm.getShortMessage()));
}
}
private void fireAcceptAlertNotification(AlertNotification alertNotification) {
if (messageReceiverListener != null) {
messageReceiverListener.onAcceptAlertNotification(alertNotification);
} else {
logger.warn("Receive alert_notification but MessageReceiverListener is null");
}
}
private class ResponseHandlerImpl implements ResponseHandler {
public void processDeliverSm(DeliverSm deliverSm) throws ProcessRequestException {
fireAcceptDeliverSm(deliverSm);
}
public DataSmResult processDataSm(DataSm dataSm)
throws ProcessRequestException {
return fireAcceptDataSm(dataSm);
}
public void processAlertNotification(AlertNotification alertNotification) {
fireAcceptAlertNotification(alertNotification);
}
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 PendingResponse<Command> removeSentItem(int sequenceNumber) {
return removePendingResponse(sequenceNumber);
}
public void notifyUnbonded() {
sessionContext.unbound();
}
public void sendDeliverSmResp(int sequenceNumber) throws IOException {
pduSender().sendDeliverSmResp(out, sequenceNumber);
logger.debug("deliver_sm_resp with seq_number " + sequenceNumber + " has been sent");
}
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);
}
}
/**
* Worker to read the PDU.
*
* @author uudashr
*
*/
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);
/*
* When the processing PDU is need user interaction via event,
* the code on event might take non-short time, so we need to
* process it concurrently.
*/
PDUProcessTask task = new PDUProcessTask(pduHeader, pdu,
sessionContext.getStateProcessor(), responseHandler,
sessionContext, 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)) {
logger.debug("Sending enquire link notify");
synchronized (sendingEnquireLink) {
sendingEnquireLink.notify();
}
} else {
logger.debug("Not sending enquire link notify");
}
}
}
/**
* Session state listener for internal class use.
*
* @author uudashr
*
*/
private class BoundSessionStateListener implements SessionStateListener {
public void onStateChange(SessionState newState, SessionState oldState,
Object source) {
/*
* We need to set SO_TIMEOUT to sessionTimer so when timeout occur,
* a SocketTimeoutException will be raised. When Exception raised we
* can send an enquireLinkCommand.
*/
if (newState.isBound()) {
try {
conn.setSoTimeout(getEnquireLinkTimer());
} catch (IOException e) {
logger.error("Failed setting so_timeout for session timer", e);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -