Getting java.util.UnknownFormatConversionException: while passing %! characters to createTimer method of javax.ejb.TimerService
Environment
- Red Hat JBoss Enterprise Application Platform (EAP)
- 6.4.5
Issue
- A timer execution can fail with exception if the Timers Info object (which is custom code) contains characters which are relevant for
String.formatreplacement , below is the exception .
15:45:58,707 WARN [com.arjuna.ats.jta] (EJB default - 1) ARJUNA016029: SynchronizationImple.afterCompletion - failed for org.jboss.as.ejb3.timerservice.TimerServiceImpl$TimerCreationTransactionSynchronization@763b3b40 with exception: java.util.UnknownFormatConversionException: Conversion = '!'
at java.util.Formatter.checkText(Formatter.java:2547) [rt.jar:1.7.0_10]
at java.util.Formatter.parse(Formatter.java:2533) [rt.jar:1.7.0_10]
at java.util.Formatter.format(Formatter.java:2469) [rt.jar:1.7.0_10]
at java.util.Formatter.format(Formatter.java:2423) [rt.jar:1.7.0_10]
at java.lang.String.format(String.java:2797) [rt.jar:1.7.0_10]
at org.jboss.as.ejb3.timerservice.TimerImpl.toString(TimerImpl.java:568) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at java.lang.String.valueOf(String.java:2854) [rt.jar:1.7.0_10]
at java.lang.StringBuilder.append(StringBuilder.java:128) [rt.jar:1.7.0_10]
at org.jboss.as.ejb3.timerservice.TimerServiceImpl$TimerCreationTransactionSynchronization.afterCompletion(TimerServiceImpl.java:1106) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.afterCompletion(SynchronizationImple.java:96)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.afterCompletion(TwoPhaseCoordinator.java:402)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:103)
at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1189)
at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:91) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:282) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:330) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:242) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ejb3.remote.EJBRemoteTransactionPropagatingInterceptor.processInvocation(EJBRemoteTransactionPropagatingInterceptor.java:79) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:43) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) [jboss-as-ee-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:55) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45) [jboss-as-ee-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.2.Final-redhat-1.jar:1.1.2.Final-redhat-1]
at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:185) [jboss-as-ee-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.as.ejb3.remote.protocol.versionone.MethodInvocationMessageHandler.invokeMethod(MethodInvocationMessageHandler.java:332) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.as.ejb3.remote.protocol.versionone.MethodInvocationMessageHandler.access$100(MethodInvocationMessageHandler.java:69) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at org.jboss.as.ejb3.remote.protocol.versionone.MethodInvocationMessageHandler$1.run(MethodInvocationMessageHandler.java:202) [jboss-as-ejb3-7.5.5.Final-redhat-3.jar:7.5.5.Final-redhat-3]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [rt.jar:1.7.0_10]
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) [rt.jar:1.7.0_10]
at java.util.concurrent.FutureTask.run(FutureTask.java:166) [rt.jar:1.7.0_10]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [rt.jar:1.7.0_10]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [rt.jar:1.7.0_10]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_10]
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Resolution
Apply EAP 6.4 CP14 or later when available
Root Cause
Diagnostic Steps
-
Below are the simple test code to replicate the issue.
- TestTimer.java
package com.redhat;
import javax.ejb.Remote;
@Remote
public interface TestTimer {
void scheduleTimer(long millis);
}
- TestTimerBean.java
package com.redhat;
import java.util.Date;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.Stateless;
import java.io.Serializable;
@Stateless
public class TestTimerBean implements TestTimer {
public TestTimerBean() {
}
@Resource
SessionContext ctx;
@Override
public void scheduleTimer(long millis) {
Serializable info = "This is info passed to a createTimer() invocation with 'bad' characters: %!";
ctx.getTimerService().createTimer(new Date().getTime() +millis, info);
}
@Timeout
public void timeoutHandler(Timer timer)
{
System.out.println("-------");
System.out.println("Received Timer Event :" + timer.getInfo());
System.out.println("--------");
timer.cancel();
}
}
- TestClient.java // this is a standalone remote client .
package com.redhat;
import java.util.*;
import javax.naming.*;
import org.jboss.ejb.client.EJBClientConfiguration;
import org.jboss.ejb.client.PropertiesBasedEJBClientConfiguration;
import org.jboss.ejb.client.ContextSelector;
import org.jboss.ejb.client.EJBClientContext;
import org.jboss.ejb.client.remoting.ConfigBasedEJBClientContextSelector;
public class TestClient {
public TestClient() {
}
public static void main(String[] args) throws Exception
{
Properties p = new Properties();
p.put("remote.connections", "node1");
p.put("remote.connection.node1.port", "4447"); // the default remoting port, replace if necessary
p.put("remote.connection.node1.host", "localhost"); // the host, replace if necessary
p.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false"); // the server defaults to SSL_ENABLED=false
EJBClientConfiguration cc = new PropertiesBasedEJBClientConfiguration(p);
ContextSelector<EJBClientContext> selector = new ConfigBasedEJBClientContextSelector(cc);
EJBClientContext.setSelector(selector);
Properties contextProperties = new Properties();
contextProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
Context context = new InitialContext(contextProperties);
com.redhat.TestTimer timer = (com.redhat.TestTimer) context.lookup("ejb:/test_ejb/TestTimerBean!com.redhat.TestTimer");
System.out.println("***********timer = "+ timer);
System.out.println("**********Calling to timer.scheduleTimer(5000) *************");
timer.scheduleTimer(30000);
}
}
SBR
Components
Category
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.