Verify user’s mobile numbers for them

Time for a TIL post – mainly so I find this information later!

I’ve been ensuring that 2 factor authentication is up and running for the org that I am currently working in and wanted to make sure that the SMS method was the primary second factor, rather than email. However, there’s no way to force this to happen without the users having verified mobile numbers on their profiles. Getting everyone to enter and verify their numbers was going to be a pain.

Continue Reading…

Governor Limits and @testSetup

Whenever I teach courses that cover testing there’s always something that niggles me and my most recent Dev 450 was no different.

My problem is with the implied behaviour of the @testSetup annotation in test classes. In particular I always worry about how it interacts with governor limits. So I thought I had better get to the bottom of it in the vain hope that I’ll get a better night’s sleep.

Continue Reading…

The Imminent Danger Of Us All Losing

I know that this post isn’t my usual fare but I feel that after the week that has passed I should write something, if only to record my own thoughts. Just in case you’re wondering what I’m referring to it is of course the recent referendum in the UK about it’s membership to the European Union.

Continue Reading…

London’s Calling… Developers

As hopefully you’re all aware there is a little event happening in London next Friday called London’s Calling It is our take on the similar community led events happening across the US and is by all accounts set to be the best event in the European Salesforce calendar – sorry World Tour 😉

Much has been written about the event by sponsors, speakers and other members of the community but I wanted to write something myself. In particular about the dev content of the event.

Continue Reading…

Asynchronous Apex and Transaction Boundaries

When asked the question: “Just when does asynchronous apex actually run?” Most people will answer by saying something along the lines of “when the system has available resources”. And they’re correct, or at least partially correct as there is one other important thing to remember; it won’t run until the successful completion of the current transaction. But is this always the case?

Why is this important?

Let’s take a simple and common example; we need to call an external webservice to keep some data in sync as it changes within Salesforce. Since we can’t make a callout from within a trigger the accepted pattern is to call a future method (considered to be asynchronous apex) with the callout=true flag set. This creates a new transaction for us that isn’t part of the trigger and we’re free to call our external system.

This is all good so far. Now let’s imagine that for some reason our trigger, after calling this future method throws some kind of unhandled exception. This means that the whole transaction is going to be rolled back with no changes being committed to Salesforce. If our future method executed as soon as we called it we would now be in a situation where the external system is out of sync with Salesforce. Hence why the platform waits for the current transaction to finish successfully before letting it be run.

So why are you bringing this up?

Let’s be honest I’m not going to be bringing this up purely for the educational purposes of the masses. I’m bringing it up because I believe that I have found an annomoly with this expected behaviour. Let’s look at the following code, a trigger and a helper class;

Pretty straight forward stuff. So what am I expecting to see if I run the following execute annoymous code;

Well, we’re inserting 300 records and we know that the platform batches calls to triggers up into 200s so we should come through our trigger twice and as such call two future methods. We should be able to see that in our debug logs. Also we remember that both executions of the trigger are in the same transaction (the debug of the count shows us that too) therefore both of our future methods should run after the trigger transaction has completed. And if we look at the timings for the trigger and the future methods we can see that this is indeed the case.

1-GoodSummary 1-GoodTrigger 1-GoodFutureA 1-GoodFutureBGet to the point!

So far all I have done is to describe what should happen and then demonstrate that it does happen; not the most interesting of post. Let’s alter this example slightly and see what happens. Instead of inserting the data using an execute anonymous block let’s use the data loader. I have loaded a simple CSV file with 300 accounts in it via the Data Import Wizard. We’re loading the same data so we’d expect to see the same results in the debug log.

If we check the execution of the trigger itself we can see that we have, as expected, passed through it twice and within the same transaction. So that’s good.


However a closer look at the times of execution highlight a problem. We can see that one of the future methods is being executed before the trigger transaction has completed. This is not how we expect the platform to behave.

2-BadFutureA 2-BadFutureB

Is this really such a problem?

Yes! Yes it is. Let’s change our code to throw an exception in the second pass of the trigger. And then rerun our two tests.


In the first test, the execute anonymous one, we see that the future methods never run. This is good, remember our sync example before? If there’s an unhandled exception and the transaction gets rolled back then we don’t want to communicate with the outside world.

The second test, loading via the data import wizard, doesn’t look so good.


We can see that one of the future methods has been executed despite the fact that in reality the whole transaction should have been rolled back. So, whilst no records will have been inserted our future method is still called. It’s interesting to note that the second future method isn’t called, the one that is in the same trigger execution as the exception.

What can we do about it?

To be honest I don’t think there’s a great deal we can do about it other than be aware right now. I have seen this behaviour with queueable jobs too, so I am presuming it affects all asynchronous apex. My personal next step is to raise the issue with Salesforce and get some clarity around it and whether it’s a bug.

Streaming Lightning: Sometimes Electricity and Water Do Mix

It’s all about Lightning right now and rightly so it’s the future; a good looking, exciting future. So what have I been doing with all of this then? I always find new technology is best learnt when you have a real use case and I have been lucky enough to have one to work on over the past few weeks. Not only that but it’s one that has lead me to have to do something that I couldn’t find documented anywhere!

Continue Reading…

An Erratum From The Salesforce1 World Tour In Paris

Last week at the Paris World Tour I was asked a question about the getContent() and getContentAsPDF() methods on the PageReference class. I was rushed and gave the best answer that I could at the time. However, as the two gentlemen left me I had a nagging feeling that I was missing a piece of information. This morning I have finally found the time to come back to the question and get the complete answer. But first the question;

Why do getContent() and getContentAsPDF() throw an exception when called from a future method, despite the documentation saying that you can do this?

Continue Reading…

Deprecated classes visible in Process Builder

Lightning Process Builder has been around a while now and I think that we’re all starting to get use to it and see it’s potential; it’s massive.

There are of course a few teething problems, as you would expect, and they have mostly been documented but I just wanted to add to the list. Not as a complaint, more as a warning.

Continue Reading…

Is this thing on?

One of the biggest challenges that I face when writing my code is making sure certain things are enabled in an Org. For example some people still don’t have Chatter enabled so trying to post to a feed is going to cause my code to blow up. Each time I come across something like this I always have to go hunting to find the best way to figure out if something is on or not. This trawling of the internet finally got the better of me the other day and I have started a Feature class.

Continue Reading…

Missing Posts

A few days ago I noticed that this blog wasn’t looking like it should.

In fact it turns out quite a lot of it has disappeared. So firstly apologies if you’re getting here through search results – most of the content behind those permalinks is no more. And that which is left appears to have completely been messed up.

I am currently working through getting all of this information back but it’s not going to be an overnight return to it’s former glory. However, new posts should continue to be added and more importantly I will turn that backup feature back on!

Older Posts »