Getting java.util.UnknownFormatConversionException: while passing %! characters to createTimer method of javax.ejb.TimerService

Solution Verified - Updated

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.format replacement , 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

This content is not included.BZ1298521 - UnknownFormatConversionException is thrown if a customer TimerInfoObject contains illegal format characters as toString() output

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);
    }
    
}
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.