You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2011/04/21 23:54:58 UTC
svn commit: r1095826 - in /camel/trunk/components/camel-smpp/src:
main/java/org/apache/camel/component/smpp/
test/java/org/apache/camel/component/smpp/
Author: cmueller
Date: Thu Apr 21 21:54:58 2011
New Revision: 1095826
URL: http://svn.apache.org/viewvc?rev=1095826&view=rev
Log:
CAMEL-3853: SMPP connector lazySessionCreation
Added:
camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppProducerLazySessionCreationTest.java
Modified:
camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConfiguration.java
camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppProducer.java
camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppConfigurationTest.java
Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConfiguration.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConfiguration.java?rev=1095826&r1=1095825&r2=1095826&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConfiguration.java (original)
+++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConfiguration.java Thu Apr 21 21:54:58 2011
@@ -57,6 +57,7 @@ public class SmppConfiguration implement
private boolean usingSSL;
private long initialReconnectDelay = 5000;
private long reconnectDelay = 5000;
+ private boolean lazySessionCreation;
/**
* A POJO which contains all necessary configuration parameters for the SMPP connection
@@ -279,6 +280,14 @@ public class SmppConfiguration implement
public void setReconnectDelay(long reconnectDelay) {
this.reconnectDelay = reconnectDelay;
}
+
+ public boolean isLazySessionCreation() {
+ return lazySessionCreation;
+ }
+
+ public void setLazySessionCreation(boolean lazySessionCreation) {
+ this.lazySessionCreation = lazySessionCreation;
+ }
@Override
public String toString() {
@@ -307,6 +316,7 @@ public class SmppConfiguration implement
+ ", numberingPlanIndicator=" + numberingPlanIndicator
+ ", initialReconnectDelay=" + initialReconnectDelay
+ ", reconnectDelay=" + reconnectDelay
+ + ", lazySessionCreation=" + lazySessionCreation
+ "]";
}
}
Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppProducer.java?rev=1095826&r1=1095825&r2=1095826&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppProducer.java (original)
+++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppProducer.java Thu Apr 21 21:54:58 2011
@@ -44,8 +44,6 @@ import org.slf4j.LoggerFactory;
/**
* An implementation of @{link Producer} which use the SMPP protocol
*
- * @version
- * @author muellerc
*/
public class SmppProducer extends DefaultProducer {
@@ -54,7 +52,7 @@ public class SmppProducer extends Defaul
private SmppConfiguration configuration;
private SMPPSession session;
private SessionStateListener sessionStateListener;
- private final ReentrantLock reconnectLock = new ReentrantLock();
+ private final ReentrantLock connectLock = new ReentrantLock();
public SmppProducer(SmppEndpoint endpoint, SmppConfiguration config) {
super(endpoint);
@@ -72,15 +70,22 @@ public class SmppProducer extends Defaul
@Override
protected void doStart() throws Exception {
- LOG.debug("Connecting to: " + getEndpoint().getConnectionString() + "...");
-
super.doStart();
- session = createSession();
-
- LOG.info("Connected to: " + getEndpoint().getConnectionString());
+
+ if (!getConfiguration().isLazySessionCreation()) {
+ if (connectLock.tryLock()) {
+ try {
+ session = createSession();
+ } finally {
+ connectLock.unlock();
+ }
+ }
+ }
}
private SMPPSession createSession() throws IOException {
+ LOG.debug("Connecting to: " + getEndpoint().getConnectionString() + "...");
+
SMPPSession session = createSMPPSession();
session.setEnquireLinkTimer(this.configuration.getEnquireLinkTimer());
session.setTransactionTimer(this.configuration.getTransactionTimer());
@@ -97,6 +102,8 @@ public class SmppProducer extends Defaul
NumberingPlanIndicator.valueOf(configuration.getNumberingPlanIndicator()),
""));
+ LOG.info("Connected to: " + getEndpoint().getConnectionString());
+
return session;
}
@@ -115,6 +122,20 @@ public class SmppProducer extends Defaul
}
public void process(Exchange exchange) throws Exception {
+ if (session == null) {
+ if (getConfiguration().isLazySessionCreation()) {
+ if (connectLock.tryLock()) {
+ try {
+ if (session == null) {
+ session = createSession();
+ }
+ } finally {
+ connectLock.unlock();
+ }
+ }
+ }
+ }
+
if (LOG.isDebugEnabled()) {
LOG.debug("Sending a short message for exchange id '"
+ exchange.getExchangeId() + "'...");
@@ -193,7 +214,7 @@ public class SmppProducer extends Defaul
}
private void reconnect(final long initialReconnectDelay) {
- if (reconnectLock.tryLock()) {
+ if (connectLock.tryLock()) {
try {
Runnable r = new Runnable() {
public void run() {
@@ -233,7 +254,7 @@ public class SmppProducer extends Defaul
} catch (InterruptedException e) {
// noop
} finally {
- reconnectLock.unlock();
+ connectLock.unlock();
}
}
}
Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppConfigurationTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppConfigurationTest.java?rev=1095826&r1=1095825&r2=1095826&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppConfigurationTest.java (original)
+++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppConfigurationTest.java Thu Apr 21 21:54:58 2011
@@ -168,7 +168,8 @@ public class SmppConfigurationTest {
+ "typeOfNumber=0, "
+ "numberingPlanIndicator=0, "
+ "initialReconnectDelay=5000, "
- + "reconnectDelay=5000]";
+ + "reconnectDelay=5000, "
+ + "lazySessionCreation=false]";
assertEquals(expected, configuration.toString());
}
Added: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppProducerLazySessionCreationTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppProducerLazySessionCreationTest.java?rev=1095826&view=auto
==============================================================================
--- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppProducerLazySessionCreationTest.java (added)
+++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppProducerLazySessionCreationTest.java Thu Apr 21 21:54:58 2011
@@ -0,0 +1,166 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.camel.component.smpp;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
+import org.jsmpp.bean.Alphabet;
+import org.jsmpp.bean.BindType;
+import org.jsmpp.bean.ESMClass;
+import org.jsmpp.bean.GeneralDataCoding;
+import org.jsmpp.bean.MessageClass;
+import org.jsmpp.bean.NumberingPlanIndicator;
+import org.jsmpp.bean.RegisteredDelivery;
+import org.jsmpp.bean.SMSCDeliveryReceipt;
+import org.jsmpp.bean.SubmitSm;
+import org.jsmpp.bean.TypeOfNumber;
+import org.jsmpp.session.BindParameter;
+import org.jsmpp.session.SMPPSession;
+import org.jsmpp.session.SessionStateListener;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.easymock.EasyMock.aryEq;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.classextension.EasyMock.createMock;
+import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.classextension.EasyMock.verify;
+
+/**
+ * JUnit test class for <code>org.apache.camel.component.smpp.SmppProducer</code>
+ *
+ * @version
+ * @author muellerc
+ */
+public class SmppProducerLazySessionCreationTest {
+
+ private SmppProducer producer;
+ private SmppConfiguration configuration;
+ private SmppEndpoint endpoint;
+ private SMPPSession session;
+
+ @Before
+ public void setUp() {
+ configuration = new SmppConfiguration();
+ configuration.setLazySessionCreation(true);
+ endpoint = createMock(SmppEndpoint.class);
+ session = createMock(SMPPSession.class);
+
+ producer = new SmppProducer(endpoint, configuration) {
+ SMPPSession createSMPPSession() {
+ return session;
+ }
+ };
+ }
+
+ private void submitSmExpectations(Exchange exchange, SmppBinding binding, SubmitSm submitSm) throws Exception {
+ expect(submitSm.getServiceType()).andReturn("CMT");
+ expect(submitSm.getSourceAddrTon()).andReturn(TypeOfNumber.UNKNOWN.value());
+ expect(submitSm.getSourceAddrNpi()).andReturn(NumberingPlanIndicator.UNKNOWN.value());
+ expect(submitSm.getSourceAddr()).andReturn("1616");
+ expect(submitSm.getDestAddrTon()).andReturn(TypeOfNumber.UNKNOWN.value());
+ expect(submitSm.getDestAddrNpi()).andReturn(NumberingPlanIndicator.UNKNOWN.value());
+ expect(submitSm.getDestAddress()).andReturn("1717");
+ expect(submitSm.getProtocolId()).andReturn((byte) 0);
+ expect(submitSm.getPriorityFlag()).andReturn((byte) 1);
+ expect(submitSm.getScheduleDeliveryTime()).andReturn("090830230627004+");
+ expect(submitSm.getValidityPeriod()).andReturn("090831232000004+");
+ expect(submitSm.getRegisteredDelivery())
+ .andReturn(SMSCDeliveryReceipt.SUCCESS_FAILURE.value());
+ expect(submitSm.getReplaceIfPresent()).andReturn((byte) 0);
+ expect(submitSm.getDataCoding()).andReturn((byte) 0);
+ expect(submitSm.getShortMessage()).andReturn("Hello SMPP world!".getBytes("ISO-8859-1"));
+ }
+
+ @Test
+ public void doStartShouldNotCreateTheSmppSession() throws Exception {
+ expect(endpoint.getConnectionString()).andReturn("smpp://smppclient@localhost:2775");
+
+ replay(endpoint, session);
+
+ producer.doStart();
+
+ verify(endpoint, session);
+ }
+
+ @Test
+ public void processShouldCreateTheSmppSession() throws Exception {
+ expect(endpoint.getConnectionString())
+ .andReturn("smpp://smppclient@localhost:2775")
+ .times(2);
+ session.setEnquireLinkTimer(5000); //expectation
+ session.setTransactionTimer(10000); //expectation
+ session.addSessionStateListener(isA(SessionStateListener.class));
+ expect(session.connectAndBind(
+ "localhost",
+ new Integer(2775),
+ new BindParameter(
+ BindType.BIND_TX,
+ "smppclient",
+ "password",
+ "cp",
+ TypeOfNumber.UNKNOWN,
+ NumberingPlanIndicator.UNKNOWN,
+ ""))).andReturn("1");
+ expect(endpoint.getConnectionString()).andReturn("smpp://smppclient@localhost:2775");
+ SmppBinding binding = createMock(SmppBinding.class);
+ Exchange exchange = createMock(Exchange.class);
+ Message message = createMock(Message.class);
+ SubmitSm submitSm = createMock(SubmitSm.class);
+ expect(exchange.getExchangeId()).andReturn("ID-muellerc-macbookpro/3690-1214458315718/2-0");
+ expect(endpoint.getBinding()).andReturn(binding);
+ expect(binding.createSubmitSm(exchange)).andReturn(submitSm);
+ submitSmExpectations(exchange, binding, submitSm);
+ expect(session.submitShortMessage(
+ eq("CMT"),
+ eq(TypeOfNumber.UNKNOWN),
+ eq(NumberingPlanIndicator.UNKNOWN),
+ eq("1616"),
+ eq(TypeOfNumber.UNKNOWN),
+ eq(NumberingPlanIndicator.UNKNOWN),
+ eq("1717"),
+ isA(ESMClass.class),
+ eq((byte) 0),
+ eq((byte) 1),
+ eq("090830230627004+"),
+ eq("090831232000004+"),
+ eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+ eq((byte) 0),
+ eq(new GeneralDataCoding(
+ false,
+ true,
+ MessageClass.CLASS1,
+ Alphabet.ALPHA_DEFAULT)),
+ eq((byte) 0),
+ aryEq("Hello SMPP world!".getBytes("ISO-8859-1"))))
+ .andReturn("1");
+ expect(exchange.getPattern()).andReturn(ExchangePattern.InOnly);
+ expect(exchange.getIn()).andReturn(message);
+ message.setHeader(SmppBinding.ID, "1"); // expectation without return value
+ expect(exchange.getExchangeId()).andReturn("ID-muellerc-macbookpro/3690-1214458315718/2-0");
+
+ replay(session, endpoint, binding, exchange, message, submitSm);
+
+ producer.doStart();
+ producer.process(exchange);
+
+ verify(session, endpoint, binding, exchange, message, submitSm);
+ }
+}
\ No newline at end of file