[Asterisk-java-users] Originate failure two calls in a row
Brought to you by:
srt
From: Tony M. <to...@am...> - 2006-06-09 16:15:13
|
This is perhaps an asterisk question instead of an asterisk-java, but maybe someone here will know the answer. If I make two calls in a row to the same ZAP extension the second call fails with a "Channel Unavailable Exception". If I add in a delay of half a second between calls then the call will succeed. If the extension is a SIP extension then there is no problem. Below is my test code (ext 100 is my ZAP phone and 101 my SIP phone): package com.pbxworkbench; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import junit.framework.TestCase; import org.asteriskjava.live.AsteriskChannel; import org.asteriskjava.live.ChannelState; import org.asteriskjava.live.DefaultAsteriskServer; import org.asteriskjava.live.LiveException; import org.asteriskjava.live.OriginateCallback; import org.asteriskjava.manager.ManagerConnection; import org.asteriskjava.manager.ManagerConnectionFactory; public class AsteriskServerTest extends TestCase { private DefaultAsteriskServer server; protected void setUp() throws Exception { super.setUp(); ManagerConnectionFactory factory = new ManagerConnectionFactory( "192.168.2.150", "username", "password"); ManagerConnection connection = factory.createManagerConnection(); server = new DefaultAsteriskServer(connection); server.initialize(); } protected void tearDown() throws Exception { super.tearDown(); } /* * Test method for * */ public void testOriginate () throws Exception { MyOriginateCallback callback = new MyOriginateCallback(); server.originateToExtensionAsync( "local/100@default", "default", "101", 1, 30000, callback); callback.waitForCallEnd(); Thread.sleep(200); server.originateToExtensionAsync( "local/100@default", "default", "101", 1, 30000, callback); callback.waitForCallEnd(); } private class MyOriginateCallback implements OriginateCallback, PropertyChangeListener { Semaphore semaphore = new Semaphore(1); public MyOriginateCallback() { semaphore.drainPermits(); } public void waitForCallEnd() throws Exception { semaphore.tryAcquire(30, TimeUnit.SECONDS); semaphore.drainPermits(); } public void onSuccess(AsteriskChannel channel) { channel.addPropertyChangeListener(this); } public void onCallEnd() { System.out.println("call ended"); semaphore.release(); } public void onNoAnswer(AsteriskChannel channel) { System.out.println("no answer"); onCallEnd(); } public void onBusy(AsteriskChannel channel) { System.out.println("busy"); onCallEnd(); } public void onFailure(LiveException cause) { System.out.println("failure " + cause); onCallEnd(); } public void propertyChange(PropertyChangeEvent evt) { System.out.println(evt.getPropertyName() + "=" + evt.getNewValue()); if (ChannelState.HUNGUP.equals(evt.getNewValue())) { onCallEnd(); } } } } |